原文; F0 V, l8 h4 _4 P4 Q& ], \! L2 V
http://h31home.com/rss/blogto.asp?id=40921 6 Z1 S: Q* w/ \/ ^$ a4 w3 |, y
: t9 k- a+ }0 A1 D% `. p; R
PIX Win是DirectX SDK附带的Direct3D程序调试和分析工具,用于D3D应用程序,如果D3D程序的开发者需要收集和分析应用程序对3DAPI的调用和执行信息,此工具是一个很好的选择。例如,用户需要知道某个渲染过程中,后台渲染目标、深度缓冲区、模板缓冲区是否正确地渲染出来了,或者想知道在某帧一个D3D对象是否被正确释放了,可以用这个工具进行调试。当然,此工具不能用于OpenGL程序。本人在一款产品的优化中,使用了此工具,搜索后除了有MSDN文档外,未发现此工具的任何介绍,那这里就以使用者的角度进行简要介绍,希望与使用过和将要使用此工具的朋友交流D3D程序优化的相关经验。 h" g0 H W2 E2 E) A
. W, b% X0 `5 g1.工具界面" r# n/ d0 K1 X6 O4 i! B( A m
参考文档:MSDN PIX documentation
1 c* } d/ K" Z+ F $ X) l5 g+ \* _3 x- g. d- Q
8 W+ o: `+ \% t* Y9 O/ b# Y! s5 ~$ X7 J% e" a7 D( l/ o
图1 在PIX中创建一个实验! H3 u7 y& J- c6 o& Z& x6 I
' k% K) Z- y. H: y H7 b$ N4 b- `
用PIX创建一个实验,运行后,截取D3D应用程序的调用,可以生成一个调用记录文件。经常的做法是创建一个实验,指定一个快捷键,并设置在按键触发时捕获所API调用,再设置自动保存到实验运行文件(*.PIXrun),而实验设置本身又可以存为一个很小的实验文件(*.PIXexp)。程序退出时或打开实验记录时界面切换到下图的样子。下图是从wikipedia借来的主界面图,图中展示的是程序录制的结果。" p/ N; U, J- }* R/ R4 `0 n% O
$ W; W, Y7 a5 J0 |0 I5 \' j + Z5 |# }: R" x$ t) h
1 g) X9 t( @+ [: ^9 `) N
R$ ?* e5 m, i2 } C- P9 i2 M图2 PIX调试分析界面* F) \7 B a( n! Q! I7 } a0 e' w* K
0 e. L7 J& q$ E! D图2中的4个视图分别显示了时间轴,对象列表,事件列表,渲染目标和对象查看视图。 在事件中,可以切换录制的帧,展开树型列表,可以看到在这一帧中对D3D/D3DX函数的调用情况,参数以及返回值。其中蓝色的是地址,代表一个对象指针,点击它可以在右边显示。当选择一个帧时,对象视图中的有些对象变成Alive,这代表这个对象在这一帧中是可用的,双击即可查看。图中选中的是某帧中第2727次函数调用的情况,这是一个SetTexture调用。, @4 N: s U4 B
3 K" M. \+ i) I' _! w) D3 f; J渲染和对象查看视图中列出了对象的属性,在上部可以设置过滤和排序,每列显示了他被释放的时间(第几帧),引用计数器、分辨率等信息。需要注意的是,只有在事件列表中选中了某一帧,并且打开了右下角的对象查看器中的Render窗口,才能使对象变成可用,当对象可用时,双击对象列表中的对象或直接双击事件列表中指针,就可以在一个新窗口中显示了。我用的版本可能存在一个bug,显示第2个对象就会崩溃,所以可能需要一个对象查看标签后才能打开下一个对象。图2中右下角视图显示的是一个表面。7 B# q$ V: T$ C7 i5 d1 T+ a& w
( E- O+ z% C3 | h- I# f4 m2.实验内容简介
" g' o9 z2 X7 b, E要使用PIX对应用程序进行测试,需要建立一个个实验,此实验需要设置应用程序的路径和运行参数,另外选择你要测试的项目,所有测试参数选择好之后,就可以开始测试了,这些测试参数可以保存为一个脚本文件,以后可以反复测试。6 K/ [9 w2 v7 `0 u
A/ X7 \, u. O+ k* N" X) `此工具的位置:
* ~- v2 n8 }$ Y" O: x% N9 ?, B9 A2 P4 [; W% x; u
Microsoft DirectX SDK (June 2006)\Utilities\Bin\x86\PIXWin.exe
' p; A: G7 G1 ]5 @: x* y& U- Y. y) W
7 P# W) E$ S4 l/ k$ \# h$ U此工具的完整文档位于帮助文档的如下位置:
$ {" `+ R( y$ D; v. a4 L7 J2 O' H* `4 U0 y3 J
DirectX Software Development Kit\DirectXTools\PIX
, D3 E/ ?+ P5 x8 G5 E# H O! R& w8 ]/ e' @/ n
如果打开帮助文档,使用搜索,输入PIX也能很快定位到这部分文档,从开始菜单中可以直接启动该工具。$ t8 M; L* E' l
1 |# M% j3 f, ^8 ^* N5 u6 b$ g
本文旨在以用户角度而不是MS角度介绍此工具的使用。
! ]1 ?2 V, C( w( H3 f: ]/ q
7 `: S1 H& W& B3 x1 ~2 g+ r2 y3 Z能测试或记录的项目包括:9 i/ _ S1 k5 x
: W, \" G4 j) s) d2 j( F(1).每Frame对D3D/D3DX函数的调用,以及参数,可以多次记录单个Frame,也可以记录一段Frame;8 p) c! I: z( \7 w. r
# p( l G9 y3 C) T, H
(2).截取屏幕;
9 A3 t% S( |. c' k3 e
, @" i7 ]# o( w! z+ w2 T) T0 f(3).每Frame的计数器,以曲线方式显示在屏幕上,包括提交DP,DIP,DUP,DUIP,SetRenderState,SetTexture等请求的数量,的三角形数量,这里,统计的项目可以灵活设置;
. S0 x. W3 s9 v$ A$ {
4 L# j$ W* \7 z, }(4).设备修改;" A {1 `6 [* Z
. @' o6 \# g) ]4 `(5).拦截Draw调用;, ]0 h3 h6 X5 g% g! _
1 u" F; i% Q2 W0 t: H: t
(6).保存设备状态到文件;# C1 }7 C. N& X ]: N* v7 ?
: I2 j& H* I! ~" c% v; O* Y
(7).记录API调用时的数据,包括纹理,顶点和索引的数据,在重绘时,可以查看提交的每个纹理以及纹理的完整数据;3 N0 T( w$ A1 F. H) v! z7 p- L
5 F5 ^6 ?9 Y. ?: I# a' O; \; j(8).保存实验记录,将所有试验中处理的数据保存到一个文件中,当然,如果完整记录所有Frame,文件可能比较大,一般只记录关键的几个点。实验记录可以脱离原EXE和资源使用,如果日后需要分析,也只需要这一个文件。
' W# E. {+ i3 \2 h# q4 H
6 J& {+ c& R3 O1 K$ C: O, e实验数据保存后,可以反复查看,其中包括保存的各个帧。
J Q! z' a6 z; X# @( M
; W; `( f+ Q3 _( i3 C' s" k- u6 [有了这些测试项目,你可以检查你的应用程序是否提交了正确的状态,释放了不再使用的纹理,如果在某帧一个纹理在某帧还可用,而工具中的渲染窗口还在激活时,此纹理将显示可用,您可以在双击事件列表里的指针或对象表中的条目查看各种数据(顶点,索引,以反汇编形式显示的Shader程序等)表面(纹理,表面等)。 |