原文( ` V7 A J# u; o% j
http://h31home.com/rss/blogto.asp?id=40921
' D+ T' X' b4 t Q
N+ F1 Z4 |: d$ s* O0 qPIX Win是DirectX SDK附带的Direct3D程序调试和分析工具,用于D3D应用程序,如果D3D程序的开发者需要收集和分析应用程序对3DAPI的调用和执行信息,此工具是一个很好的选择。例如,用户需要知道某个渲染过程中,后台渲染目标、深度缓冲区、模板缓冲区是否正确地渲染出来了,或者想知道在某帧一个D3D对象是否被正确释放了,可以用这个工具进行调试。当然,此工具不能用于OpenGL程序。本人在一款产品的优化中,使用了此工具,搜索后除了有MSDN文档外,未发现此工具的任何介绍,那这里就以使用者的角度进行简要介绍,希望与使用过和将要使用此工具的朋友交流D3D程序优化的相关经验。
8 D- ~- a, u7 Q/ r b% z; N' H( J4 ^9 j
1.工具界面, E6 @: ?7 T! e$ U8 C3 Q
参考文档:MSDN PIX documentation ( R6 L5 K) v! {4 u
# C* S. v9 q4 I( s! l& @
9 m1 g. E' D' }& o) E
% `! p& l7 c# U; b, [4 z 图1 在PIX中创建一个实验
, p2 l! I, K' g! b6 t6 j
: O% s9 P8 A: _6 N& H用PIX创建一个实验,运行后,截取D3D应用程序的调用,可以生成一个调用记录文件。经常的做法是创建一个实验,指定一个快捷键,并设置在按键触发时捕获所API调用,再设置自动保存到实验运行文件(*.PIXrun),而实验设置本身又可以存为一个很小的实验文件(*.PIXexp)。程序退出时或打开实验记录时界面切换到下图的样子。下图是从wikipedia借来的主界面图,图中展示的是程序录制的结果。
5 ~- }" @; J& O' O# ~3 {6 b5 C ; W5 }1 ^' V; q0 j; ~. w
) j4 r6 c' M# h/ A 1 s) h* Y0 D! T: C1 J
5 T/ l$ Q5 b/ w7 u5 o j图2 PIX调试分析界面5 r% O @+ }' e; B
' r- u# G( E, ]. r U4 U
图2中的4个视图分别显示了时间轴,对象列表,事件列表,渲染目标和对象查看视图。 在事件中,可以切换录制的帧,展开树型列表,可以看到在这一帧中对D3D/D3DX函数的调用情况,参数以及返回值。其中蓝色的是地址,代表一个对象指针,点击它可以在右边显示。当选择一个帧时,对象视图中的有些对象变成Alive,这代表这个对象在这一帧中是可用的,双击即可查看。图中选中的是某帧中第2727次函数调用的情况,这是一个SetTexture调用。9 u% G8 s9 I) l4 h9 V5 x/ C: l
}7 c0 C' R" ?/ M4 D渲染和对象查看视图中列出了对象的属性,在上部可以设置过滤和排序,每列显示了他被释放的时间(第几帧),引用计数器、分辨率等信息。需要注意的是,只有在事件列表中选中了某一帧,并且打开了右下角的对象查看器中的Render窗口,才能使对象变成可用,当对象可用时,双击对象列表中的对象或直接双击事件列表中指针,就可以在一个新窗口中显示了。我用的版本可能存在一个bug,显示第2个对象就会崩溃,所以可能需要一个对象查看标签后才能打开下一个对象。图2中右下角视图显示的是一个表面。
2 V% w/ c2 J! K5 O6 l7 g* G, W& I% A: @$ \. [. m
2.实验内容简介
* k- s9 o, c9 X1 I5 q+ m3 e' [' X* h要使用PIX对应用程序进行测试,需要建立一个个实验,此实验需要设置应用程序的路径和运行参数,另外选择你要测试的项目,所有测试参数选择好之后,就可以开始测试了,这些测试参数可以保存为一个脚本文件,以后可以反复测试。
8 S& X" w/ l' [( S8 ]6 `! S, c1 v( I8 Z6 G/ v W- O8 i
此工具的位置:
0 f; Z' o6 a9 D
9 r) c7 z1 G/ w! t& K" C$ lMicrosoft DirectX SDK (June 2006)\Utilities\Bin\x86\PIXWin.exe
7 J. x" K# V, l6 ]9 K" d/ [$ A
7 ~& z: @3 G+ ~6 _0 h3 s" J此工具的完整文档位于帮助文档的如下位置:' P/ T% _: [. q- g: @
1 _1 R( U+ n" a, A8 B9 J, { ?DirectX Software Development Kit\DirectXTools\PIX
# O% L; j, ^, M5 w) W+ l7 e. o. c/ r; b1 a7 l+ I; K
如果打开帮助文档,使用搜索,输入PIX也能很快定位到这部分文档,从开始菜单中可以直接启动该工具。
2 u/ M( {! @& t% q: k. d& L Y9 `1 S( {+ b' R) r) s
本文旨在以用户角度而不是MS角度介绍此工具的使用。
/ G9 A. N6 L$ { z R! O
( ~& _6 L, \( S' H7 F6 O1 S1 V; |能测试或记录的项目包括:
9 S2 h. [ q1 f2 m) f0 X3 M5 @6 r$ K: v: \- o6 U/ [
(1).每Frame对D3D/D3DX函数的调用,以及参数,可以多次记录单个Frame,也可以记录一段Frame;6 L1 O& S4 d4 q
6 s! K0 E; ]$ a& K
(2).截取屏幕;
, W! G' ~. K! g% s+ U" \
7 t c% n, x' P; v" Q(3).每Frame的计数器,以曲线方式显示在屏幕上,包括提交DP,DIP,DUP,DUIP,SetRenderState,SetTexture等请求的数量,的三角形数量,这里,统计的项目可以灵活设置;( \% C b- P+ V3 ^
. a( P. e( Q. F7 Q, j( y/ O# @" q7 Q(4).设备修改;
5 ^- ?! s! h: T R {' i9 n. n8 Y8 S# j, m
(5).拦截Draw调用;( ]; c l* h6 E1 w& r: _
; r. d1 R; m8 h. T, \4 ]7 Z(6).保存设备状态到文件;, M1 c+ Z7 U% G) i
/ N7 V0 I# M y |( ~) R2 H(7).记录API调用时的数据,包括纹理,顶点和索引的数据,在重绘时,可以查看提交的每个纹理以及纹理的完整数据;6 @ l/ V' H U5 O( C# |& w( K$ B
/ a; S/ q& Z! |0 ?) G(8).保存实验记录,将所有试验中处理的数据保存到一个文件中,当然,如果完整记录所有Frame,文件可能比较大,一般只记录关键的几个点。实验记录可以脱离原EXE和资源使用,如果日后需要分析,也只需要这一个文件。
% V' ~0 u+ {9 N
% [, v. r u' [2 P& w实验数据保存后,可以反复查看,其中包括保存的各个帧。9 I& y, J2 ]9 f3 B. M# C
+ s6 j# l1 t( z' z' D+ X有了这些测试项目,你可以检查你的应用程序是否提交了正确的状态,释放了不再使用的纹理,如果在某帧一个纹理在某帧还可用,而工具中的渲染窗口还在激活时,此纹理将显示可用,您可以在双击事件列表里的指针或对象表中的条目查看各种数据(顶点,索引,以反汇编形式显示的Shader程序等)表面(纹理,表面等)。 |