是的,从一开始就生病了,所以阅读起来会更容易,
当我运行我的程序时,它会显示应有的一切。我甚至可以和我的播放器一起走动一下,但是在10-15秒之后它突然死了,说它的内存不足。我不知道这意味着什么,因为我之前从未遇到过这个问题,我已经做过更早的计划。
这是问题来自的代码(这就是我得到的代码)
private void Render()
{
dc.DrawImage(Image.FromFile("Graphics/WorldAreas/Starting-room.png"), 0, 0);
foreach (GameObject go in gameWorld)
{
go.Render(dc);
}
bg.Render();
}
几秒钟后,它会突出显示“dc.DrawImage”,并说OutOfMemoryException未处理。
在我重写之前,我看到有人要求游戏对象如此生病,为此添加代码
public abstract class GameObject
{
protected PointF position; //X,Y Position in the Game World
public PointF Position
{
get { return position; }
}
protected Image sprite;
public virtual void Move(float factor)
{
}
public virtual void Render(Graphics dc)
{
dc.DrawImage(sprite, position.X, position.Y, sprite.Width, sprite.Height);
//dc.DrawRectangle(new Pen(Color.Red), CollisionRectangle);
}
}
希望这是一个更好的解释。希望有人能看到我不能做的错误。
提前感谢:)
答案 0 :(得分:2)
我认为你的问题是每次调用渲染时你都在加载PNG。而是加载一次,并使其成为类上的静态成员。
然后,使用该单个参考进行绘制。这样做的原因是Image实现了IDisposable
,因此它在超出范围后不会释放它的资源(内存)。如果您要将其保留在渲染中,则需要拨打Image.Dispose()
或使用using(Image img = Image.FromFile(..))
。但我仍然会加载一次以减少I / O.
private static Image StartRoomImage = Image.FromFile("Graphics/WorldAreas/Starting-room.png");
private void Render()
{
dc.DrawImage(StartRoomImage , 0, 0);
foreach (GameObject go in gameWorld)
{
go.Render(dc);
}
bg.Render();
}