Утечка памяти, когда Camera.targetTexture = new RenderTexture (...) - PullRequest
0 голосов
/ 31 октября 2018

Я написал 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 голосов
/ 31 октября 2018

Вы должны освободить RenderTexture после использования, как derHugo сказал в своем ответе. К сожалению, создание и уничтожение RenderTexture обходится каждый раз, когда вызывается OnGUI, а OnGUI вызывается даже чаще, чем функция Update.

Было бы лучше получить временный рендер с RenderTexture.GetTemporary, а затем отпустить его с RenderTexture.ReleaseTemporary, когда вы закончите с ним. Обратите внимание, что в прошлом на некоторых платформах была ошибка с функцией RenderTexture.ReleaseTemporary. Я предполагаю, что теперь это исправлено, но если у вас возникнут проблемы с ним, то используйте решение other .

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

    public void OnGUI()
    {
        Vector2 size = new Vector2(position.width, position.width);
        //Get temporary RenderTexture
        RenderTexture tempRT = RenderTexture.GetTemporary((int)size.x, (int)size.y, 24, RenderTextureFormat.ARGB32);
        PlayerViewCamera.targetTexture = tempRT;
        PlayerViewCamera.Render();
        GUI.DrawTexture(new Rect(0, 0, size.x, size.x), PlayerViewCamera.targetTexture);
        //Release temporary RenderTexture
        RenderTexture.ReleaseTemporary(tempRT);
    }
}
0 голосов
/ 31 октября 2018

Из RenderTexture Документации :

Как и в случае с другими типами объектов "собственного движка", важно обращать внимание на время жизни любых текстур рендеринга и освобождать их, когда вы закончите использовать их с функцией Release, так как они не будут собираться мусором, как при обычном управлении. типы.

Так что просто наберите Release() на старом RenderTexture, прежде чем присоединять новый:

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);       
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...