2011-11-22 73 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