d3d设备基础

来源:互联网 发布:pre视频软件 编辑:程序博客网 时间:2024/04/29 16:50

1.d3d 设备创建时,类型主要有两种,HAL(硬件抽象层)和REF(引用设备),前者基于硬件支持,速度会很快,但是不一定支持所有的d3d特征,后者,虽然没有硬件加速,速度很慢,但是能支持所有的

d3d特征,一般情况下使用HAL,在出问题时,可以改成REF,如果问题不存在了,说明是硬件功能问题或显卡驱动问题,如果问题还存在,则说明是应用程序的问题:( 。
2.使用HAL设备时,可以使用硬件顶点处理,也可以使用软件顶点处理,(顶点处理包括,变换和光照),一般先使用硬件处理,如果失败则使用mixed方式处理,如果还失败,则使用软件处理,再失败

则报错或放弃。
3.使用同一个Direct3D对象可以创建多个渲染设备,这多个设备之间共享一个物理资源,
此时性能会急剧下降。
4.创建设备后,要设置它的状态.
5.create,release,reset 设备要在同一个线程中实现。
6.全屏调试可以使用DirectX Control Panel Tool,来启动多显示器调试。
7.一般窗口模式的应用程序在创建设备后需要处理一下步骤:
  <1>确定桌面客户端区域的大小。
  <2>一般都设置D3DADAPTER_DEFAULT;
  <3>一般都调用IDirect3D9::CheckDeviceType来确定设备是否能支持绘制指定格式的后     台buffer.而IDirect3D9::GetAdapterDisplayMode用来确定桌面显示格式。
8.关于设备丢失:

<1>设备有两种状态,正常状态和丢失状态。正常状态就是设备能正常运行并且预期渲染的状态。当发生以下事件时有可能会引起设备丢失,比如全屏应用程序失去键盘焦点时,这时会导致渲染失败。设

备丢失状态的特点是,所有渲染函数沉默失败,也就是,即使绘制操作失败了,但是绘制函数返回success。在这种情况下,IDirect3DDevice9::Present
返回的错误代码为D3DERR_DEVICELOST。

<2>引起设备丢失的情况有,

(1)失去焦点,例如,按下alt+tab或一个系统对话框初始化出现。
(2)电源管理事件。
(3)其它应用程序进行全屏操作。
(4)所有的IDirect3DDevice9::Reset返回失败时都会引起设备丢失。

<3>在设备丢失后,所有的派生自IUnknown的方法都能保证工作。

<4>在设备丢失后,每个函数一般有以下三种返回:
(1)失败,并返回D3DERR_DEVICELOST ,应用程序认为函数执行失败。
(2)沉默失败,返回S_OK,或其它返回码,如果一个函数沉默失败,则应用程序并不区分沉默失败和成功。
(3)其它返回码。

<5>设备丢失处理:
(1)一个丢失的设备在它被reset后,需要重建资源,包括显卡资源。当一个设备丢失时,应用程序会查询设备,检测它是否能被恢复,如果不能,则应用程序必须等待直到设备可以被恢复。
(2)如果一个设备可以被恢复,应用程序通过销毁所有的显卡资源和所有的交换链,来为设备作准备。然后,应用程序调用reset方法。该方法是唯一能再设备丢失后起效果的函数,也是唯一能恢复设备

状态的函数。该函数会失败,如果应用程序没有完全释放在D3DPOOL_DEFAULT中分配的资源,包括由IDirect3DDevice9::CreateRenderTarget 和IDirect3DDevice9::CreateDepthStencilSurface方法创建

的资源。
(3)在大多数情况下,频繁调用的d3d函数,比如绘制函数,并不会返回任何有关设备是否丢失的信息。应用程序会继续调用绘制方法,例如IDirect3DDevice9::DrawPrimitive,并不会注意设备是否丢失

。应用程序可以通过查询IDirect3DDevice9::TestCooperativeLevel方法的返回值,来决定在遇到设备丢失时要做什么处理。

<6>锁操作:
d3d做了充足的工作来保证在设备丢失之后锁操作返回succeed。然而,并不保证显存资源数据在锁操作期间的准确性。但是能保证锁操作不返回错误代码。这允许应用程序可以被写入,在锁操作期间不

用关心是否设备丢失。

<7>资源:
资源可以消耗显存。由于丢失的设备与显存已经失去了联系,所以在设备丢失期间是无法保证显存的分配正确性的。这就导致了,所有的资源创建函数通过返回D3D_OK标示执行成功,但是实际上只是分

配了虚拟内存。因为任何显存资源在设备恢复之前都是要被销毁的。这些虚拟表面允许锁操作和拷贝操作来显示函数的正常性,直到应用程序调用函数IDirect3DDevice9::Present 发现设备已经丢失为

止。

<8>获取数据:
d3d允许应用程序使用IDirect3DDevice9::ValidateDevice.方法来在硬件绘制单pass时,检查纹理和绘制状态的有效性。这个方法在应用程序初始化时会被调用,如果失败丢失会返回D3DERR_DEVICELOST


d3d允许应用程序从显存中把已经生成的或先前写的图片拷贝到常量系统内存资源区。由于这种图片拷贝有可能会遇到设备丢失,d3d允许在设备丢失时拷贝函数返回fail。
拷贝操作,IDirect3DDevice9::GetFrontBufferData可以返回D3DERR_DEVICELOST ,因为当设备丢失时,没有主surface。IDirect3DDevice9::CreateAdditionalSwapChain 也可以返回

D3DERR_DEVICELOST来表示失败,因为在设备丢失时,backbuffer无法创建。注意上面说的这三种情况是除了IDirect3DDevice9::Present, IDirect3DDevice9::TestCooperativeLevel, 和

IDirect3DDevice9::Reset 之外唯一能返回D3DERR_DEVICELOST 的三种方法。

<9>可编程shader
在d3d9中顶点shader和像素shader,在reset后不需要重新创建。而在以前的directX版本中是需要重新创建的。

 

原创粉丝点击