Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity-Android,C#-C++;内存泄漏_C#_Android_C++_Unity3d_Memory Leaks - Fatal编程技术网

Unity-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

我目前正在从事一个在Windows和Android上运行的Unity项目。基本上我使用Unity WebCAMTrimeC类访问连接的相机,然后将图像发送到我的C++代码(Windows上的DLL,Android上的),这与OpenCV一起工作以进行进一步的处理。p> 虽然在Windows上一切正常,但完全相同的代码在Android上导致内存泄漏(每一帧的RAM使用量不断增加)。我已经找到了几种可能的解决方案,如何与我的C++代码共享图像。每个解决方案在Windows上都能正常工作,并在Android上导致内存泄漏(图像处理也在Android上工作,只是泄漏是个问题)

下面是一个工作代码示例:

C#

C++

内存泄漏一开始我就试图对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);

    }