我已经编写了一个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);
}
}
当我激活此窗口时,重新分配相机目标纹理会导致内存泄漏。因此:为什么不对旧目标纹理进行垃圾收集? 有没有办法明确破坏旧的目标纹理?
谢谢
答案 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