【问题标题】:unity - GPU RAM is not released after taking a photounity - 拍照后不释放 GPU RAM
【发布时间】:2019-03-22 08:27:42
【问题描述】:

如何在拍照后释放 gpu ram 内存 当达到〜1000张照片时,我的计算机卡住了,因为我使用了所有的gpu ram 现在我正在使用下面的代码来创建照片:

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);
}

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    Textur2D 是一个 Unity 对象,这意味着它将在脚本范围之外持续存在(它存在于场景中)。要么使用单例模式,这样你只需要一个纹理块在内存中,要么你需要Destroy它:

        //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();
    

    【讨论】:

      猜你喜欢
      • 2018-08-20
      • 1970-01-01
      • 2020-10-07
      • 2015-01-18
      • 1970-01-01
      • 2018-12-08
      • 2020-07-20
      • 2021-10-15
      相关资源
      最近更新 更多