当前位置:   article > 正文

d3d设备丢失

晶核报错提示 d3d设备丢失
设备丢失的典型情况:图形显示丢失焦点,例如按下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能自动恢复它们.在以前的版本中则需要重新创建.

转载于:https://www.cnblogs.com/lancidie/archive/2011/03/30/1999891.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/760072
推荐阅读
相关标签
  

闽ICP备14008679号