将C#dll与本机C++;

将C#dll与本机C++;,c#,c++,performance,memory-management,C#,C++,Performance,Memory Management,我想为游戏编写一个地图编辑器。我打算用C++和OpenGL来做。然而,游戏是用Unity编写的,所以地图加载/保存代码是用C#编写的 自从我在C#WinForms上从事类似的项目以来,我已经编写了一个C#dll,它可以管理一些游戏生成的文件,包括地图文件。我现在计划用它来加载/保存主C++程序中的MMAP文件。 C#dll做什么?(tl;dr位于第二行下方) 它有一种将区域加载到内存中的方法,由1024个内存流组成的数组组成,每个内存流都包含一个压缩的块(每个块大约2kB到20kB,大部分在5

我想为游戏编写一个地图编辑器。我打算用C++和OpenGL来做。然而,游戏是用Unity编写的,所以地图加载/保存代码是用C#编写的

自从我在C#WinForms上从事类似的项目以来,我已经编写了一个C#dll,它可以管理一些游戏生成的文件,包括地图文件。我现在计划用它来加载/保存主C++程序中的MMAP文件。 C#dll做什么?(tl;dr位于第二行下方)


它有一种将
区域
加载到内存中的方法,由1024个
内存流
组成的数组组成,每个内存流都包含一个压缩的
(每个块大约2kB到20kB,大部分在5kB左右)。它还有一种从
区域
请求
块的方法。它解压缩流并将其读入
对象(这是一个复杂的对象,包含数组、列表、字典和其他自定义类,它们本身具有复杂性)

我也有反向的方法——将
对象打包到
内存流
,压缩它并将其添加到
区域
对象,该对象有一个方法可以将其保存到磁盘上的文件中

未压缩的区块数据大小从15kB到120kB,这只是原始数据,不包括任何与对象创建相关的开销

在主程序中,我可能会立即将数千个
加载到内存中,其中一些可能会短暂地缓存一些数据并被卸载(可能会生成远处的地形),另一些则完全按照用户的意愿修改它们


tl;dr我可以在一个托管的c#dll中加载数百兆字节到超过千兆字节的数据。数据不会被大量访问,只有在用户改变地形时才会被更改,这在CPU规模的时间方面并不常见。但是当用户移动地图时,一次可能会请求加载/卸载许多块

假设所有这些都在托管C语言的DLL中,我的问题是,内存管理会发生什么,以及它会如何影响本地C++程序的性能?我可以在多大程度上控制

区域
/
对象的内存分配?这对执行速度有何影响


是不是可以忽略或忽略和/或处理的问题,或者它会提出足够的问题来证明用更精细的内存管理方案来重写本地C++中的DLL吗?< /P>如果DLL的C版本有一个您满意的接口,那么我猜想您的C++版本将有一个类似的接口。如果是这样的话,为什么要猜测呢?只要使用C#lib使它工作就行了,因为它已经完成了。如果结果是太慢,那么饥饿的情况下最坏的情况是,你需要写C++ LIB,但是至少你的接口已经被定义,所以你不需要重新设计它,而其他已经熟悉C语言的人能够快速理解你的C++ LIB。如果它能工作,那么你就节省了很多精力。谁在分配内存?尽管老实说,无论是哪种方式,你都会很好,只希望得到代码< >不安全的(关键字)或<代码>不安全< /COD>(),如果DLL的C版本有一个你满意的接口,那么我猜你的C++版本会有一个类似的接口。如果是这样的话,为什么要猜测呢?只要使用C#lib使它工作就行了,因为它已经完成了。如果结果是太慢,那么饥饿的情况下最坏的情况是,你需要写C++ LIB,但是至少你的接口已经被定义,所以你不需要重新设计它,而其他已经熟悉C语言的人能够快速理解你的C++ LIB。如果它能工作,那么你就节省了很多精力。谁在分配内存?尽管说实话,无论哪种方式,你都会很好-只是希望熟悉

不安全
(关键字)或
不安全
(),