原文
5 T% s& c1 x4 g6 S! Vhttp://h31home.com/rss/blogto.asp?id=40921 / R6 d) e, @: h$ [1 m% K$ ?
; |# F3 t) a' P2 W
PIX Win是DirectX SDK附带的Direct3D程序调试和分析工具,用于D3D应用程序,如果D3D程序的开发者需要收集和分析应用程序对3DAPI的调用和执行信息,此工具是一个很好的选择。例如,用户需要知道某个渲染过程中,后台渲染目标、深度缓冲区、模板缓冲区是否正确地渲染出来了,或者想知道在某帧一个D3D对象是否被正确释放了,可以用这个工具进行调试。当然,此工具不能用于OpenGL程序。本人在一款产品的优化中,使用了此工具,搜索后除了有MSDN文档外,未发现此工具的任何介绍,那这里就以使用者的角度进行简要介绍,希望与使用过和将要使用此工具的朋友交流D3D程序优化的相关经验。
5 R9 l) Z, Z: F: x5 r+ e
1 i: X9 W* `) o. a' v1.工具界面0 t8 {5 i# T% p! |3 t4 y
参考文档:MSDN PIX documentation
# @) N9 h p! q* C, b4 A& D & R3 C% R/ I7 H% L2 R3 n
) M }$ o. p6 w- R) B& p I& P5 t# q7 ^# p0 \8 x
图1 在PIX中创建一个实验
- O8 l5 _+ j" N! e8 K( c# L; y
* f/ d; H- }0 I0 m用PIX创建一个实验,运行后,截取D3D应用程序的调用,可以生成一个调用记录文件。经常的做法是创建一个实验,指定一个快捷键,并设置在按键触发时捕获所API调用,再设置自动保存到实验运行文件(*.PIXrun),而实验设置本身又可以存为一个很小的实验文件(*.PIXexp)。程序退出时或打开实验记录时界面切换到下图的样子。下图是从wikipedia借来的主界面图,图中展示的是程序录制的结果。
4 v4 v/ R* P X$ z7 G; i% ]
# v8 i) z" K. Q) U ) E2 m4 X2 i h
+ n: T/ M2 D) P% f. `0 ^0 p0 f% }5 |, h* |: r K) V+ v
图2 PIX调试分析界面
' u+ T" G y; |4 n+ F! F
2 c8 X) J" u# M4 \0 {3 W( s图2中的4个视图分别显示了时间轴,对象列表,事件列表,渲染目标和对象查看视图。 在事件中,可以切换录制的帧,展开树型列表,可以看到在这一帧中对D3D/D3DX函数的调用情况,参数以及返回值。其中蓝色的是地址,代表一个对象指针,点击它可以在右边显示。当选择一个帧时,对象视图中的有些对象变成Alive,这代表这个对象在这一帧中是可用的,双击即可查看。图中选中的是某帧中第2727次函数调用的情况,这是一个SetTexture调用。! X. z" w1 w( R+ s9 l3 S
~9 B5 ~$ ^ U$ O! M+ A渲染和对象查看视图中列出了对象的属性,在上部可以设置过滤和排序,每列显示了他被释放的时间(第几帧),引用计数器、分辨率等信息。需要注意的是,只有在事件列表中选中了某一帧,并且打开了右下角的对象查看器中的Render窗口,才能使对象变成可用,当对象可用时,双击对象列表中的对象或直接双击事件列表中指针,就可以在一个新窗口中显示了。我用的版本可能存在一个bug,显示第2个对象就会崩溃,所以可能需要一个对象查看标签后才能打开下一个对象。图2中右下角视图显示的是一个表面。, k7 T$ Z# P! H3 c" Q4 E
/ S0 i) q2 J0 s( C0 \# v( ~( O2.实验内容简介3 j* Q# l" ?- A, B
要使用PIX对应用程序进行测试,需要建立一个个实验,此实验需要设置应用程序的路径和运行参数,另外选择你要测试的项目,所有测试参数选择好之后,就可以开始测试了,这些测试参数可以保存为一个脚本文件,以后可以反复测试。
L: {8 h0 z) k
9 d' ^7 w4 u& s+ j9 D+ [此工具的位置:1 j ^, j* ~1 D4 s
. ~, U. C& u3 n, K2 C7 k, ^Microsoft DirectX SDK (June 2006)\Utilities\Bin\x86\PIXWin.exe
8 l. {3 q+ P9 c1 y' y1 l" j/ e4 a( D
此工具的完整文档位于帮助文档的如下位置:
8 j6 ]# E; l. j) A6 f/ _+ h% l+ S P% T+ z {" l
DirectX Software Development Kit\DirectXTools\PIX
`1 h5 f% ^5 l8 e: S. o* i ?# h* z' |0 }! L+ ^5 M+ |2 o
如果打开帮助文档,使用搜索,输入PIX也能很快定位到这部分文档,从开始菜单中可以直接启动该工具。
9 G1 g Q# J7 J+ s% X n, I% |+ H/ j" ~; ]1 O' L
本文旨在以用户角度而不是MS角度介绍此工具的使用。- T) }- A) p) S4 q: Z8 F& b
" `; Z! |* }( \0 w能测试或记录的项目包括:
6 d) Z1 w9 Z: e6 i* E2 ]9 O: C7 B; X, J, i5 L7 b1 [$ j
(1).每Frame对D3D/D3DX函数的调用,以及参数,可以多次记录单个Frame,也可以记录一段Frame;
- ^5 G- m) @# \6 l7 V/ A6 k& R: |8 V+ i' \2 {, v
(2).截取屏幕;
* v- p* H" Q8 i. R% l
* I0 Q! p. p( V, F(3).每Frame的计数器,以曲线方式显示在屏幕上,包括提交DP,DIP,DUP,DUIP,SetRenderState,SetTexture等请求的数量,的三角形数量,这里,统计的项目可以灵活设置;
; c; B4 N$ B* T9 |& t% K" h& [1 k
% ^, [$ X* ?, u- Z) |(4).设备修改;
' g. N4 b( C; N+ T, r4 c9 Y8 U" m- M1 b5 I4 l2 V
(5).拦截Draw调用;- z% D- i( C5 \
9 S2 @, Q* C. ^/ t
(6).保存设备状态到文件;
8 N, z* [5 X0 G, r! w
8 \: L& B. m) P' w(7).记录API调用时的数据,包括纹理,顶点和索引的数据,在重绘时,可以查看提交的每个纹理以及纹理的完整数据;6 s. q* q& e! J7 Z J; I
( G4 V6 E# N! n% v(8).保存实验记录,将所有试验中处理的数据保存到一个文件中,当然,如果完整记录所有Frame,文件可能比较大,一般只记录关键的几个点。实验记录可以脱离原EXE和资源使用,如果日后需要分析,也只需要这一个文件。4 g6 q5 T1 k k; |3 n* n
( X6 x6 q4 u* H7 v( w实验数据保存后,可以反复查看,其中包括保存的各个帧。+ s% U s2 p" |8 N: j$ h: A; x
( {3 Y9 n- `3 Q5 V0 b& t& i有了这些测试项目,你可以检查你的应用程序是否提交了正确的状态,释放了不再使用的纹理,如果在某帧一个纹理在某帧还可用,而工具中的渲染窗口还在激活时,此纹理将显示可用,您可以在双击事件列表里的指针或对象表中的条目查看各种数据(顶点,索引,以反汇编形式显示的Shader程序等)表面(纹理,表面等)。 |