游戏引擎学习第三天

视频参考: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 色的调色板)。在绘制图像时,通过调色板索引来查找实际的颜色。

相关推荐
异次元的归来3 小时前
Unity DOTS中的share component
unity·游戏引擎
南宫生4 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
sanguine__4 小时前
Web APIs学习 (操作DOM BOM)
学习
向宇it6 小时前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎
数据的世界017 小时前
.NET开发人员学习书籍推荐
学习·.net
四口鲸鱼爱吃盐7 小时前
CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
学习
向宇it8 小时前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
OopspoO9 小时前
qcow2镜像大小压缩
学习·性能优化
A懿轩A9 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
居居飒10 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin