(Direct3D 10) 的 API 层
Direct3D 10 运行时使用层构造,从核心的基本功能开始,在外部层中构建可选和开发人员辅助功能。
核心层
核心层默认存在;在 API 和设备驱动程序之间提供非常精简的映射,从而最大程度地减少高频率调用的开销。 由于核心层对性能至关重要,因此它只执行关键验证。
其余层是可选的。 一般情况下,层会添加功能,但不修改现有行为。 例如,核心函数将具有相同的返回值,独立于正在实例化的调试层,但如果实例化调试层,可能会提供其他调试输出。
通过调用 D3D10CreateDevice 并提供一个或多个 D3D10_CREATE_DEVICE_FLAG 值来创建设备时创建层。
调试层
调试层提供大量额外参数和一致性验证(例如,验证着色器链接和资源绑定、验证参数一致性和报告错误说明)。 调试层生成的输出包含可以使用 ID3D10InfoQueue 接口 访问的字符串队列 (请参阅 使用 ID3D10InfoQueue (Direct3D 10) ) 自定义调试输出 。 调试层会突出显示核心层生成的错误,并显示警告。
若要创建支持调试层的设备,必须安装 DirectX SDK (以获取D3D10SDKLayers.DLL) ,然后在调用 D3D10CreateDevice 时指定D3D10_CREATE_DEVICE_DEBUG标志。 当然,使用调试层运行应用程序的速度要慢很多。 若要为 D3DX10 API 启用/禁用调试消息,请调用 D3DX10DebugMute。
当调试层列出内存泄漏时,会输出对象接口指针的列表及其友好名称。 默认友好名称是“<unnamed>”。 可以使用 ID3D10DeviceChild::SetPrivateData 方法和 D3Dcommon.h 中的 WKPDID_D3DDebugObjectName GUID 设置友好名称。 例如,若要使用 sdkLayer 名称mytexture.jpg命名 pTexture,请使用以下代码:
const char c_szName[] = "mytexture.jpg";
pTexture->SetPrivateData( WKPDID_D3DDebugObjectName, sizeof( c_szName ) - 1, c_szName );
通常,应在生产版本之外编译这些调用。
切换到引用层
此层使应用程序能够在硬件设备 (HAL) 与引用或软件设备 (REF) 之间转换。 若要切换设备,必须首先创建支持交换机到引用层的设备 (请参阅 D3D10CreateDevice) ,然后调用 ID3D10SwitchToRef::SetUseRef。
所有设备状态、资源和对象都通过此设备转换进行维护。 但是,有时无法完全匹配资源数据。 这是因为某些信息可用于硬件设备,而参考设备不可用。
几乎所有实时应用程序都使用管道的 HAL 实现。 当管道从硬件设备切换到引用设备时,呈现操作同时在硬件和软件中完成。 软件设备呈现时,需要将资源下载到系统内存。 这可能需要逐出系统内存中缓存的其他资源来腾出空间。
注意
此切换到引用层功能仅在 Direct3D 10 和 Direct3D 10.1 中受支持,在 Direct3D 11 及更高版本中不再受支持。
Thread-Safe层
此层旨在允许多线程应用程序从多个线程访问设备。
Direct3D 10 应用程序可以使用设备功能控制设备同步。 这使应用程序能够启用/禁用关键部分, (暂时启用/禁用) 的多线程保护,并通过多个 Direct3D 10 API 入口点获取/释放关键部分锁。 默认情况下,线程安全层处于启用状态。 对于单线程应用程序,线程安全层对性能没有影响。
Direct3D 9 与 Direct3D 10 之间的差异:
- 与 Direct3D 9 不同,Direct3D 10 API 默认为完全线程安全。
相关主题