原文
+ B# p4 x5 Y& t8 O4 {. ?& jhttp://h31home.com/rss/blogto.asp?id=40921
$ m) Y- j0 u [4 {3 Z1 M" x
5 k- ^; R& A; s! R4 I6 k' X5 n3 yPIX Win是DirectX SDK附带的Direct3D程序调试和分析工具,用于D3D应用程序,如果D3D程序的开发者需要收集和分析应用程序对3DAPI的调用和执行信息,此工具是一个很好的选择。例如,用户需要知道某个渲染过程中,后台渲染目标、深度缓冲区、模板缓冲区是否正确地渲染出来了,或者想知道在某帧一个D3D对象是否被正确释放了,可以用这个工具进行调试。当然,此工具不能用于OpenGL程序。本人在一款产品的优化中,使用了此工具,搜索后除了有MSDN文档外,未发现此工具的任何介绍,那这里就以使用者的角度进行简要介绍,希望与使用过和将要使用此工具的朋友交流D3D程序优化的相关经验。& u( c; Y& U# F3 D! u
) N& n! d, X! q) a' E9 y8 Y
1.工具界面( Z, `9 n+ M* E% C* A5 z+ B
参考文档:MSDN PIX documentation I0 n1 N3 i A# S- N8 v& d6 E/ G
! v3 @5 [+ T3 ~% k6 x
% o- n4 W( [& P5 G! v9 `3 L6 I3 W; H, ^, g( m% U7 P$ G
图1 在PIX中创建一个实验
{- j' P" Y- I1 b; x0 u" g, S* s5 O2 B+ M k
用PIX创建一个实验,运行后,截取D3D应用程序的调用,可以生成一个调用记录文件。经常的做法是创建一个实验,指定一个快捷键,并设置在按键触发时捕获所API调用,再设置自动保存到实验运行文件(*.PIXrun),而实验设置本身又可以存为一个很小的实验文件(*.PIXexp)。程序退出时或打开实验记录时界面切换到下图的样子。下图是从wikipedia借来的主界面图,图中展示的是程序录制的结果。- Y# L z' Q6 U, { Y6 U
1 q5 |8 e. e9 \% t1 J( Q9 v2 w$ I* }
9 `- z6 B7 S8 v1 b 4 H! r# s, g8 E5 Z
. @* Q5 p' m+ v5 `* T) D) O; I& K图2 PIX调试分析界面
9 L* H& J' ~: R6 n' ] l
F) ?) P# i1 c1 u# ~图2中的4个视图分别显示了时间轴,对象列表,事件列表,渲染目标和对象查看视图。 在事件中,可以切换录制的帧,展开树型列表,可以看到在这一帧中对D3D/D3DX函数的调用情况,参数以及返回值。其中蓝色的是地址,代表一个对象指针,点击它可以在右边显示。当选择一个帧时,对象视图中的有些对象变成Alive,这代表这个对象在这一帧中是可用的,双击即可查看。图中选中的是某帧中第2727次函数调用的情况,这是一个SetTexture调用。1 m+ ?% K) ]/ m. K/ t
) o8 I( y! k/ b: K, `8 U' m5 ^
渲染和对象查看视图中列出了对象的属性,在上部可以设置过滤和排序,每列显示了他被释放的时间(第几帧),引用计数器、分辨率等信息。需要注意的是,只有在事件列表中选中了某一帧,并且打开了右下角的对象查看器中的Render窗口,才能使对象变成可用,当对象可用时,双击对象列表中的对象或直接双击事件列表中指针,就可以在一个新窗口中显示了。我用的版本可能存在一个bug,显示第2个对象就会崩溃,所以可能需要一个对象查看标签后才能打开下一个对象。图2中右下角视图显示的是一个表面。: { l% E1 W g) g7 E
, e. S7 e0 o2 v, X. n9 [2.实验内容简介: u5 T, f, f) T: M0 g" A4 S1 \
要使用PIX对应用程序进行测试,需要建立一个个实验,此实验需要设置应用程序的路径和运行参数,另外选择你要测试的项目,所有测试参数选择好之后,就可以开始测试了,这些测试参数可以保存为一个脚本文件,以后可以反复测试。
/ {+ S& ?7 B1 z( i7 X1 I* p2 ^3 a. q1 u* U7 S2 D* z4 Y
此工具的位置:
) {" q& c9 F, X& G# {8 c
3 t$ X1 P4 N. p9 @" P5 R1 ]; ]8 CMicrosoft DirectX SDK (June 2006)\Utilities\Bin\x86\PIXWin.exe
- d9 j( x5 R# K$ K( b1 Y- ~1 F/ |* o5 [, S* e4 y, H
此工具的完整文档位于帮助文档的如下位置:; D, w' ]0 W9 \
7 g1 k6 f: O5 d6 lDirectX Software Development Kit\DirectXTools\PIX* ~5 l: }$ L9 M- j! d; Y1 z
/ G8 @3 ?' M6 b+ E& H5 I. k如果打开帮助文档,使用搜索,输入PIX也能很快定位到这部分文档,从开始菜单中可以直接启动该工具。
! {# Z! F( k1 `7 {/ o g: h) N! g4 r/ e9 m! _, Z7 H
本文旨在以用户角度而不是MS角度介绍此工具的使用。
3 d" G: B+ `; q5 n0 H# |. x- E% a1 v" |( C( I) G* ~) _- u
能测试或记录的项目包括:
( a. q- f4 L4 c6 ? J4 y/ q! I7 N, \4 _( q4 g5 `5 j4 P
(1).每Frame对D3D/D3DX函数的调用,以及参数,可以多次记录单个Frame,也可以记录一段Frame;8 B" H! l$ C9 p& B% U
* J! a8 u. N: l% e$ P/ A- `
(2).截取屏幕;
4 K }# L9 H) e8 r7 D( X- _( h8 r" e1 y+ h% }
(3).每Frame的计数器,以曲线方式显示在屏幕上,包括提交DP,DIP,DUP,DUIP,SetRenderState,SetTexture等请求的数量,的三角形数量,这里,统计的项目可以灵活设置;. l( ^ f+ k/ a$ w
* }! l# d8 m# l(4).设备修改;5 w5 I( M" Q4 ]) g/ ^
& q1 S$ R$ o% s- Y0 v9 R& K+ R(5).拦截Draw调用;5 ?8 }$ ~5 I* y; c1 r
, S; ]$ [) z+ `2 o" Q! p(6).保存设备状态到文件;: O& E- j" o0 O" {" J% W( W
$ U, F; g' W8 ^" a. J
(7).记录API调用时的数据,包括纹理,顶点和索引的数据,在重绘时,可以查看提交的每个纹理以及纹理的完整数据;
. X4 W8 ?9 R4 f
$ N( U& G* c$ y. h: t/ H(8).保存实验记录,将所有试验中处理的数据保存到一个文件中,当然,如果完整记录所有Frame,文件可能比较大,一般只记录关键的几个点。实验记录可以脱离原EXE和资源使用,如果日后需要分析,也只需要这一个文件。
P+ }6 l- `; W# G
: u# ~1 Q, _9 p% ]! l( u' f实验数据保存后,可以反复查看,其中包括保存的各个帧。
! {8 u; _9 L( |. T j
" l9 l3 d) Y, j* S有了这些测试项目,你可以检查你的应用程序是否提交了正确的状态,释放了不再使用的纹理,如果在某帧一个纹理在某帧还可用,而工具中的渲染窗口还在激活时,此纹理将显示可用,您可以在双击事件列表里的指针或对象表中的条目查看各种数据(顶点,索引,以反汇编形式显示的Shader程序等)表面(纹理,表面等)。 |