Direct3D中设备丢失处理

来源:互联网 发布:公司监控员工电脑 知乎 编辑:程序博客网 时间:2024/05/17 06:46

 设置丢失

         设备丢失的典型情况:图形显示丢失焦点,例如按下alt+tab键,或者弹出一个系统对话框;调用Reset接口函数的任何错误也会导致设备丢失。丢失后,所有继承自IUnknown的方法仍可以继续正常正作,除了Present()会返回D3DERR_DEVICELOST错误代码。

         处理设备丢失:在重设(reset)丢失的设备之前,必须重新创建所有相关的资源(包括显存!)。在设备丢失后,应查询是否可以将设备恢复(restore) 到工作状态。如果不能,则等行直到设备可以恢复。如果丢失的设备可以恢复,则在恢复之前程序需要销毁所有的显存资源和所有的交换链(swap chains),然后调用Reset()函数恢复设备。Reset函数是设备丢失后设备对象(LPDIRECT3DDEVICE9 device)唯一可以调用的函数。但是,一旦应用程序释放了所有D3DPOOL_DEFAULT内存资源,包括由函数CreateRenderTarget()与CreateDepthStencilSurface()创建的资源,Reset()的调用也将失败.

       大多情况下,DIRECT3D设备对象的许多方法并不返回设备是否丢失的消息,程序可以继续调用图形渲染函数,例如DrawPrimitive(),而不会接收到任何设备已经丢失的消息.在内部,这些操作将被抛弃,直到设备恢复到工作状态.

       在设备丢失后,程序中可以通过调用TestCooperativeLevel()接口函数确定设备是否能够恢复.若返回D3D_OK代码,表示设备可以恢复;若返回D3DERR_DEVICELOST代码,则表示目前设备还不能够被恢复.

       锁定操作:设备丢失后,D3D在内部已经做了大量的工作确保锁定操作成功.但是不能保证在锁定操作期间显存的内容是准确无误的,只能保证不会返回错误代码.这样应用程序就可以继续工作,而不管设备是否丢失.当然,这时并不会渲染出任何图形.

       资源:在设备丢失时,设备与显卡的内存不再相关联,因此,显存里的资源将全部被销毁,必须全部重新创建.而在设备丢失期间,对资源空间的分配也只能在内存上实现,无法在显存上分配内存空间.这些假的表面资源看上去允许正常锁定与复制操作,直到调用present函数会发现设备已经丢失.在从设备丢失状态恢复到正常值时,所有视频内存必须被释放,意味着应用程序需要释放所有由CreateAdditionalSwapChain()函数所创建的交换链和所有D3DPOOL_DEFAULT内存类型的资源,而不用释放D3DPOOL_MANAGED和D3DPOOL_SYSTEMMEM内存类型的资源.(因显存里那些资源可能在设备丢失时被改动过了,必须释放后重新申请,并载入).

       有关设备丢失的返回数据:ValidateDevice()确认硬件一次渲染纹理混合和渲染状态的能力,如果设备丢失,它会返回D3DERR_DEVICELOST; D3D允许显存资源数据到系统内存的传输,如果设备丢失,会导致传输的失败. IDirect3DQuery9::GetData()可指定FLUSH标记,如果丢失设备,它也会返回D3DERR_DEVICELOST; 另外,既然设备丢失时没有主表面,那么调用Direct3DDevice9::GetFrontBufferData()也会失败. 因为设备丢失,无法创建后备缓冲,故CreateAddtionalSwapChain()也会失败.这些情况再加上Presnet(), TestCooperative(), Reset(),只会在设备丢失时出现.

       可编程渲染器:在D3D9中,设备从丢失到正常时,VS与PS不需要重新创建,D3D能自动恢复它们.在以前的版本中则需要重新创建.

原创粉丝点击