Direct3D 11 运行时由层(Layer)构成。
一条基本的准则是在层中添加功能,但不影响已存在的行为。举例来说,核心函数在独立的调试层中有相同的返回值,甚至还会有附加的调试信息。
可调用D3D11CreateDevice 或者 D3D11CreateDeviceAndSwapChain 并提供一个或多个D3D11_CREATE_DEVICE_FLAG值在创建device的同时创建层。
Direct3D 11 提供以下运行时层:
#核心层(Core Layer)
#调试层(Debug Layer)
Core Layer
核心层默认存在,在api和device之间提供一层很薄的映射,最小化高频率调用函数带来的性能影响。核心层的根本是效率,它只做必要的检查。剩下的层是可选的。
Debug Layer
该层提供大量额外的参数和一致性验证(诸如验证着色器连接和资源绑定,参数一致性,提交错误描述等)。
为了建立一个支持调试层的device,用户必须安装DirectX SDK(来获取D3D11SDKLayers.dll),然后在调用D3D11CreateDevice或者D3D11CreateDeviceAndSwapChain时指定D3D11_CREATE_DEVICE_DEBUG 标记。
需要注意的是启用调式层后程序运行会大幅变慢。你可以使用SDK中的DirectX Control Panel来启用或者禁用调试层。当调式层列出内存泄漏时,输出的是一个关联着友好命名的接口指针列表。默认的友好命名是“<unnamed>”。你可以使用ID3D11DeviceChild::SetPrivateData和D3Dcommon.h中的WKPDID_D3DDebugObjectName GUID来设置友好命名。比如用mytexture.jpg命名一个pTexture指针,使用如下代码:
const char c_szName[] = "mytexture.jpg"; pTexture->SetPrivateData( WKPDID_D3DDebugObjectName, sizeof( c_szName ) - 1, c_szName );