原文
+ I* ?% Y# _" k; r8 k j. Y, Ehttp://h31home.com/rss/blogto.asp?id=40921 3 a% u/ w9 b' z" t9 {& G
! ] j) M! Q) d( g; i
PIX Win是DirectX SDK附带的Direct3D程序调试和分析工具,用于D3D应用程序,如果D3D程序的开发者需要收集和分析应用程序对3DAPI的调用和执行信息,此工具是一个很好的选择。例如,用户需要知道某个渲染过程中,后台渲染目标、深度缓冲区、模板缓冲区是否正确地渲染出来了,或者想知道在某帧一个D3D对象是否被正确释放了,可以用这个工具进行调试。当然,此工具不能用于OpenGL程序。本人在一款产品的优化中,使用了此工具,搜索后除了有MSDN文档外,未发现此工具的任何介绍,那这里就以使用者的角度进行简要介绍,希望与使用过和将要使用此工具的朋友交流D3D程序优化的相关经验。
1 q7 V! {6 x4 t/ V8 i. h' i- m# F0 C$ @, H3 m
1.工具界面4 k" D+ Z# }. F' }; u$ n
参考文档:MSDN PIX documentation 6 }; I' m7 u& S L y
8 @: X" t8 ~9 ~
# Z" f* v$ G3 s/ k
0 ?, }6 y/ G+ j8 Q* D 图1 在PIX中创建一个实验
1 I, @, J& u$ z8 a: e8 z3 O3 n- z! L
用PIX创建一个实验,运行后,截取D3D应用程序的调用,可以生成一个调用记录文件。经常的做法是创建一个实验,指定一个快捷键,并设置在按键触发时捕获所API调用,再设置自动保存到实验运行文件(*.PIXrun),而实验设置本身又可以存为一个很小的实验文件(*.PIXexp)。程序退出时或打开实验记录时界面切换到下图的样子。下图是从wikipedia借来的主界面图,图中展示的是程序录制的结果。+ K& F6 f. M% ?" c( Y
( d# D: \3 G3 h; l8 J/ d8 t& U0 `4 F ! C0 n7 B/ k. z5 ?0 u! b
6 |6 S+ k% ? k( ^+ I% y! ]) R* J. X7 k
图2 PIX调试分析界面
8 |4 E2 s+ l/ N& X1 W8 S; [/ F% o/ H, ~* G+ P V" O* N" U
图2中的4个视图分别显示了时间轴,对象列表,事件列表,渲染目标和对象查看视图。 在事件中,可以切换录制的帧,展开树型列表,可以看到在这一帧中对D3D/D3DX函数的调用情况,参数以及返回值。其中蓝色的是地址,代表一个对象指针,点击它可以在右边显示。当选择一个帧时,对象视图中的有些对象变成Alive,这代表这个对象在这一帧中是可用的,双击即可查看。图中选中的是某帧中第2727次函数调用的情况,这是一个SetTexture调用。! ~+ [" k3 k3 z
/ `% o# P- i7 e. |! l渲染和对象查看视图中列出了对象的属性,在上部可以设置过滤和排序,每列显示了他被释放的时间(第几帧),引用计数器、分辨率等信息。需要注意的是,只有在事件列表中选中了某一帧,并且打开了右下角的对象查看器中的Render窗口,才能使对象变成可用,当对象可用时,双击对象列表中的对象或直接双击事件列表中指针,就可以在一个新窗口中显示了。我用的版本可能存在一个bug,显示第2个对象就会崩溃,所以可能需要一个对象查看标签后才能打开下一个对象。图2中右下角视图显示的是一个表面。+ z8 P8 Z) S/ E7 d$ f
. X$ _- F+ C3 ]( u( T
2.实验内容简介7 [4 @5 N6 Y ]9 f: q L% F# g
要使用PIX对应用程序进行测试,需要建立一个个实验,此实验需要设置应用程序的路径和运行参数,另外选择你要测试的项目,所有测试参数选择好之后,就可以开始测试了,这些测试参数可以保存为一个脚本文件,以后可以反复测试。
0 ^, [" e, q. o3 r
) ]; q$ z4 \7 d2 m I此工具的位置:
6 B! a% z# ^4 a7 \+ K& Q" \7 m7 J; ~6 Z6 a# H0 J% h
Microsoft DirectX SDK (June 2006)\Utilities\Bin\x86\PIXWin.exe
7 B/ h/ d& P- n. b. a0 V/ ]. \: [# m' m0 U
此工具的完整文档位于帮助文档的如下位置:+ w2 T' R6 U( z% W
# T I2 \ J b
DirectX Software Development Kit\DirectXTools\PIX- \% j( C; J8 v8 `5 o/ ?
! T1 ~" U z0 t& H* G+ W& i如果打开帮助文档,使用搜索,输入PIX也能很快定位到这部分文档,从开始菜单中可以直接启动该工具。0 U: v1 k. r1 s/ g9 P; S! R
3 e2 [! D. K/ I0 }) Z
本文旨在以用户角度而不是MS角度介绍此工具的使用。8 D# C5 N* a+ R% i1 a% M$ w+ D$ z4 |/ e
% P& b5 R' e% |- t% s
能测试或记录的项目包括:
0 w! ?- W& i* Y( [5 M2 Y F- e6 w
1 Y1 x# D2 K" A# i! f; q(1).每Frame对D3D/D3DX函数的调用,以及参数,可以多次记录单个Frame,也可以记录一段Frame;
a \3 z5 Z. T& G, h: f. X
' A& W8 l+ E& g" q: y. u* Y(2).截取屏幕;
2 N. B( f5 |5 i. I. d9 f* ]. X; H
) _ R8 D% Q* c3 C5 c$ O3 ^(3).每Frame的计数器,以曲线方式显示在屏幕上,包括提交DP,DIP,DUP,DUIP,SetRenderState,SetTexture等请求的数量,的三角形数量,这里,统计的项目可以灵活设置;
" \! }% Y9 Z' R1 \: g
* L7 t+ l" l2 [7 V) y( W6 L(4).设备修改;
. d( X' S1 R% l! B
; L; H5 o: k! o' Z) X(5).拦截Draw调用;- p+ w2 J3 n# O s+ |1 L
1 c1 g+ M' H( y0 |
(6).保存设备状态到文件;) L6 D, B# U/ K( r9 C V* y' D# A
, C- U5 d( l8 N' M7 ?6 W
(7).记录API调用时的数据,包括纹理,顶点和索引的数据,在重绘时,可以查看提交的每个纹理以及纹理的完整数据;
7 l |& h0 ~& Q1 \. @, n/ i, o
2 }1 L: f- P. K3 d) E: I$ ~$ P(8).保存实验记录,将所有试验中处理的数据保存到一个文件中,当然,如果完整记录所有Frame,文件可能比较大,一般只记录关键的几个点。实验记录可以脱离原EXE和资源使用,如果日后需要分析,也只需要这一个文件。
8 i# ~7 a9 {# |4 ~! M! u2 p; u
8 }' q, ^7 y/ u# A' z! d4 \: J实验数据保存后,可以反复查看,其中包括保存的各个帧。0 b: h% M' |7 T# n# o2 K( s" i
& Q, t$ A* N4 P: ]5 [0 E
有了这些测试项目,你可以检查你的应用程序是否提交了正确的状态,释放了不再使用的纹理,如果在某帧一个纹理在某帧还可用,而工具中的渲染窗口还在激活时,此纹理将显示可用,您可以在双击事件列表里的指针或对象表中的条目查看各种数据(顶点,索引,以反汇编形式显示的Shader程序等)表面(纹理,表面等)。 |