Unity3D Texture2D.LoadRawTextureData导致大量内存泄漏?

时间:2018-01-20 23:22:48

标签: unity3d memory-leaks

在一个应用程序(Server)中,我正在捕获显示:

public byte[] GetFrame()
{
    int width = Screen.width;
    int height = Screen.height;

    Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);

    tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);
    byte[] bytes = tex.GetRawTextureData();
    Destroy(tex);
    return bytes;
}

我通过网络将此帧发送到另一个应用程序(Client),该应用程序加载接收到的帧并将其作为纹理放置在平面或其他任何应用程序(其他一些3D基元)上:

void DisplayFrame(byte[] frame)
{
    Texture2D texture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
    texture.LoadRawTextureData(frame);
    texture.Apply();
    GetComponent<Renderer>().material.mainTexture = texture;
    ScreenUpdate = true;
    Destroy(texture);
}

这样可以正常显示图像。但是,在观看RAM时,我注意到Client RAM变得疯狂......超过8GB。

有趣的是,如果我在frame = null;上的Destroy(texture);中调用DisplayFrame后设置Client,则用户只能看到黑屏。

我不明白这里发生了什么......好像frame留在内存中,每个新收到的帧只会增加使用的内存。

有没有人有任何想法?

1 个答案:

答案 0 :(得分:0)

事实证明,如果我将Destroy(texture);DisplayFrame(byte[] frame)的底部移动到函数的顶部,则会解决内存泄漏问题。

好像Destroy被阻挡了,因为当下一次迭代到来时,纹理仍然被应用于材质。我不清楚这个问题,所以如果有更多知识的人可以参与,那就太棒了。