棋牌游戏大厅开户

您现在的位置: 网上现金棋牌游戏平台 >> 棋牌技巧 >> 棋牌开发 >> 正文

D3D中设备丢失程序中的处理

分享到:
时间:2014-11-21  看看谷歌  瞅瞅搜狗  眯眯搜搜
内容简介:D3D中设备(Device)有两种状态,一种是可操作状态,也就是正常状态,另一种是丢失状态(Lost),处于丢失状态的设备是不能进行渲染操作的。本文由网上现金棋牌游戏平台www.crjq8.com编辑整理,介绍各种网上真钱棋牌游戏技巧,澳门赌场赌博技巧,提供各种网上博彩游戏,网上真钱游戏,免费试玩。希望D3D中设备丢失程序中的处理这篇文章能给你提供帮助。

棋牌游戏精简版下载 棋牌游戏完整版大厅下载

什么是设备丢失?

D3D中设备(Device)有两种状态,一种是可操作状态,也就是正常状态,另一种是丢失状态(Lost),处于丢失状态的设备是不能进行渲染操作的。简单的说,设备丢失是只应用程序(Device)与显卡失去了联系,因此无法使用显存。这里的Device不是只硬件,而是我们在程序中创建的Device对象,可以理解为上下文环境。

什么情况会导致设备丢失

当某些事件发生时,设备会由正常状态转换到丢失状态。这些事件包括

程序在全屏状态下失去键盘焦点(全屏时按下Alt+Tab或Win+D键或Win+L键)
其他程序进入全屏状态
电源管理事件,比如屏保等
设备丢失的现象

渲染窗口内模型丢失
渲染窗口背景色变黑或者干脆没有背景色
程序失去响应或者Crash
如何检测设备丢失

设备丢失以后,大多数渲染操作都只是silent failure,所以仍然会返回正确代码,但是Present函数会返回D3DERR_DEVICELOST,所以可以检测该函数的返回值,如果该函数失败,那么就重置设备。当然失败可能还有其他原因,不仅仅是设备丢失而已,这些情况我们都在ResetDevie函数里面一并处理。

复制代码
// Present the back buffer contents to the display
HRESULT hr = g_pd3dDevice->Present(NULL, NULL, NULL, NULL);

// Render failed, try to reset device
if(FAILED(hr))
{
    ResetDevice(d3dpp) ;
}
复制代码

如何处理设备丢失

设备丢失以后,应该进行重置(Reset),可以使用Reset函数来重置设备,Reset函数是设备丢失以后唯一起作用的函数,也是唯一能将设备从丢失状态恢复到正常状态的函数。由于设备丢失后,设备与显卡就失去了联系,所以一切与显卡有关的资源也都无法再通过设备访问了,那么这些资源必须释放并重新创建,一般来说,以D3DPOOL_DEFAULT为参数创建的资源,都是在显卡中分配的内存,所以,在重置设备之前要保证所有D3DPOOL_DEFAULT类型的资源都必须释放掉,而且如果程序中使用了额外的SwapChain,那么也要重新创建之,否则Reset函数会失败。设备丢失的处理可以大致分成如下三个步骤

使用TestCooperativeLevel函数检测当前设备状态,如果可以重置,则重置,并重建使用D3DPOOL_DEFAULT创建的资源及SwapChain。
如果设备仍然处于丢失状态,则等待一段时间
如果是其他状态,比如驱动内部错误,则告知用户(比如显示错误框)
处理设备丢失的代码如下

复制代码
// Reset device
HRESULT ResetDevice(D3DPRESENT_PARAMETERS d3dpp)
{
    // Check device state
    HRESULT hr = g_pd3dDevice->TestCooperativeLevel() ;

    // Device can be reset now
    if (SUCCEEDED(hr) || hr == D3DERR_DEVICENOTRESET)
    {
        // Release resource allocated as D3DPOOL_DEFAULT

        // Reset device
        HRESULT hr = g_pd3dDevice->Reset(&d3dpp) ;
        if (SUCCEEDED(hr))
        {
            ResizeD3DScene(d3dpp.BackBufferWidth, d3dpp.BackBufferHeight) ;
        }
        else// Reset device failed, show error box
        {
            const WCHAR* errorString = DXGetErrorString(hr) ;
            DXTRACE_ERR_MSGBOX(errorString, hr) ;
        }
    }
    // Device is still in lost state, wait
    elseif (hr == D3DERR_DEVICELOST)
    {
        Sleep(25) ;
    }
    else// Other error, Show error box
    {
        const WCHAR* errorString = DXGetErrorString(hr) ;
        DXTRACE_ERR_MSGBOX(errorString, hr) ;
    }

    return hr ;
}
复制代码
需要注意的是,在重置Device的过程中(即调用Reset函数时),仍然会发生错误,这时我们简单的输出一个错误框告知用户。由于重置设备后,窗口的大小可能改变,所以我们要调用ResizeD3DScene来调整投影窗口的纵横比,该函数如下

