原文3 S* l4 t+ s" U( o; o) g
http://h31home.com/rss/blogto.asp?id=40921 1 G: u& ]! i6 k }4 c& B
2 l" ~ P, I+ x- [, \2 cPIX Win是DirectX SDK附带的Direct3D程序调试和分析工具,用于D3D应用程序,如果D3D程序的开发者需要收集和分析应用程序对3DAPI的调用和执行信息,此工具是一个很好的选择。例如,用户需要知道某个渲染过程中,后台渲染目标、深度缓冲区、模板缓冲区是否正确地渲染出来了,或者想知道在某帧一个D3D对象是否被正确释放了,可以用这个工具进行调试。当然,此工具不能用于OpenGL程序。本人在一款产品的优化中,使用了此工具,搜索后除了有MSDN文档外,未发现此工具的任何介绍,那这里就以使用者的角度进行简要介绍,希望与使用过和将要使用此工具的朋友交流D3D程序优化的相关经验。
' S" m/ _7 l' ~$ r) S
) g1 \# d# J4 q2 A2 B8 G% E1.工具界面
~5 A" Y, Q1 o/ g% j* r* J; V参考文档:MSDN PIX documentation
Q( p `: M- F* \) N, I
4 l- J5 s! w; J 3 l/ z& m$ j- w& u' \! H s$ v
& ^, N6 u: V0 {, E, m, W, l
图1 在PIX中创建一个实验5 \- j s. ~ ~& X5 q, s2 _+ d; v% Q- s
; E6 ]. D1 K! @2 _" C0 ]$ P用PIX创建一个实验,运行后,截取D3D应用程序的调用,可以生成一个调用记录文件。经常的做法是创建一个实验,指定一个快捷键,并设置在按键触发时捕获所API调用,再设置自动保存到实验运行文件(*.PIXrun),而实验设置本身又可以存为一个很小的实验文件(*.PIXexp)。程序退出时或打开实验记录时界面切换到下图的样子。下图是从wikipedia借来的主界面图,图中展示的是程序录制的结果。
: ~3 d' X& B \6 B
: d1 P% g" x: y' @9 q9 M3 s- _. l
b1 [& r1 {: |9 t% v ' v+ |4 T( q+ a5 ]( G
3 \! E3 v) i, _' F5 K5 u图2 PIX调试分析界面+ E' R6 M; w! h! O5 |, u( g2 F
& g" Z7 Q# w2 |图2中的4个视图分别显示了时间轴,对象列表,事件列表,渲染目标和对象查看视图。 在事件中,可以切换录制的帧,展开树型列表,可以看到在这一帧中对D3D/D3DX函数的调用情况,参数以及返回值。其中蓝色的是地址,代表一个对象指针,点击它可以在右边显示。当选择一个帧时,对象视图中的有些对象变成Alive,这代表这个对象在这一帧中是可用的,双击即可查看。图中选中的是某帧中第2727次函数调用的情况,这是一个SetTexture调用。) H; T4 O$ X5 s \3 g
$ X/ C A4 W0 V/ Q3 i
渲染和对象查看视图中列出了对象的属性,在上部可以设置过滤和排序,每列显示了他被释放的时间(第几帧),引用计数器、分辨率等信息。需要注意的是,只有在事件列表中选中了某一帧,并且打开了右下角的对象查看器中的Render窗口,才能使对象变成可用,当对象可用时,双击对象列表中的对象或直接双击事件列表中指针,就可以在一个新窗口中显示了。我用的版本可能存在一个bug,显示第2个对象就会崩溃,所以可能需要一个对象查看标签后才能打开下一个对象。图2中右下角视图显示的是一个表面。5 \" c% i' q6 N$ R0 y: h( d
& }( i$ e* h1 M, M- Z" s0 L1 G0 M
2.实验内容简介
" w0 f, {0 Z$ L, m要使用PIX对应用程序进行测试,需要建立一个个实验,此实验需要设置应用程序的路径和运行参数,另外选择你要测试的项目,所有测试参数选择好之后,就可以开始测试了,这些测试参数可以保存为一个脚本文件,以后可以反复测试。9 V) b. k7 H8 H! X: F
: H1 k% D/ j4 c$ Q* e$ i7 _此工具的位置:
5 _% c6 Z3 R v+ l: }' X. q! Z1 e) _
Microsoft DirectX SDK (June 2006)\Utilities\Bin\x86\PIXWin.exe( g8 i4 d5 u0 j. k) ^' @
) @7 E3 W/ e! R此工具的完整文档位于帮助文档的如下位置:
. q6 q5 }/ V f7 X9 j9 y$ p0 I
! T0 n8 ? Q+ `DirectX Software Development Kit\DirectXTools\PIX
( R& H; o1 [5 O
! c- C5 V7 |4 T, x: G0 i# J如果打开帮助文档,使用搜索,输入PIX也能很快定位到这部分文档,从开始菜单中可以直接启动该工具。
/ M+ ?5 @! d: i: \/ T% F% r* u& k
% `' O J0 C9 G# z$ v+ }* v本文旨在以用户角度而不是MS角度介绍此工具的使用。
6 i, A+ T; W& e; s* Y5 r! v; W, G$ t
' x- I% W/ S" @9 z% ]8 i3 w- K* ?能测试或记录的项目包括:
% v6 X$ m" a: I# O! x# F7 h0 }" l% H; Y2 Y$ s. b
(1).每Frame对D3D/D3DX函数的调用,以及参数,可以多次记录单个Frame,也可以记录一段Frame;3 ]5 [4 V& U! Z
% x( {5 ^: Q, G" G, Z(2).截取屏幕;4 H( w+ O3 `( e, I: V: r6 ^
, R, U# c& N- L5 Q# j
(3).每Frame的计数器,以曲线方式显示在屏幕上,包括提交DP,DIP,DUP,DUIP,SetRenderState,SetTexture等请求的数量,的三角形数量,这里,统计的项目可以灵活设置;1 b* g! z8 C& X* F4 c
3 l; D& \/ L1 d8 _(4).设备修改; c; [8 |8 K! }" C
% S; x$ I4 e# T: d7 ]- q* u% S(5).拦截Draw调用;
4 v& U; R5 `/ s' {: K( U: @
, d2 E' e# C4 \4 O9 ^' M(6).保存设备状态到文件;0 b+ Y5 b( z- A& w2 q
# q3 T1 ]! l6 b- h J S) S(7).记录API调用时的数据,包括纹理,顶点和索引的数据,在重绘时,可以查看提交的每个纹理以及纹理的完整数据;$ W5 ]( k. |; {0 ]" ^/ t
& @; Q5 C- k; k
(8).保存实验记录,将所有试验中处理的数据保存到一个文件中,当然,如果完整记录所有Frame,文件可能比较大,一般只记录关键的几个点。实验记录可以脱离原EXE和资源使用,如果日后需要分析,也只需要这一个文件。
4 Y9 J- z$ h% `/ P6 w
/ l# T( Y1 c1 B8 Q实验数据保存后,可以反复查看,其中包括保存的各个帧。* t) `* f, w; l
+ b% w9 |' i/ T1 t' ?6 |7 r
有了这些测试项目,你可以检查你的应用程序是否提交了正确的状态,释放了不再使用的纹理,如果在某帧一个纹理在某帧还可用,而工具中的渲染窗口还在激活时,此纹理将显示可用,您可以在双击事件列表里的指针或对象表中的条目查看各种数据(顶点,索引,以反汇编形式显示的Shader程序等)表面(纹理,表面等)。 |