Unity-Android,C#-C ++内存泄漏

时间:2018-10-16 06:21:34

标签: c# android c++ unity3d memory-leaks

我目前正在运行可在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

这些其他解决方案也已经过测试,并得出相同的结果:

Link 1

Link 2

此外,我还尝试在C ++上创建指针,让C#使用该指针,最后让C ++清理内存。这导致仍然相同的泄漏。此时,我想知道这是否是设置问题,因此我将创建新项目并稍后更新结果

...我现在已经创建了一个新的Unity项目,该项目仅运行上面的代码+ webcamtexture。仍然是完全相同的行为。在这一点上,我怀疑它是针对我的C ++代码的Android Studio项目。

...我现在已经创建了一个Visual Studio项目来创建.so文件。即使项目几乎是空白的,内存仍在泄漏。

1 个答案:

答案 0 :(得分:0)

最后,这是Android Studio项目的问题。我在第三台计算机上创建了一个新项目。我复制了完全相同的代码。现在一切正常,没有泄漏。谢谢所有帮助我的人! :)