unity - ОЗУ графического процессора не высвобождается после съемки - PullRequest
0 голосов
/ 22 марта 2019

как освободить память оперативной памяти gpu после фотографирования когда достигло ~ 1000 фотографий мой компьютер завис, потому что я использовал все оперативной памяти графического процессора сейчас я использую код ниже для создания фотографии:

IEnumerator takePhoto (имя файла строки) { yield return new WaitForEndOfFrame ();

    // Debug.Log(gameObject.name + " Save Color Photo");

    Texture2D screenImage = new Texture2D(Screen.width, Screen.height);
    //Get Image from screen
    screenImage.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
    screenImage.Apply();

    if(resolution == Resolution.Half)
    {
        screenImage = Utils.Resize(screenImage, Screen.width / 2, Screen.height / 2);
        // screenImage.Apply();
    }

    //Convert to png
    byte[] imageBytes = screenImage.EncodeToPNG();

    //Save image to file
    System.IO.File.WriteAllBytes(filename + "_scene.png", imageBytes);
}

1 Ответ

0 голосов
/ 22 марта 2019

Textur2D - это объект Unity, что означает, что он будет сохраняться за пределами сценария (он находится в сцене). Либо используйте шаблон синглтона, так что вам нужен только один текстурный блок в памяти, или вам нужно Destroy it:

    //Save image to file
    System.IO.File.WriteAllBytes(filename + "_scene.png", imageBytes);

    // Destroy Textur2D Object
    Destroy(screenImage);
}

Лично я бы порекомендовал шаблон синглтона:

// Create texture as class-level field, outside of function
Texture2D screenImage = new Texture2D(Screen.width, Screen.height);

IEnumerator takePhoto(string filename) { yield return new WaitForEndOfFrame();

    // Debug.Log(gameObject.name + " Save Color Photo");

    //Get Image from screen
    screenImage.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
    screenImage.Apply();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...