我目前正在运行可在Windows和Android上运行的Unity项目。我基本上是使用Unity WebCamTexture类来访问连接的相机,然后将图像发送到与opencv一起进行进一步处理的C ++代码(Windows上为dll,在Android上为dll)。
尽管在Windows上一切正常,但完全相同的代码却导致Android上的内存泄漏(RAM利用率在每一帧上都在不断增加)。我一直在寻找几种与我的C ++代码共享图像的可能解决方案。每种解决方案在Windows上都可以正常工作,并且会导致Android上的内存泄漏(图像处理也可以在Android上运行,只是泄漏是个问题)
这是一个工作代码示例:
C#
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);
C ++
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);
}
当我尝试对C ++部分中的“纹理”变量进行任何更改(例如从4个通道更改为3个通道)时,便开始出现内存泄漏。
由于我没有C ++的经验,因此在此类问题上运行我并不感到惊讶,但是最让我困惑的是它在Windows上运行得很好。如果有任何建议可以指引我迈向新的方向,我将非常高兴。谢谢!
更新:
有关环境的更多详细信息:
统一版本:2018.2.8f1
经过测试的NDK版本:13b和16b
经过测试的电话:1台Samsung S9、2台Note 8
这些其他解决方案也已经过测试,并得出相同的结果:
此外,我还尝试在C ++上创建指针,让C#使用该指针,最后让C ++清理内存。这导致仍然相同的泄漏。此时,我想知道这是否是设置问题,因此我将创建新项目并稍后更新结果
...我现在已经创建了一个新的Unity项目,该项目仅运行上面的代码+ webcamtexture。仍然是完全相同的行为。在这一点上,我怀疑它是针对我的C ++代码的Android Studio项目。
...我现在已经创建了一个Visual Studio项目来创建.so文件。即使项目几乎是空白的,内存仍在泄漏。
答案 0 :(得分:0)
最后,这是Android Studio项目的问题。我在第三台计算机上创建了一个新项目。我复制了完全相同的代码。现在一切正常,没有泄漏。谢谢所有帮助我的人! :)