Unity-Android,C#-C++;内存泄漏
我目前正在从事一个在Windows和Android上运行的Unity项目。基本上我使用Unity WebCAMTrimeC类访问连接的相机,然后将图像发送到我的C++代码(Windows上的DLL,Android上的),这与OpenCV一起工作以进行进一步的处理。p> 虽然在Windows上一切正常,但完全相同的代码在Android上导致内存泄漏(每一帧的RAM使用量不断增加)。我已经找到了几种可能的解决方案,如何与我的C++代码共享图像。每个解决方案在Windows上都能正常工作,并在Android上导致内存泄漏(图像处理也在Android上工作,只是泄漏是个问题) 下面是一个工作代码示例: C# C++Unity-Android,C#-C++;内存泄漏,c#,android,c++,unity3d,memory-leaks,C#,Android,C++,Unity3d,Memory Leaks,我目前正在从事一个在Windows和Android上运行的Unity项目。基本上我使用Unity WebCAMTrimeC类访问连接的相机,然后将图像发送到我的C++代码(Windows上的DLL,Android上的),这与OpenCV一起工作以进行进一步的处理。p> 虽然在Windows上一切正常,但完全相同的代码在Android上导致内存泄漏(每一帧的RAM使用量不断增加)。我已经找到了几种可能的解决方案,如何与我的C++代码共享图像。每个解决方案在Windows上都能正常工作,并在Andr
内存泄漏一开始我就试图对C++部分中的“纹理”变量做任何更改(例如从4个通道改为3个)。p> <>因为我没有C++经验,在这些问题上我并不感到惊讶,但最让我困惑的是它在Windows上运行得非常好。我很乐意接受任何能为我指明新方向的建议。谢谢大家!
更新: 有关环境的更多详细信息: 统一版本:2018.2.8f1 经测试的NDK版本:13b和16b 测试手机:1部三星S9,2部Note 8 这些额外的解决方案也经过了测试,得到了相同的结果: <> P>此外,我还尝试在C++上创建指针,让C使用这个指针,最后让C++清除内存。这仍然导致同样的泄漏。在这一点上,我想知道这是否是一个设置问题,所以我将创建新的项目,并在以后更新结果 …我现在创建了一个新的Unity项目,它只运行上述代码+webcamtexture。还是一模一样的行为。在这一点上我怀疑它是我的C++代码的Android工作室项目。…我现在创建了一个Visual Studio项目来创建.so文件。内存仍在泄漏,即使项目几乎为空 最后,这是Android Studio项目的一个问题。我在第三台计算机上创建了一个新项目。我复制了完全相同的代码。现在一切正常,没有泄漏。谢谢所有帮助我的人!:)通过简单注释C++ C++代码> PravaReave<代码>函数中的代码,看看问题是C的还是C++的,看看是否还有MEM泄漏。如果有,则封送。FreeHGlobal可能无法释放内存。谢谢您的回答。当调用“CVTHORKE”或试图使用“TuttuReC4”变量的其他函数时,C++内存端发生内存泄漏。“cv::Mat textureC4(h、w、cv_8UC4、数据)”不会产生任何泄漏。您确定这是内存泄漏吗?我看到的其他可能的原因是:1。该程序只是弄脏了一些内存帧,但实际上并没有分配它们。res内存似乎在增长,但还可以,因为它会在其他应用程序需要时立即释放。2.碎片化可能是一个更大的问题,您可能必须用一些自定义库替换malloc。如果内存泄漏,内存使用将不断以相同的速度增长,直到应用程序崩溃。如果没有,它会一直增长到某个点,然后减慢甚至停止。那么你的情况如何?谢谢你的回答。不幸的是,它增长到崩溃。每帧向RAM添加几MB,这可能是一次又一次保存的图像。
Color32[] color = webcamTexture.GetPixels32();
byte[] data = Color32ArrayToByteArray(color);
IntPtr unmanagedArray = Marshal.AllocHGlobal(data.Length);
Marshal.Copy(data, 0, unmanagedArray, data.Length);
PrepareImage(unmanagedArray, camW, camH);
Marshal.FreeHGlobal(unmanagedArray);
void PrepareImage(unsigned char* data,int w, int h){
cv::Mat textureC4(h, w, CV_8UC4, data);
cv::Mat textureC3;
cv::cvtColor(textureC4,textureC3,cv::COLOR_RGBA2RGB);
}