# V1 U1 ~$ d5 ]& e8 N "Hello World", // String to draw. 4 e+ Y/ A, F9 V& S$ o l 0 j7 ~/ Y _0 {( @! R5 [ -1, // Null terminating string. . t% Y; Y/ l5 I# |; T2 r) F/ F8 t3 b9 z
&rect, // Rectangle to draw the string in. 2 ~- P* k1 o6 k; e' {% H) l# I6 Z7 d4 s% ?
DT_TOP | DT_LEFT, // Draw in top-left corner of rect.8 j0 k. o9 F. K9 b6 {
' T8 e$ W) \" z 0xff000000); // Black. 2 z. |! V7 p5 {+ G* E 2 r( E2 R/ m2 O( H% D' p 5 y0 O, B; Z1 h9 A9 g0 F1 `9.1.3. 计算帧速率/ }% j2 L& r" b
帧速率用FPS(Frame per Second)表示。首先声明三个全局变量:; b8 T: R2 c( x A) S5 x: l* y
! O8 y: ~+ W- n9 d- H" @
DWORD FrameCnt; // The number of frames that have occurred.5 _3 p9 a2 v% Q5 |/ t
% L G3 ~6 j1 I# n2 L0 B' zfloat TimeElapsed; // The time that has elapsed so far. * @ m6 c: ]3 q" k) D. w" e% h- {
float FPS; // The frames rendered per second. 2 r' o" X& U# W! R( Q 4 E( |# W% w* ]0 i( \! n
1 i8 S# {9 H4 f M/ t% W) }
每秒计算一次FPS,这里计算的是平均值。我们也可以有足够的时间去读FPS值,而不至于因FPS的快速变化而产生较大误差。 8 ?' N. O, Y& I s % ?- s9 |+ t5 i' o5 l m每渲染一帧,累加一次帧数和所用的时间值:& [2 u2 W* e3 g# f6 j2 \$ n1 l+ d
9 D2 U* t( q+ s* _! B1 g; n- P
FrameCnt++;+ w$ g* u: z1 A. t* h5 D" [& _
6 u$ ?, Y3 q1 u& I4 W; N( q. t
TimeElapsed += timeDelta; ! I% b/ b. O- \' b - U' `% @3 O6 N& C' ~; S
$ G d0 ~6 M1 V1 _' g/ u) w' H
这里的timeDelta表示两帧间的时间间隔。每过去一秒,就可以使用下面的公式计算FPS了: " t2 K( k1 l1 x" E5 |- U. ` K; k* y q! `& P/ E# P; H6 HFPS = (float)FrameCnt / TimeElapsed;. F% m- a: P: ~. [: W6 v
/ u3 W& |$ H! t5 X
: w( n+ p: `! J8 y7 z' W, j' t计算完成后,需要将FrameCnt和TimeElapsed重新置0,这样下一次的计算结果才正确: 7 A" B! O* n4 k- Z# p' T# K- u1 N& [/ I1 `+ E' A( Y9 X
void CalcFPS(float timeDelta) 0 [0 |3 Q. ?3 w1 U& I- J$ m9 H' j/ f( S0 P S
{ ; s# b0 g) D$ E2 p6 R 6 u2 P# q" a( q/ f6 C FrameCnt++;- Q7 p+ I5 U' Y* _8 T5 @9 n" f5 S
' l; D# v0 ?& W* |- g7 M- _$ z TimeElapsed += timeDelta; ' G6 U8 s8 L0 F0 c# |" t8 o % ^. b9 @7 U4 m, b& [3 R# v" z! m8 [ if(TimeElapsed >= 1.0f) % O* Q! r2 w0 `! s( S6 P! t* J% i
{. X( T1 M+ _% w# e: f! M, f0 Q
- j7 u( q0 N6 J
FPS = (float)FrameCnt / TimeElapsed; * T& }/ {3 d8 ]! \. a* t* Z8 P" j2 o3 _+ r' X3 S; i/ _$ I
TimeElapsed = 0.0f; 0 _1 u2 p. r4 V' B7 [2 t0 @% S- ^6 P3 S t1 m
FrameCnt = 0;9 N" e E. L! G: s
! L( Q. [9 {* E! f4 B, Y3 E+ b }4 V" a& e: O2 M! @7 c
# ^6 R/ j8 u- z. A
}& S- {) d7 v l* G" u
) K0 a' ], L9 e6 v , E9 E9 `4 N9 g! H! U9.2. CD3DFont: ?% R& v# c% ?# J) t; b9 p
在DirectX SDK的安装目录下,提供了很多有用的代码CD3DFont类就位于其中。该类使用纹理三角形和Direct3D渲染文字,而不是通过GDI渲染,所以,其效率高于ID3DXFont。但是,CD3DFont不支持复杂的字体和文本格式,如果只需要高速渲染简单的字体,CD3DFont应是首选。 3 j) |& i9 e% D# M2 `& \/ P3 g1 ?, `7 |0 q( N
使用CD3DFont类时,需要加入以下源文件:d3dfont.h,d3dfont.cpp,d3dutil.h,d3dutil.cpp,dxutil.h,dxutil.cpp。这些文件可在DirectX SDK的安装目录下找到。在DirectX 9.0 SDK Update (Summer 2004)中,该类却消失了,所以,该节内容只适用于较早的DirectX 9.0 SDK版本! 9 T+ x1 _6 |3 ]3 |& p( N' l ' ^' f- i( m" ^% @9.2.1. 创建CD3DFont对象 5 f c @9 l, i; C+ N1 ^) K# H( J创建CD3DFont的对象,就像创建一个普通的C++对象一样,其构造函数如下: : d* T7 l' K$ b. }) k7 }9 n n4 h/ j M* s' R8 r+ A
CD3DFont(const TCHAR* strFontName, DWORD dwHeight, DWORD dwFlags=0L);3 Q3 B7 A4 ^/ v5 _1 F! ^
/ a4 F' l5 D% H. C5 ?0 w; t% V ' \) \; |6 G$ xl strFontName –所使用的字体名称 0 }. Z) O3 U7 `# K" U4 I& ?; r& e4 h7 e
l dwHeight –字体高度 ! F/ y: n# j# i- T2 H7 R+ L/ Z- T0 p- N: ]* a( f
l dwFlags –可选的标志,如D3DFONT_BOLD、D3DFONT_ITALIC、D3DFONT_ZENABLE等。 6 m% a; g- l) d/ q5 d9 u5 G: ^8 @ K. v# r& ?0 d
得到CD3DFont对象后,还需按顺序进行初始化,如: [+ H5 \' j, E4 X* f7 u" l, `- l9 y, I& X