这段代码是如何工作的?(GDI, C#)



我只是想知道是否有人可以为我阐明这一点。多年来我一直在编写 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()

相关内容

  • 没有找到相关文章

最新更新