• 热门专题

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

作者:迈克老狼2012  发布日期:2012-04-10 11:34:38
Tag标签:Directx11  异常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; 
        } 
    
    
    …
    
    }
    
    
About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规