复制代码
// Reset the scene by rebuild the viewing frustum
void ResizeD3DScene(int width, int height)
{
    if (height ==0 ) // Prevent A Divide By Zero By
        height =1; // Making Height Equal One

    // Compute aspect ratio
    float fAspectRatio = width / (FLOAT)height;

    // Setup Projection matrix
    g_Camera.SetProjParams( D3DX_PI/4, fAspectRatio, 1.0f, 1000.0f );

    g_Camera.SetWindow( width, height );
}
复制代码
验证一个3D程序是否正确处理了设备丢失

如果不能正确的处理设备丢失,则D3D程序经常会产生莫名其妙的现象 ,我们可以使用如下方法验证

1 在程序处于渲染状态时(窗口或者全屏态皆可)按下锁屏键(Win+L),然后返回程序,看看渲染内容是否丢失。

2 在程序处于全屏状态时,按下Win+D回到桌面,或者按下Atl+Tab切换到其他程序,然后在再到渲染程序,看看渲染内容是否丢失。

3 还有其他的,大家发挥想象力。。。

Vista及后续系统的情况

前面讨论的情况都是针对XP系统而言,如果你使用的是Window Vista及更高版本,那么情况则有所不同了,Vista使用的是WDDM driver(Windows Device Driver Model),而XP使用的是XPDM (XP Driver Model),前面说了,设备丢失的情况很多,并没有一个完整的列表来描述这些情况,但是在Vista系统上则不然,设备丢失只有两种情况,一是硬件hanging,另一种是driver stopped。

如果是硬件挂起,那么可以通过ResetEx来重置设备,但是纹理内存会丢失。
如果是驱动停止了,那么所有IDirect9Ex 对象必须重新创建以便继续渲染。
在窗口模式下,如果渲染区域被其他窗口遮挡,或者全屏模式下,程序最小化,PresentEx函数都会返回S_D3DPRESENTATIONOCCLUDED,全屏程序在收到WM_ACTIVATEAPP消息时会继续渲染。

在以前版本的DX中,当应用程序经历模式改变时,唯一的恢复办法就是reset device并重新创建所有显存资源及swap chain,但是在Vista上的DirectX,在模式改变后调用reset函数,纹理内存不会丢失,纹理渲染状态信息也不会丢失,这些资源都不必重新创建了。


来源:网上现金棋牌游戏平台
你可能感兴趣的:
没有相关文章
我们向您推荐的:
游戏中的情感新一代棋牌游戏设计原则
UI设计原则棋牌类网络游戏UI界面
博雅德州扑克UI设计棋牌游戏设计常用窗口风格
游戏角色概念设定游戏设计中如何构图
什么是游戏场景设计游戏场景的原则
麻将吃碰牌技巧麻将舍牌不丢张技巧
麻将留牌舍牌技巧麻将手牌排列技巧
血战到底麻将如何做牌技巧麻将如何做牌和听牌技巧
麻将实战技巧猜牌篇麻将赢牌技巧切勿过分迷恋手牌诀
麻将必赢技巧密切察视动牌与不动眼睫毛是麻将牌战中的“间谍”

德州扑克与7张梭哈

一位禅师的象棋必胜技

长沙市民教你如何健康

麻将爱情

象棋与围棋

史上最奢华的麻将牌具

如牌

聊聊斗地主
赌博的利和弊揭秘千术道具
马洪刚千术揭秘教学赌博种类
赌博文化心理什么是赌博
策略会透露信息看穿对手的策略
赌博桌上老千局赌石看蟒

百变双扣秘技双扣实战技巧
双扣五点技巧双扣打单牌技巧
双扣中如何推测对方的牌打双扣要勇于担责
双扣要总结经验双扣高手技巧
打双扣的心理因素双扣战局把握能力
棋牌游戏下载 棋牌深海捕鱼

深海捕鱼

游戏视频

棋牌游戏

经验分享

棋牌游戏攻略

斗地主

2010-2013 © 网上现金棋牌游戏平台 版权所有
增值电信业务经营许可证:粤B2-20169873-8 文网文编号:粤网文[2016]789114-088号