当Camera.targetTexture = new RenderTexture(...)时发生内存泄漏

时间:2018-10-31 10:01:50

标签: c# unity3d rendering

我已经编写了一个EditorWindow,可以将摄像机的视图渲染到另一个编辑器窗口中。为了在调整窗口大小时立即适应,在滴答时间重新分配了摄像机的目标纹理(实际上仅在必要时执行)以演示问题:

public class PlayerViewWindow : EditorWindow
{
    private Camera PlayerViewCamera; // References a camera in the scene

    public void OnGUI()
    {
        PlayerViewCamera.targetTexture = new RenderTexture((int)position.width, (int)position.height, 24, RenderTextureFormat.ARGB32);
        PlayerViewCamera.Render();
        GUI.DrawTexture(new Rect(0, 0, position.width, position.height), PlayerViewCamera.targetTexture);       
    }
}

当我激活此窗口时,重新分配相机目标纹理会导致内存泄漏。因此:为什么不对旧目标纹理进行垃圾收集? 有没有办法明确破坏旧的目标纹理?

谢谢

2 个答案:

答案 0 :(得分:3)

来自RenderTexture Documentation

  

与其他“本地引擎对象”类型一样,重要的是要注意任何渲染纹理的生命周期,并在使用Release函数完成使用它们之后将其释放,因为它们不会像普通托管对象那样被垃圾回收。类型。

因此,只需在附加新的RenderTexture之前致电Release()

public class PlayerViewWindow : EditorWindow
{
    private Camera PlayerViewCamera; // References a camera in the scene

    public void OnGUI()
    {
        if(PlayerViewCamera.targetTexture != null)
        {
            PlayerViewCamera.targetTexture.Release();
        }

        PlayerViewCamera.targetTexture = new RenderTexture((int)position.width, (int)position.height, 24, RenderTextureFormat.ARGB32);
        PlayerViewCamera.Render();
        GUI.DrawTexture(new Rect(0, 0, position.width, position.height), PlayerViewCamera.targetTexture);       
    }
}

答案 1 :(得分:1)

derHugo在回答中所说的那样使用sed -i -e 's/%\x0D\x0A%/ /g' file_name.csv sed -i -e 's/%\CR\LF%/ /g' file_name.csv sed -i -e 's/%\r\n%/ /g' file_name.csv tr '\15\12' ' ' < file_name.cvs tr '\x0D\x0A' ' ' < file_name.cvs 后,您必须释放它。不幸的是,每次调用RenderTexture甚至比调用RenderTexture函数更频繁地调用OnGUI时,创建和销毁OnGUI都是昂贵的。

最好使用Update获得临时渲染,然后在使用完RenderTexture.GetTemporary时释放它。 请注意,过去某些平台上的RenderTexture.ReleaseTemporary函数存在一个错误。我认为它现在已修复,但是如果遇到问题,请坚持使用other解决方案。

RenderTexture.ReleaseTemporary
相关问题