2011-02-02 78 views
1

右鍵,從一開始就開始生病所以這將是小有一點更容易閱讀通過,XNA C#內存問題

的當過我運行我的程序就說明一切,因爲它應該。我甚至可以隨身攜帶我的播放器,但10-15秒後突然死亡,說它的內存不足。我不知道這是什麼意思,因爲我以前從來沒有遇到這個問題,我已經做過ealier程序。

這裏的問題是來自於代碼(也就是我得到所示的代碼)

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

你能後的`GameObject`類的代碼,因爲這是在異常發生的事情,並刪除您發佈的代碼的牆。 – 2011-02-02 10:02:37

+5

我不會在每一幀中從磁盤載入`Starting-room.png`渲染開始。 – 2011-02-02 10:08:56

回答

2

我覺得你的問題是,您是要裝入PNG每次渲染被調用。而是加載一次,並將其設置爲類中的靜態成員。

然後,使用該單一參考進行繪製。原因是Image實現了IDisposable,所以它在超出範圍後不會釋放其資源(內存)。如果您要將其保留在Render中,您需要撥打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(); 
}