这段代码是如何工作的? (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() 后被涂黑了绘制到屏幕上。