我只是想知道是否有人可以为我阐明这一点。多年来我一直在编写 c# 代码,但除了位图类之外,我什至从未接触过 System.Drawing 命名空间中的任何内容,我一直在遵循一些教程并想出一些有效的代码。我正在开发一个2D游戏引擎,下面的代码是用于使用GDI的图形引擎。但是,我只是不明白这段代码是如何工作的。在这里:
private Graphics frontBuffer;
private Graphics backBuffer;
private Bitmap backBufferBitmap;
public void Initialize()
{
backBufferBitmap = new Bitmap(game.Form.Width, game.Form.Height);
frontBuffer = game.Form.CreateGraphics();
backBuffer = Graphics.FromImage(backBufferBitmap);
}
public void Update()
{
try
{
frontBuffer.DrawImageUnscaled(backBufferBitmap,0,0);
backBuffer.Clear(Color.Black);
}
catch(Exception e)
{
throw e;
}
}
所以,让我感到困惑的主要部分是这个;
后台缓冲区位图是如何更新的?为什么清除后台缓冲区而不是前缓冲区?
此外,初始化方法在 while 循环中每帧调用一次,更新方法调用一次。
从位图初始化backBuffer
图形对象后,例如,每次说backBuffer.DrawLine(...)
GDI+将直接在此位图上执行像素操作。它们在某种程度上是联系在一起的。把backBufferBitmap
想象成画布,把backBuffer
想象成画笔。
frontBuffer
改为从窗体初始化。所以形式是它的画布,无论你用frontBuffer
做什么,都会被吸引到表格上 - 在这种情况下,它画backBufferBitmap
.
它基本上是一个双缓冲方案,与直接将线条和圆圈绘制到表单上相比,它具有很多优势,例如较少闪烁。每当您向表单绘制内容时,请记住它经常被删除(例如,当您将表单移动到屏幕区域之外时)。您需要使用窗体的Paint
事件刷新它。
调用Update()
后,您需要将场景重绘到backBuffer
,然后再调用 Update,因为位图在绘制到屏幕后会被Clear()
涂黑。
frontBuffer
正在更新,因为每次您都在update()
中调用frontBuffer.DrawImageUnscaled(backBufferBitmap,0,0);
backBuffer
正在清除,因为您正在呼叫backBuffer.Clear(Color.Black);
此外,initialize()
应该只调用一次。在创建对象时。我相信这是一个更大的计划的一部分,父母正在打电话给孩子update()
。