Directx11教程(21) 修正程序最小化异常bug

      很长时间竟然没有注意到,窗口最小化时候,程序会异常,今天调试水面程序时,随意间最小化了窗口,发现程序异常了。经过调试,原来程序最小化时候,屏幕的高度和宽度为0,此时创建深度缓冲会fail,所以在D3DClass.cpp的初始化函数中加入以下的代码,可以防止最小化时候程序异常。

D3DClass.cpp增加代码:

//Initialize函数包含完成D3D设置的所有代码。
bool D3DClass::Initialize(int screenWidth, int screenHeight, bool vsync, HWND hwnd, bool fullscreen,
    float screenDepth, float screenNear)

{

//如果屏幕高度或者宽度为0,则会创建深度缓冲失败,
//当窗口最小化时候,会出现窗口为0的情况

if(screenWidth < 1)
    screenWidth = 1;
if(screenHeight <1)
    screenHeight = 1;

// 初始化交换链描述
ZeroMemory(&swapChainDesc, sizeof(swapChainDesc));

// 用1个后缓冲
swapChainDesc.BufferCount = 1;

//帧缓冲的大小和应用程序窗口大小相等.
swapChainDesc.BufferDesc.Width = screenWidth;
swapChainDesc.BufferDesc.Height = screenHeight;

// 后缓冲的surface的格式为DXGI_FORMAT_R8G8B8A8_UNORM.
// surface的每个像素用4个无符号的8bit[映射到0-1]来表示。NORM表示归一化

swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;

// 如果使用垂直同步,设置后缓冲的刷新率。.
//刷新率就是一秒钟把后缓冲内容在屏幕上画出的次数。
//如果开启垂直同步,则锁定刷新率,则fps是固定的

if(m_vsync_enabled)
    {
    swapChainDesc.BufferDesc.RefreshRate.Numerator = numerator;
    swapChainDesc.BufferDesc.RefreshRate.Denominator = denominator;
    }
else
    {
    swapChainDesc.BufferDesc.RefreshRate.Numerator = 0;
    swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
    }

}

posted on   迈克老狼2012  阅读(1567)  评论(1编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程

导航

< 2012年3月 >
26 27 28 29 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
1 2 3 4 5 6 7
点击右上角即可分享
微信分享提示