游戏引擎学习第三天

时间:2024-11-11 13:27:33

视频参考:https://www.bilibili.com/video/BV1XTmqYSEtm/

之前的程序不能退出,下面写关闭窗体的操作
PostQuitMessage 是 Windows API 中的一个函数,用于向当前线程的消息队列发送一个退出消息。其作用是请求应用程序退出消息循环,通常用于处理应用程序的退出或关闭操作。
在这里插入图片描述

参数:
nExitCode:指定退出代码,通常是应用程序的退出状态码。这个值会传递给消息队列中的 WM_QUIT 消息,以便其他线程或系统得知退出时的状态。

当调用 PostQuitMessage 时,它会将一个 WM_QUIT 消息放入当前线程的消息队列。这个消息通常用于结束程序的消息循环。nExitCode 作为退出代码,会在 WM_QUIT 消息中作为一个参数传递。
应用程序的消息循环 (GetMessage 或 PeekMessage) 会检查消息队列,遇到 WM_QUIT 消息时就会退出消息循环,从而结束应用程序的执行。

通常,在窗口程序中,应用程序的消息循环会不断地获取并分发消息。当收到退出消息时,程序就会停止执行消息循环,退出应用程序。
在这里插入图片描述

上面代码收到退出消息之后直接break 没有对资源进行清理

  1. 窗口销毁:在程序退出之前,确保调用 DestroyWindow(hwnd) 来销毁创建的窗口。如果没有销毁,窗口所占用的资源(例如内存、GDI资源等)将得不到释放。
  2. 消息循环退出:在退出消息循环之前,应该确保通过 PostQuitMessage 或手动调用 DestroyWindow 销毁窗口及其资源。避免程序直接跳出循环而不进行清理。
  3. 注册类的清理:如果在程序中注册了自定义窗口类,确保在程序结束时调用 UnregisterClass 来注销窗口类。

清理后面再考虑

在这里插入图片描述

在 Windows GDI(图形设备接口)编程中,Backbuffer(背面缓冲区) 是一个临时的内存区域,用于存储绘制操作的内容,直到所有的渲染完成并准备好显示到屏幕上。使用双缓冲技术来避免屏幕闪烁(flickering)是常见的做法。

在这里插入图片描述

CreateDIBSection 是 Windows GDI 函数之一,用于创建设备独立位图(DIB)并返回一个 HBITMAP(位图句柄),其核心作用是分配内存并将图像数据存储在其中,可以用于绘制图形。它通常用于需要高效图像处理和绘制的场景,如游戏引擎、图形应用程序等。

// 这个函数用于重新调整 DIB(设备独立位图)大小
internal void Win32ResizeDIBSection(int width, int height) {
  // device independent bitmap(设备独立位图)
  // TODO: 进一步优化代码的健壮性
  // 可能的改进:先不释放,先尝试其他方法,再如果失败再释放。

  // TODO: 释放之前的 DIBSection
  if (BitmapHandle) { // 如果位图句柄有效,释放之前创建的 DIBSection
    DeleteObject(BitmapHandle); // 删除现有的位图对象
  }

  // 如果没有有效的设备上下文(BitmapDeviceContext),则创建一个
  if (!BitmapDeviceContext) {
    // TODO: 在某些特殊情况下是否需要重新创建这些对象
    BitmapDeviceContext =
        CreateCompatibleDC(0); // 创建一个与屏幕兼容的设备上下文
  }

  // 设置位图信息头(BITMAPINFOHEADER)
  BitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); // 位图头大小
  BitmapInfo.bmiHeader.biWidth = width;   // 设置位图的宽度
  BitmapInfo.bmiHeader.biHeight = height; // 设置位图的高度
  BitmapInfo.bmiHeader.biPlanes = 1;      // 设置颜色平面数,通常为 1
  BitmapInfo.bmiHeader.biBitCount = 32; // 每像素的位数,这里为 32 位(即 RGBA)
  BitmapInfo.bmiHeader.biCompression = BI_RGB; // 无压缩,直接使用 RGB 颜色模式

  // 创建 DIBSection(设备独立位图)并返回句柄
  BitmapHandle =
      CreateDIBSection(BitmapDeviceContext, // 设备上下文,NULL 表示不绑定设备
                       &BitmapInfo, // 位图信息,包括位图的大小、颜色深度等
                       DIB_RGB_COLORS, // 使用 RGB 颜色类型
                       &BitmapMemory, // 位图的内存指针,返回图像数据的指针
                       NULL, // 内存映射文件句柄,NULL 表示不使用
                       0);   // 偏移量,通常设置为 0

  // 释放设备上下文(BitmapDeviceContext)
  ReleaseDC(0, BitmapDeviceContext); // 释放设备上下文(不再需要继续使用)
}

// 这个函数用于将 DIBSection 绘制到窗口设备上下文
internal void Win32UpdateWindow(HDC DeviceContext, int X, int Y, int Width,
                                int Height) {
  // 使用 StretchDIBits 将 DIBSection 绘制到设备上下文中
  StretchDIBits(
      DeviceContext, // 目标设备上下文(窗口或屏幕的设备上下文)
      X, Y, Width, Height, // 目标区域的 x, y 坐标及宽高
      X, Y, Width,
      Height, // 源区域的 x, y 坐标及宽高(此处源区域与目标区域相同)
      BitmapMemory,   // 位图内存指针,指向 DIBSection 数据
      &BitmapInfo,    // 位图信息,包含位图的大小、颜色等信息
      DIB_RGB_COLORS, // 颜色类型,使用 RGB 颜色
      SRCCOPY); // 使用 SRCCOPY 操作符进行拷贝(即源图像直接拷贝到目标区域)
}

DIB_RGB_COLORS(RGB 颜色)
当你使用 DIB_RGB_COLORS 时,颜色表条目包含的是 RGB 颜色值,即每个条目由红色(R)、绿色(G)和蓝色(B)三种颜色分量组成(通常是 8 位深度的分量)。这对于颜色深度较高的图像(如 24 位色或 32 位色)非常适用。

DIB_PAL_COLORS(调色板索引)
当使用 DIB_PAL_COLORS 时,颜色表条目通常是索引值,而不是具体的 RGB 值。这意味着每个条目对应一个调色板中的颜色(例如,8 位图像通常使用 256 色的调色板)。在绘制图像时,通过调色板索引来查找实际的颜色。

在这里插入图片描述

在这里插入图片描述