2011-11-22 52 views
3

我正在創建一個使用tile系統的2D遊戲引擎。在繪製這些圖塊時,您可以在屏幕上看到每個圖塊。繪圖速度非常快,但您仍然可以看到它。防止System.Drawing.Graphics從更新

當我告訴圖形繪製某些東西時,我不希望它立即更新,因爲它在屏幕上繪製了其他東西,顯然效率很低。我希望它能夠「繪製」我所說的內容,但是實際上將它展現在一個大的更新中......或者它們會做同樣的事情嗎?反正可能不可能。

//Creating graphics 
public static Form GameForm; //Assigned by the form 
public static Graphics GFX; 

public static void Init() 
{ 
    GFX = GameForm.CreateGraphics(); 
    GameForm.BackColor = Color.Black; 

    // ---- 

    //Drawing the tiles 
    while (X != 480) 
    { 
    while (Y != 352) 
    { 
     Tiles.Add(new Tile(X, Y, Num, 0)); 

     GFX.DrawImage(LoadedImages[4], new Point(X, Y)); 
     GFX.DrawRectangle(new Pen(Color.Red), X, Y, 32, 32); 
     GFX.DrawString(Num.ToString(), new Font("System", 10.0F), 
             new SolidBrush(Color.Black), 
             new PointF((float)X, (float)Y)); 

     Y = Y + 32; 
     Num++; 
     } 
     X = X + 32; 
     Y = 0; 
    } 
    //UPDATE NOW! 

回答

4

創建一個與屏幕大小相同的位圖。然後請撥打Graphics.FromImage以獲取您可以繪製的Graphics對象實例。將所有東西繪製到該對象中完成後,將臨時位圖複製到屏幕Graphics.DrawImage

即:

// Create bitmap 
using (var bmp = new Bitmap(form_width, form_height, GFX)) 
{ 
    using (var g = Graphics.FromImage(bmp)) 
    { 
     // do all your drawing to g 
    } 

    // draw bmp to GFX 
    GFX.DrawImage(bmp, 0, 0); 
} 
+1

1,也['Control.DoubleBuffered'](http://msdn.microsoft.com/en-us/library/system.windows.forms.control.doublebuffered .aspx)可能會更簡單。 – user7116

+0

天才。我永遠不會想到這一點。 – WildBamaBoy