2011-07-30 108 views
0

我已經用C#寫了一個俄羅斯方塊遊戲。我使用下面的代碼在picturebox中繪製圖形。picturebox.refresh slow問題

graphics g 
g = pictureBox1.CreateGraphics(); 

我正在通過計時器代碼清理每一秒鐘,以繪製下一步的形狀。 我的問題是:它正在緩慢運行picturebox.refresh()命令和顯示失真,我該怎麼辦?

我試過下面的函數。但是,它不工作。我有同樣的問題。

public void EnableDoubleBuffering() 
    { 
     // Set the value of the double-buffering style bits to true. 
     this.SetStyle(ControlStyles.DoubleBuffer | 
      ControlStyles.UserPaint | 
      ControlStyles.AllPaintingInWmPaint, 
      true); 
     this.UpdateStyles(); 
    } 
+0

總是使用Paint事件繪製,切勿使用CreateGraphics()。調用pb的Invalidate()方法來觸發重繪。這也自動啓用雙緩衝。您嘗試的方法在窗體上啓用雙緩衝,而不是圖片框。 PB已經有雙緩衝打開。爲什麼它很慢是不可想象的。 –

+0

@Hans Passant-首先,感謝你的有趣之處。正如我所提到的,俄羅斯方塊遊戲的展示並不流利。所以,刷新不夠好。究竟需要我做什麼? – Selo

+0

使用一個分析器來找出你寫的代碼很慢。 –

回答

1

您的繪圖方式是使用GDI繪製圖片(基本上使用軟件繪製遊戲圖形)。與普通遊戲相比,這個速度會比較慢,因爲大多數遊戲都使用DirectX或OpenGL在硬件級別將數據快速傳輸到顯卡。我會推薦學習微軟XNA,並在XNA中編寫遊戲,它基於C#並提供了一個很好的內容管道來完成你想做的事情。

+0

剛纔我發現,如果你在圖像中使用任何形式的透明度,那麼也會顯着降低繪圖速度。 GDI中Alpha混合的速度非常慢。 –

+0

作爲一種相信我所說的測試,可以創建一個簡單的表單,將其背景圖像設置爲某種類型的漸變,然後在窗體上放置幾個帶有幾個控件的組框。現在,將GROUPBOX背景顏色設置爲「透明」。這將是GDI如何執行alpha混合的測試,您會注意到它會慢慢在屏幕上繪製組合框。這是因爲GDI無法處理任何速度的alpha混合。 Alpha Blending對大多數遊戲來說都是必不可少的 –

0

我有同樣的問題。解決方法是,您必須在另一個位圖中繪製新圖片,並在完成時將其繪製在您的圖片框中。