我目前正在开发一个在 Windows 和 Android 上运行的 Unity 项目。我基本上是使用 Unity WebCamTexture 类来访问连接的相机,然后将图像发送到我的 C++ 代码(Windows 上的 dll,Android 上的 dll),它与 opencv 一起工作以进行进一步处理。
虽然在 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 个 channel 更改为 3 个)时,内存泄漏就开始了。
由于我没有使用 C++ 的经验,因此遇到此类问题我并不感到惊讶,但最让我困惑的是它在 Windows 上运行得非常好。如果有任何建议将我引向新的方向,我将很高兴。谢谢!
更新:
环境的更多细节:
统一版本:2018.2.8f1
测试的 NDK 版本:13b 和 16b
测试手机:1x Samsung S9, 2x Note 8
这些额外的解决方案也经过测试并给出相同的结果:
此外,我还尝试在 C++ 上创建指针,让 C# 使用该指针,最后让 C++ 清理内存。这仍然导致相同的泄漏。此时我想知道这是否是设置问题,所以我将创建新项目并稍后更新结果
...我现在创建了一个新的 Unity 项目,它只运行上面的代码 + 网络摄像头纹理。仍然是完全相同的行为。在这一点上,我怀疑它是我的 C++ 代码的 Android Studio 项目。
...我现在已经创建了一个 Visual Studio 项目来创建 .so 文件。即使是一个几乎空白的项目,内存仍然在泄漏。
最佳答案
最后还是Android Studio项目的问题。我在第三台计算机上创建了一个新项目。我复制了完全相同的代码。现在一切正常,没有泄漏。感谢所有帮助过我的人! :)
关于c# - Unity - Android,C# - C++ 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52829067/