原文: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中定义:

  1. void WINAPI DXUTOutputDebugStringW( LPCWSTRstrMsg, ... );
  2. void WINAPI DXUTOutputDebugStringA( LPCSTRstrMsg, ... );
  3. #ifdef UNICODE
  4. #define DXUTOutputDebugString DXUTOutputDebugStringW
  5. #else
  6. #define DXUTOutputDebugString DXUTOutputDebugStringA
  7. #endif

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

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

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

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

  1. void WINAPI DXUTTraceDecl( D3DVERTEXELEMENT9decl[MAX_FVF_DECL_SIZE]);
  2. WCHAR* WINAPI DXUTTraceD3DDECLUSAGEtoString( BYTE u );
  3. WCHAR* WINAPI DXUTTraceD3DDECLMETHODtoString( BYTE m );
  4. WCHAR* WINAPI DXUTTraceD3DDECLTYPEtoString( BYTE t );
  5. WCHAR* WINAPI DXUTTraceWindowsMessage( UINTuMsg );

4. D3D10以上版本调试信息

  1. void DXUT_SetDebugName( IDirect3DResource9* pObj,const CHAR* pstrName )
  2. void DXUT_SetDebugName( IDXGIObject* pObj,const CHAR* pstrName )
  3. void DXUT_SetDebugName( ID3D10Device* pObj,const CHAR* pstrName )
  4. void DXUT_SetDebugName( ID3D10DeviceChild* pObj,const CHAR* pstrName )
  5. void DXUT_SetDebugName( ID3D11Device* pObj,const CHAR* pstrName )
  6. void DXUT_SetDebugName( ID3D11DeviceChild* pObj,const CHAR* pstrName )<span style="font-size:18px;">
  7. </span>

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

5. PIX辅助调试

  1. #ifdef PROFILE
  2. // PROFILE is defined, so these macros call the D3DPERFfunctions
  3. #define DXUT_BeginPerfEvent( color, pstrMessage)   DXUT_Dynamic_D3DPERF_BeginEvent(color, pstrMessage)
  4. #define DXUT_EndPerfEvent()                         DXUT_Dynamic_D3DPERF_EndEvent()
  5. #define DXUT_SetPerfMarker( color, pstrMessage)    DXUT_Dynamic_D3DPERF_SetMarker(color, pstrMessage)
  6. #else
  7. // PROFILE is not defined, so these macros do nothing
  8. #define DXUT_BeginPerfEvent( color, pstrMessage)   (__noop)
  9. #define DXUT_EndPerfEvent()                         (__noop)
  10. #define DXUT_SetPerfMarker( color, pstrMessage)    (__noop)
  11. #endif
  12. 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

【转载】DXUT11框架浅析(4)--调试相关的更多相关文章

  1. CI框架浅析

    CI框架浅析(全篇)     业余花了点时间看看CodeIgniter框架(简称CI),CI目前的稳定版本是 3.X,4.0版本已经出来了,但还在测试中,所以我分析的还是 3.x 版本. CI是一个很 ...

  2. MVC框架浅析(基于PHP)

    MVC框架浅析(基于PHP) MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数 ...

  3. CI框架浅析(二)

    该文延续上篇文章: CI框架浅析(一) 在CI框架的核心库中,CodeIgniter.php负责加载所有需要的类库,第一个加载的是公共库 core/Common.php Common.php 负责加载 ...

  4. Android Otto框架浅析

    今天要介绍的是一个Android中使用得比較多的android 事件总线 EventBus模式的一个框架Otto. Otto 官网:http://square.github.io/otto/ 一.An ...

  5. Python的Django框架中的Cookie相关处理

    Python的Django框架中的Cookie相关处理 浏览器的开发人员在非常早的时候就已经意识到. HTTP's 的无状态会对Web开发人员带来非常大的问题,于是(cookies)应运而生. coo ...

  6. Eclipse调试相关

    Eclipse调试相关 F5 step into就是单步执行,遇到子函数就进入并且继续单步执行. F6 step over是在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个 ...

  7. 转载文章----.NET 框架浅析

    转载地址:http://www.cnblogs.com/yangmingming/archive/2010/01/27/1657850.html .NET 框架概要: .NET框架,即.NET Fra ...

  8. 【转载】.NET 框架浅析

    经过了对C#较长时间的学习以及实践,不断地感受着.NET 框架--这个最本质,然而却似乎让人捉摸不透的概念.特别是经过拜读Anytao博主的<你必须知道的.NET>文章,使我对其概念关系得 ...

  9. OSGI.NET 框架浅析

    关于osgi.net ,想必大家也听说过,以下是自己在学习osgi.net 过程中整理出来的内容,供大家学习参与使用. 1.  UIOSP 开放工厂框架架构 开放工厂所有插件基于OSGi.NET面向服 ...

随机推荐

  1. 数据库连接池及并发库Theron

  2. 【Java虚拟机结构(第1部分)数据类型】摘要

    <Java虚拟机规范(Java SE 7版)>作者:Tim Lindholm.Frank Yellin.Gilad Bracha.Alex Buckley 摘要:第二章 Java虚拟机结构 ...

  3. js 键盘点击事件

    回车键(Enter)的触发事件  js 代码如下: document.onkeydown = function (e) { if (!e) e = window.event; if ((e.keyCo ...

  4. CVPR2018_Crafting a Toolchain for Image Restoration by Deep Reinforcement Learning

    CVPR2018_Crafting a Toolchain for Image Restoration by Deep Reinforcement Learning http://mmlab.ie.c ...

  5. Java SPI(Service Provider Interface)

    SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制. 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个 ...

  6. Android 配置文件 AndroidManifest 解析

    1.屏幕分辨率 <supports-screens android:smallScreens="true" android:normalScreens="true& ...

  7. HDU 1102(Constructing Roads)(最小生成树之prim算法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1102 Constructing Roads Time Limit: 2000/1000 MS (Ja ...

  8. 404 Note Found队-现场编程

    目录 组员职责分工 github 的提交日志截图 程序运行截图 程序运行环境 GUI界面 基础功能实现 运行视频 LCG算法 过滤(降权)算法 算法思路 红黑树 附加功能一 背景 实现 附加功能二(迭 ...

  9. 大话Linux内核中锁机制之信号量、读写信号量

    大话Linux内核中锁机制之信号量.读写信号量 在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实 ...

  10. 1006.Sign in and Sign out(25)—PAT 甲级

    At the beginning of every day, the first person who signs in the computer room will unlock the door, ...