这段代码是如何工作的? (GDI, C#)
How does this code work? (GDI, C#)
我只是想知道是否有人可以为我阐明这一点。多年来,我一直在编写 C#,但除了位图 class 之外,我什至从未接触过 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 循环中每帧调用一次。
frontBuffer
正在更新,因为每次您在 update()
中调用 frontBuffer.DrawImageUnscaled(backBufferBitmap,0,0);
backBuffer
正在清除,因为您正在调用 backBuffer.Clear(Color.Black);
此外,initialize()
应该只调用一次。 object 创建时。我相信它是一个更大程序的一部分,其中 parent 正在调用 child 的 update()
。
从位图中初始化 backBuffer
图形对象后,每次你说,例如 backBuffer.DrawLine(...)
GDI+ 将直接在此位图上进行像素操作。它们以某种方式联系在一起。将 backBufferBitmap
视为 canvas,将 backBuffer
视为画笔。
frontBuffer
是从表单初始化的。所以表格是 canvas 并且无论你用 frontBuffer
做什么都会被绘制到表格 - 在这种情况下它会绘制 backBufferBitmap
.
它基本上是一种双缓冲方案,与直接将直线和圆圈绘制到表单相比有很多优势,例如少闪烁。每当您在表单上绘制内容时,请记住它经常被删除(例如,当您将表单移出屏幕区域时)。您需要使用表单的 Paint
事件刷新它。
调用 Update()
后,您需要将场景重绘到 backBuffer
,然后再调用更新,因为位图在调用 Clear()
后被涂黑了绘制到屏幕上。
我只是想知道是否有人可以为我阐明这一点。多年来,我一直在编写 C#,但除了位图 class 之外,我什至从未接触过 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 循环中每帧调用一次。
frontBuffer
正在更新,因为每次您在 update()
frontBuffer.DrawImageUnscaled(backBufferBitmap,0,0);
backBuffer
正在清除,因为您正在调用 backBuffer.Clear(Color.Black);
此外,initialize()
应该只调用一次。 object 创建时。我相信它是一个更大程序的一部分,其中 parent 正在调用 child 的 update()
。
从位图中初始化 backBuffer
图形对象后,每次你说,例如 backBuffer.DrawLine(...)
GDI+ 将直接在此位图上进行像素操作。它们以某种方式联系在一起。将 backBufferBitmap
视为 canvas,将 backBuffer
视为画笔。
frontBuffer
是从表单初始化的。所以表格是 canvas 并且无论你用 frontBuffer
做什么都会被绘制到表格 - 在这种情况下它会绘制 backBufferBitmap
.
它基本上是一种双缓冲方案,与直接将直线和圆圈绘制到表单相比有很多优势,例如少闪烁。每当您在表单上绘制内容时,请记住它经常被删除(例如,当您将表单移出屏幕区域时)。您需要使用表单的 Paint
事件刷新它。
调用 Update()
后,您需要将场景重绘到 backBuffer
,然后再调用更新,因为位图在调用 Clear()
后被涂黑了绘制到屏幕上。