【发布时间】:2011-12-17 07:50:13
【问题描述】:
我正在尝试将 XNA 游戏的每个渲染帧保存到硬盘。所以在每一帧中,我称之为代码:
protected override void LoadContent()
{
....
colorRT = new RenderTarget2D(GraphicsDevice, backbufferWidth, backbufferHeight, false, SurfaceFormat.Color, DepthFormat.Depth24);
lightRT = new RenderTarget2D(GraphicsDevice, backbufferWidth, backbufferHeight, false, SurfaceFormat.Color, DepthFormat.None);
specRT = new RenderTarget2D(GraphicsDevice, backbufferWidth, backbufferHeight, false, SurfaceFormat.Color, DepthFormat.None);
....
}
using (Stream stream = File.OpenWrite("color_"+frameNumber+".png"))
{
colorRT.SaveAsPng(stream, colorRT.Width, colorRT.Height);
stream.Flush();
stream.Close();
stream.Dispose();
}
using (Stream stream = File.OpenWrite("light_" + frameNumber + ".png"))
{
lightRT.SaveAsPng(stream, lightRT.Width, lightRT.Height);
stream.Flush();
stream.Close();
stream.Dispose();
}
using (Stream stream = File.OpenWrite("spec_" + frameNumber + ".png"))
{
specRT.SaveAsPng(stream, specRT.Width, specRT.Height);
stream.Flush();
stream.Close();
stream.Dispose();
}
System.GC.Collect();
frameNumber++;
但是如果此代码打开,内存消耗会不断增加,半分钟左右后我会收到 outOfMemory 异常。我添加了 flush、close、dispose 和 GC 调用来尝试解决问题,但这并没有改变任何事情。
谁知道我做错了什么?
【问题讨论】:
-
顺便说一句,
using语句会为您调用 Dispose,如果您进行 dispose,则不需要关闭或刷新。问题可能与您一直保存 PNG 的事实有关?或者xxRT变量一直在增长。文件流每次都被正确删除。 -
是的,我也是这么想的,但我不明白这段代码是如何导致 outOfMemory 异常的。如果我把它注释掉,一切都运行良好
-
您不需要通过 using 使用 Flush、Close 和 Dispose。你在某处有任何 for 循环吗?这段代码怎么称呼? XNA 中的 AFAIK 有每秒调用数百次来刷新图形的方法。 frameNumber++ 那是什么?如果这个计数器正在增长,那么这就是你的问题。将加载内容的代码移动到调用一次的方法中。
-
@oleksii:他想每帧输出一次,所以加载内容时不能只运行一次。
-
'framenumber' 仅用于文件名。该代码每帧只调用一次。它正好在我场景的正常绘图程序的末尾
标签: c# out-of-memory xna-4.0