游戏引擎学习第三天

视频参考: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(位图句柄),其核心作用是分配内存并将图像数据存储在其中,可以用于绘制图形。它通常用于需要高效图像处理和绘制的场景,如游戏引擎、图形应用程序等。

cpp 复制代码
// 这个函数用于重新调整 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); // 释放设备上下文(不再需要继续使用)
}
cpp 复制代码
// 这个函数用于将 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 色的调色板)。在绘制图像时,通过调色板索引来查找实际的颜色。

相关推荐
武昌库里写JAVA27 分钟前
iview Switch Tabs TabPane 使用提示Maximum call stack size exceeded堆栈溢出
java·开发语言·spring boot·学习·课程设计
一弓虽1 小时前
git 学习
git·学习
Moonnnn.3 小时前
【单片机期末】串行口循环缓冲区发送
笔记·单片机·嵌入式硬件·学习
viperrrrrrrrrr74 小时前
大数据学习(131)-Hive数据分析函数总结
大数据·hive·学习
fen_fen4 小时前
学习笔记(26):线性代数-张量的降维求和,简单示例
笔记·学习·算法
布伦鸽6 小时前
C# WPF 左右布局实现学习笔记(1)
笔记·学习·c#·wpf
陳麦冬8 小时前
深入理解指针(二)
c语言·学习
一线灵8 小时前
跨平台游戏引擎 Axmol-2.6.1 发布
游戏引擎
普宁彭于晏10 小时前
CSS3相关知识点
前端·css·笔记·学习·css3
fen_fen10 小时前
学习笔记(25):线性代数,矩阵-矩阵乘法原理
笔记·学习·线性代数