【转载】DXUT11框架浅析(4)--调试相关

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

[cpp] view plain copy

  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结构转成字符串以便于显示

[cpp] view plain copy

  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以上版本调试信息

[cpp] view plain copy

  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辅助调试

[cpp] view plain copy

  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

时间: 2024-08-25 15:31:45

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

AndroidaidlBinder框架浅析(转载)

AndroidaidlBinder框架浅析 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38461079 ,本文出自[张鸿洋的博客] 1.概述 Binder能干什么?Binder可以提供系统中任何程序都可以访问的全局服务.这个功能当然是任何系统都应该提供的,下面我们简单看一下Android的Binder的框架 Android Binder框架分为服务器接口.Binder驱动.以及客户端接口:简单想一下,需要提供一个全局服务,

React Native Android 源码框架浅析(主流程及 Java 与 JS 双边通信)

[工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果.私信联系我] 1 背景 有了前面<React Native Android 从学车到补胎和成功发车经历>和<React Native Android Gradle 编译流程浅析>两篇文章的学习我们 React Native 已经能够基本接入处理一些事情了,那接下来的事情就是渐渐理解 RN 框架的一些东西,以便裁剪和对 RN 有个更深入的认识,所以本篇总结了我这段时间阅读源码

Android aidl Binder框架浅析

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38461079 ,本文出自[张鸿洋的博客] 1.概述 Binder能干什么?Binder可以提供系统中任何程序都可以访问的全局服务.这个功能当然是任何系统都应该提供的,下面我们简单看一下Android的Binder的框架 Android Binder框架分为服务器接口.Binder驱动.以及客户端接口:简单想一下,需要提供一个全局服务,那么全局服务那端即是服务器接口,任何程序即客

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

Python的Django框架中的Cookie相关处理 浏览器的开发者在很早的时候就已经意识到, HTTP's 的无状态会对Web开发者带来很大的问题,于是(cookies)应运而生. cookies 是浏览器为 Web 服务器存储的一小段信息. 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies 来看看它是怎么工作的. 当你打开浏览器并访问 google.com ,你的浏览器会给Google发送一个HTTP请求,起始部分就象这样: GET / HTTP/1.1 Host:

通信框架浅析--google protobuf vs facebook thirft

protobuf 请参考下面这篇文章 http://blog.csdn.net/hguisu/article/details/20721109 WINDOWS配置THRIFT开发环境 1)安装thrift:到thrift官网下载exe文件,然后将文件重命名为thrift.exe,拷贝到c:\windows目录下(或者任何目录下),然后就可以在dos环境下使用了 c:\windows>thrift -gen java D:\mywork\javaProject\thriftTest\test.th

GreenDao开源ORM框架浅析

Android程序开发中,避免不了要用到数据库,我们都知道android提供了内置的Sqlite,即调用SQLiteOpenHelper的方法,来操作数据库,但是使用过程较为繁琐,从建表到对表中数据的正删改查操作,需要大量的代码来建立表,和完成这些操作. GreenDao居然是ORM框架,它跟hibernate是很像的,就是当你配置了一些参数信息之后,可以由框架来帮你生成对应的实体类,还有生成对应的操作实体类的代码(自动建表和基本的增删改查). 优点: 1.最大性能(最快的Android ORM

CI框架浅析(二)

该文延续上篇文章: CI框架浅析(一) 在CI框架的核心库中,CodeIgniter.php负责加载所有需要的类库,第一个加载的是公共库 core/Common.php Common.php 负责加载以下公共方法: 方法名 注释 is_php($version) 判断$version是否小于或等于当前安装的PHP版本 is_really_writable($file) 判断该文件是否可写 load_class($class, $directory = 'libraries', $param =

MVC框架浅析(基于PHP)

MVC框架浅析(基于PHP) MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面 显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于 映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 一.MVC概念 MVC 是一种使用 MVC(Model View Contr

浅析LUM及相关实验

浅析LVM及相关实验 LVM(Logical Volume Manager)是一个磁盘管理子系统,将一个或者多个底层设备组织成逻辑设备.在LVM里,一个或者多个PV组成一个VG(Volume Group,卷组),而从一个VG里又可以虚拟划分出若干个LV(Logical Volume,逻辑)卷), 如下示意图 其底层设备划分成分区PE,单个PE默认大小为4M,可取值4M,8M,12M,16M 为2的整数倍. 在pv ,vg ,lv之下的操作,有一些命令 pv:  pvcreate, pvs, pv