|
《Windows游戏编程大师技巧》(第二版)第11章(17) SIN_LOOK[angle] = sin(rad_angle); COS_LOOK[angle] = cos(rad_angle); } // end for angle 以下是一个利用该张查找表的例子,该代码执行的结果是画一个半径为10的圆: for (int ang = 0; ang<360; ang++) { // compute the next point on circle x_pos = 10*COS_LOOK[ang]; y_pos = 10*SIN_LOOK[ang]; // plot the pixel Plot_Pixel((int)x_pos+x0, (int)y_pos+y0, color); } // end for ang 当然,查找表需要占用一定的内存,但这样做也是值得的。“如果你能够预先算出结果,就将其放进查找表中。”这是我的座右铭。你可以思考一下DOOM、Quake以及我的最爱Half-Life是怎样工作的? 汇编语言 我想讨论的最后一种优化是使用汇编语言。你或许已拥有了很酷的算法和好的数据结构,但你还是希望更有效率。手工编写汇编语言不再能使代码如当年运行在8/16位处理器上那般,一下子快上1000倍,但它一般总能使你的代码运行速度提高2至10倍。这说明手工编写汇编语言代码还是非常值得的。 当然,你必须确保只转换游戏程序中需要转换的代码部分。注意不需要优化主菜单程序,因为那样只是浪费时间。用一个性能测试工具(Profiler)测试一下当你的游戏程序运行的时候,CPU时间在何处被消耗殆尽(可能在图形部分),然后定位该处并将其以汇编语言改写。我建议使用Intel的Vtune作为性能测试工具。 在过去(几年前),大部分编译器不支持内联汇编。如果有,也很难用!如今Microsoft、Borland和Watcom的编译器都提供内联汇编的支持,用来编写数十句到几百句的小程序就如同单独使用汇编程序一样得心应手。所以我建议如果需要汇编语句就使用内联的汇编器。下面的代码表明在使用Microsoft VC++时如何调用内联汇编: _asm { .. assembly language code here } // end asm 内联汇编器最突出的优点是它允许使用已在C/C++中定义的变量名。下面的代码示范了如何使用内联的汇编语言编写一个32位的内存填充函数: void qmemset(void *memory, int value, int num_quads) { // this function uses 32 bit assembly language based // and the string instructions to fill a region of memory _asm { CLD // clear the direction flag MOV EDI, memory // move pointer into EDI MOV ECX, num_quads // ECX hold loop count MOV EAX, value // EAX hold value REP STOSD // perform fill } // end asm } // end qmemset 要使用这个新的函数,你只需这样调用:
|