丢失的设备(Direct3D 9)
Direct3D 设备可以处于作状态或丢失状态。 作状态是设备运行并按预期显示所有呈现的设备正常状态。 当事件(如全屏应用程序中键盘焦点丢失)导致呈现变得不可能时,设备将转换为丢失状态。 丢失状态的特点是所有呈现作的无提示失败,这意味着即使呈现作失败,呈现方法也可以返回成功代码。 在这种情况下,IDirect3DDevice9::P resent返回错误代码D3DERR_DEVICELOST。
根据设计,未指定可能导致设备丢失的完整方案集。 一些典型示例包括焦点丢失,例如当用户按下 Alt+TAB 或初始化系统对话框时。 设备也可能因为电源管理事件而丢失,或者当另一个应用程序假定全屏作时。 此外,IDirect3DDevice9::Reset 的任何故障都会使设备处于丢失状态。
从 IUnknown派生自的所有方法都保证在设备丢失后正常工作。 设备丢失后,每个函数通常具有以下三个选项:
- 失败并出现D3DERR_DEVICELOST - 这意味着应用程序需要识别设备丢失,以便应用程序识别出未按预期发生的情况。
- 无提示失败,返回S_OK或任何其他返回代码 - 如果函数以无提示方式失败,则应用程序通常无法区分“成功”和“无提示失败”的结果。
- 该函数返回返回代码。
Direct3D 9 和 Direct3D 9Ex 之间的差异: Direct3D 9 设备返回D3DERR_DEVICELOST。 从 IDirect3DDevice9::P resent返回后,仿真行为将不再运行,所有将来的调用都将失败,直到设备成功重置。 Direct3D 9Ex 设备永远不会返回D3DERR_DEVICELOST,但可以返回新的状态消息(请参阅 设备行为更改)。 |
响应丢失的设备
重置设备后,丢失的设备必须重新创建资源(包括视频内存资源)。 如果设备丢失,应用程序会查询设备以查看是否可以将其还原到作状态。 否则,应用程序会等到可以还原设备为止。
如果可以还原设备,应用程序将通过销毁所有视频内存资源和任何交换链来准备设备。 然后,应用程序调用 IDirect3DDevice9::Reset 方法。 重置是设备丢失时唯一有效的方法,也是应用程序唯一可将设备从丢失状态更改为作状态的方法。 除非应用程序释放D3DPOOL_DEFAULT中分配的所有资源,包括由 IDirect3DDevice9::CreateRenderTarget 和 IDirect3DDevice9::CreateDepthStencilSurface 方法创建的资源,否则重置将失败。
在大多数情况下,Direct3D 的高速调用不会返回有关设备是否已丢失的任何信息。 应用程序可以继续调用呈现方法,例如 IDirect3DDevice9::D rawPrimitive,而不会收到丢失设备的通知。 在内部,这些作将被丢弃,直到设备重置为作状态。
应用程序可以通过查询 IDirect3DDevice9::TestCooperativeLevel 方法的返回值来确定在遇到丢失的设备时该怎么办。
锁定作
在内部,Direct3D 执行足够的工作,以确保在设备丢失后锁定作会成功。 但是,不能保证视频内存资源的数据在锁定作期间准确。 可以保证不会返回任何错误代码。 这样,应用程序就可以在锁定作期间编写应用程序,而不必担心设备丢失。
资源
资源可以使用视频内存。 由于丢失的设备与适配器拥有的视频内存断开连接,因此无法保证在设备丢失时分配视频内存。 因此,所有资源创建方法都通过返回D3D_OK来实现,但实际上只分配虚拟系统内存。 由于在调整设备大小之前必须销毁任何视频内存资源,因此分配视频内存没有问题。 这些虚拟表面允许锁和复制作正常运行,直到应用程序调用 IDirect3DDevice9::P resent 并发现设备已丢失。
必须先释放所有视频内存,然后设备才能从丢失状态重置为作状态。 这意味着应用程序应释放使用 IDirect3DDevice9::CreateAdditionalSwapChain 创建的任何交换链,以及放置在D3DPOOL_DEFAULT内存类中的任何资源。 应用程序不需要释放D3DPOOL_MANAGED或D3DPOOL_SYSTEMMEM内存类中的资源。 其他状态数据通过转换为作状态自动销毁。
建议使用单个代码路径开发应用程序,以响应设备丢失。 此代码路径可能与启动时初始化设备所用的代码路径类似(如果不同)。
检索的数据
Direct3D 允许应用程序使用 IDirect3DDevice9::ValidateDevice根据硬件的单一传递呈现来验证纹理和呈现状态。 此方法通常在应用程序初始化期间调用,如果设备丢失,将返回D3DERR_DEVICELOST。
Direct3D 还允许应用程序将生成的或以前写入的图像从视频内存资源复制到非易失系统内存资源。 由于此类传输的源映像可能随时丢失,因此 Direct3D 允许在设备丢失时此类复制作失败。
对于异步查询,如果指定 FLUSH 标志,则 IDirect3DQuery9::GetData 返回D3DERR_DEVICELOST,以便向 IDirect3DQuery9::GetData 的应用程序指示永远不会返回S_OK。
复制作(IDirect3DDevice9::GetFrontBufferData)可能会失败,D3DERR_DEVICELOST,因为设备丢失时没有主图面。 IDirect3DDevice9::CreateAdditionalSwapChain 也可能失败,D3DERR_DEVICELOST因为设备丢失时无法创建后台缓冲区。 请注意,这些情况是 IDirect3DDevice9::P resent、IDirect3DDevice9::TestCooperativeLevel之外的唯一D3DERR_DEVICELOST实例,IDirect3DDevice9::Reset 方法。
可编程着色器
在 Direct3D 9 中,重置后无需重新创建顶点着色器和像素着色器。 他们会记住的。 在早期版本的 DirectX 中,需要重新创建丢失的设备着色器。
相关主题