C#->C++之间的只读共享内存

x8diyxa7  于 2023-05-08  发布在  C#
关注(0)|答案(1)|浏览(179)

,我有C#代码,可以创建3D几何体,并将其发送到C++库进行渲染。此时,数据通过互操作传递,如下所示(我已经减少了传递的数组数量):

void LoadMeshData(Mesh meshData)
        {
            var verticesArraySize = meshData.Vertices.Length;
            unsafe
            {                
                fixed (float* vertices = meshData.Vertices)
                {
                    Interop.Data.MeshDataObject meshDataObject;
                    meshDataObject.vertexArraySize = verticesArraySize;
                    meshDataObject.vertexData = new IntPtr(vertices);
                    SceneInterop.AddMeshData(meshDataObject);
                }
            }

Interop.Data.MeshDataObject是一个POD结构体,与C端的类似结构体匹配。
fixed显然在这个调用之后超出了作用域,所以现在我将数组复制到C
中的一个结构中。这显然是一个巨大的内存浪费,所以理想情况下,我希望有一种方法来标记C#内存为永久“固定”-这是可行的吗?我只需要读取C++库中的数据,并且我确实需要在C#端保持它可用。有没有其他建议,我可以如何保存自己的复制?

cbjzeqam

cbjzeqam1#

我在这里回答我自己的问题,但它实际上只是上面的第一个评论,@shingo请随时把它作为一个答案,我会删除这一个。
您可以使用GCHandle来创建一个固定的句柄,但这会降低GC的效率。您可以要求C++代码分配内存并返回指向C#的指针
我使用了verticesHandle = GCHandle.Alloc(vertices, GCHandleType.Pinned),它可以很好地共享内存。以后当我高兴地允许删除我使用的内存

if (verticesHandle.IsAllocated)
    verticesHandle.Free();

相关问题