我正在用C#编写基于磁贴的游戏。但是我遇到了一个问题,当应用程序处于窗口模式时,我的系统内存振荡大约-300MB,并且在全屏中它耗尽所有内存并抛出OutOfMemoryException。
据我所知,我找不到任何可能导致这种情况发生的事情.Dispose()。
我能找到最接近问题的地方是我将.Clone()一个Bitmap放到PictureBox.Image中。每帧发生一次。我有整个"世界"在内存中渲染,这是一个大约2000x1000像素的位图,我从中复制要在屏幕上显示的部分。
我可以附上代码,但由于它很多,我会等到它清楚问题就在那里,而不是在上面的方法中。
由于
编辑:我认为这就是问题所在:public Bitmap GetMap(Rectangle renderedArea)
{
if (renderedArea.Bottom > renderedMap.Height || renderedArea.Right > renderedMap.Width)
return renderedMap.Clone(new Rectangle(0,0,renderedMap.Width,renderedMap.Height),renderedMap.PixelFormat);
return renderedMap.Clone(renderedArea, renderedMap.PixelFormat);
}
public void Render(Rectangle area)
{
renderArea.Image = worldEditor.map.GetMap(area);
Graphics g = Graphics.FromImage(renderArea.Image);
PointF stringPoint = MouseInputEventHandler.CursorLocation.ToCoords(worldEditor.map.TileArray.TileSize,worldEditor.RENDER_START);
g.DrawString(string.Format("{0},{1}", (int)stringPoint.X, (int)stringPoint.Y), new Font("Arial",15,FontStyle.Bold), Brushes.Yellow, new PointF(6, 6));
g.Dispose();
}
通过查看相关问题(谷歌没有给我看!)我发现将其添加到Render()函数可以解决问题:
if (renderArea.Image != null)
renderArea.Image.Dispose();
但是,我很想知道为什么必须将其处理掉。
答案 0 :(得分:3)
当您Clone
时,您创建了对象的副本。因此,您的新 Bitmap
对象最终也需要Dispose
调用它。
renderArea.Image = worldEditor.map.GetMap(area);
重新分配图像而不进行处理,因此泄漏旧对象。如果您添加帖子中的代码,则清理对象,解决问题。
可能更清晰的写作方式是:
Bitmap oldImage = renderArea.Image;
renderArea.Image = worldEditor.map.GetMap(area);
if (oldImage != null)
oldImage.Dispose();