XNA c#Out of Memory问题

时间:2011-02-02 09:54:13

标签: c#

是的,从一开始就生病了,所以阅读起来会更容易,

当我运行我的程序时,它会显示应有的一切。我甚至可以和我的播放器一起走动一下,但是在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);
   }


}
希望这是一个更好的解释。希望有人能看到我不能做的错误。

提前感谢:)

1 个答案:

答案 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();
 }