DXUT11框架浅析(4)--调试相关




DXUT11框架浅析(4)--调试相关

 

 

 

1. D3D8/9和D3D10/11的调试区别

 

        只要安装了DXSDK,有个调试工具DirectX ControlPanel,如下图所示。这里可以将Direct3D 9设置为调试运行时(Debug D3D9 Runtime)或零售运行时(RetailD3D9 Runtime)。注意这里的设置是全局的,如果改成调试运行时,则所有用到D3D9的程序都会进入调试模式,这会使这些程序运行的很慢。

 

        从Vista开始系统自己的界面都使用D3D做渲染,从而必须改变上面的方法,否则系统很容易卡死。从Direct3D 10.0开始,采用了API分层机制,从而有了SDK Debug Layer用于调试。如果需要调试程序,可以在创建D3D设备时使用D3Dxx_CREATE_DEVICE_DEBUG标记或用上面的Control Panel工具把要调试的程序加入调试列表:

 

 

2. 调试信息输出函数


下面的函数在DXUTmisc.h中定义:


void WINAPI DXUTOutputDebugStringW( LPCWSTRstrMsg, ... );
void WINAPI DXUTOutputDebugStringA( LPCSTRstrMsg, ... );
 
#ifdef UNICODE
#define DXUTOutputDebugString DXUTOutputDebugStringW
#else
#define DXUTOutputDebugString DXUTOutputDebugStringA
#endif

格式化字符串并通过调用API函数OutputDebugString打印调试信息。比如我们在EmptyProject11这个sample的OnD3D11FrameRender中写一句:

DXUTOutputDebugString(L"Test测试\n" );

调试运行,每当运行到这句时,在Output窗口中都会打印出这个调试信息:

 

 


3. D3D结构转成字符串以便于显示

void WINAPI DXUTTraceDecl( D3DVERTEXELEMENT9decl[MAX_FVF_DECL_SIZE]);
WCHAR* WINAPI DXUTTraceD3DDECLUSAGEtoString( BYTE u );
WCHAR* WINAPI DXUTTraceD3DDECLMETHODtoString( BYTE m );
WCHAR* WINAPI DXUTTraceD3DDECLTYPEtoString( BYTE t );
WCHAR* WINAPI DXUTTraceWindowsMessage( UINTuMsg );

 


4. D3D10以上版本调试信息

void DXUT_SetDebugName( IDirect3DResource9* pObj,const CHAR* pstrName )
void DXUT_SetDebugName( IDXGIObject* pObj,const CHAR* pstrName )
void DXUT_SetDebugName( ID3D10Device* pObj,const CHAR* pstrName )
void DXUT_SetDebugName( ID3D10DeviceChild* pObj,const CHAR* pstrName )
void DXUT_SetDebugName( ID3D11Device* pObj,const CHAR* pstrName )
void DXUT_SetDebugName( ID3D11DeviceChild* pObj,const CHAR* pstrName )

为对象指定一个易读的名称,在调试层出现内存泄漏时,可以很容易看到哪个对象出的问题。

 

 


5. PIX辅助调试

#ifdef PROFILE
// PROFILE is defined, so these macros call the D3DPERFfunctions
#define DXUT_BeginPerfEvent( color, pstrMessage)   DXUT_Dynamic_D3DPERF_BeginEvent(color, pstrMessage)
#define DXUT_EndPerfEvent()                         DXUT_Dynamic_D3DPERF_EndEvent()
#define DXUT_SetPerfMarker( color, pstrMessage)    DXUT_Dynamic_D3DPERF_SetMarker(color, pstrMessage)
#else
// PROFILE is not defined, so these macros do nothing
#define DXUT_BeginPerfEvent( color, pstrMessage)   (__noop)
#define DXUT_EndPerfEvent()                         (__noop)
#define DXUT_SetPerfMarker( color, pstrMessage)    (__noop)
#endif
 
class CDXUTPerfEventGenerator

这里实现对D3DPERF_BeginEvent、D3DPERF_BeginEvent、和D3DPERF_BeginEvent三个API的简化使用的封装。主要用于PIX调试Direct3D程序。CDXUTPerfEventGenerator通过类的方式简化了D3DPERF_BeginEvent和D3DPERF_BeginEvent需要配对调用的实现。

 

 

 

参考资料


http://blogs.msdn.com/b/chuckw/archive/2012/11/30/direct3d-sdk-debug-layer-tricks.aspx


http://msdn.microsoft.com/en-us/library/windows/desktop/ff476881(v=vs.85).aspx#Debug

 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值