windows 游戏编程大师技巧(第二版)学习之路-1

首先说明一点,我有这个《windows 游戏编程大师技巧(第二版)》中文 pdf 资源,需要同学可以找我要。我也会上传到 csdn 资源上去,不过估计要积分,所以没积分的同学可以找我要,完全免费喲!

Windows游戏编程大师技巧(第二版)_中文版.pdf:https://download.csdn.net/download/yld10/10392882

这个系列主要是我自己记录的一些觉得重要的点,写得可能有些零散,如果是没有看过书的同学来看这些知识点,怕是有些不明所以,所以建议大家还是看 pdf 或者纸质书。这个系列只能算是看书时候的一点笔记。


下面开始记录
///

第一章 学海无涯

windows 游戏编程大师技巧(第二版)第一章 学海无涯 的目录结构

ps:老实说,这书的作者还是挺风趣的(都到书里来向他朋友追债…),我看他写得也很细心,处处为读者着想,也提了很多中肯的建议,足见作者编程功力之深厚,经验之丰富也。

以下是书里提到的一些内容:

一般的游戏循环结构
windows 游戏编程大师技巧(第二版)第一章 学海无涯 中图1-4

一个游戏循环的状态转换图(有限状态自动机)
windows 游戏编程大师技巧(第二版)第一章 学海无涯 中图1-5

以下是作者在第一章里提到的一些技巧:

1、不要害怕使用全局变量,许多视频游戏不让对时间要求严格的函数使用参数,而是使用一些全局变量来传递参数。例如一个函数的代码如下:

void Plot(int x, int y, int color)
{
// plots a pixel on the screen
video_buffer[x + y*MEMORY_PITCH] = color;
} // end Plot

由于参数要被压栈和出栈,执行这个函数体所需要的时间小于调用函数所需的时间,在这种情况下,更好的方法可以是设立一些全局变量,然后在调用前进行赋值以传递参数,如下:

int gx, gy, gz, gcolor; // define some globals

void Plot_G(void)
{
// plot a pixel using globals
video_buffer[gx + gy*MEMORY_PITCH] = gcolor;
} // end Plot_G

2、使用内联函数 ,通过使用 inline 指示符来完全摆脱函数调用 ,你甚至能够改进上一条技巧 . inline 指示符指示编译器用函数体代码去替换函数调用.这样做无疑会使编译后的程序 变得更大 ,但却有效地提高了运行速度 。下面举一个例子:

inline void Plot_I(int x, int y, int color)
{
// plots a pixel on the screen
video_buffer[x + y*MEMORY_PITCH] = color;
} // end Plot_I

注意这里并没有使用全局变量,因为编辑器有效地执行了同类型的数据别名,但是全局变量
还是很有用的,尤其是如果函数调用时只有一至两个参数改变了值的情况一一其余旧的值无须重新加载就可被使用。

3、尽量使用 32 位变量而不用 8 位变量或 16 变量。Pentium 以及更新的中央处理器都是全 32 位 的,这就意味着它们并不喜欢 8 位或 16 位的数据字。实际上,由于高速缓存和其他相关内存储器的寻址变得较不规则,较小的数据可能 会使速度下降。例如,你定义了一个如下所示的结构类型:

struct CPOINT
{
short x, y;
unsigned char c;
} // end CPOINT

注意,定义这个结构看上去不错,但实际并非如此!首先,结构本身是一个 5 字节长的结构 一 (2*sizeof(short) + sizeof(char)) = 5 字节。这太糟了,由于没有注意字节对齐,内存寻址的时候会出大问题。更好的结构形式如下:

struct CPOINT
{
int x, y;
int c;
} // end CPOINT

提示 :C++ 中的 结构 ( Struct ) 非 常像类 ( Class ),除了结构默认的 可访问性 ( Visibility )是 PUBLIC 以外。
这个新结构要好得多。首先,所有结构成员都有相同的大小 一 sizeof(int) = 4 字节。因此,仅用一个指针就可以通过递增 DWORD( 双字,2 字节)的边界访问任一结构成员。这个新结构的大小是(3*sizeof(int)) = 12 字节,是 4 的倍数,或者在 DWORD 的边界上。这将明显地提升性能。
实际上,如果读者真想稳妥的话,可以适当地填充一下所有的结构,使其大小都成为 32 字节的倍数。32 字节是 Pentium 家族中央处理器上标准内部缓存的宽度,因而这是一个最佳长度。可以通过在结构里填入无用的变量或者使用编译器指示符( 最简单的方法)来满足这个要求。诚然,进行填充会浪费相当多的内存,但是较之速度的提高来说往往是值得的。

4、注释你的代码。游戏程序员不注释代码是出了名的。不要再犯同样的错误 ,为了得到整洁。有良好注释的代码,一点点额外的打字绝对是值得的。

5、 以类似 RISC( 精简指令集计算机 )的方式来编程。换句话说,尽量简化你的代码,而不是使它更复杂。Pentium 级处理器特别喜欢简单指令,而不是复杂的指令。你的程序可以长些,但应尽量使用简单指令,使程序相对于编译器来说更加简单些。例如,不要编写这样的程序:

if ((x+=(2*buffer[index++])) > 10)
{
// do work
} // end if

而应该这样写:

x += (2*buffer[index]);
index ++;
if (x > 10)
{
// do work
} // end if

按照这种方式来编写代码有两个原因。首先,它允许调试程序在代码各部分之间放置断点;第二,这将更易于编译器向 Pentium 处理器传送简单指令,这样将使处理器使用更多的执行单元并行地处理更多的代码,复杂的代码在这方面就比较糟糕!

6、使用二进制移位运算来进行乘数是 2 的幂的简单整数乘法。因为所有的数据在计算机中都以二进制存储,把一组位元向左或右移动就分别等价于乘法和除法 运算。例如:

int y_pos = 10;
// multiply y_pos by 64
y_pos = (y_pos << 6);  // 2 ^ 6 = 64
相似的有:
// to divide y_pos by 8
y_pos = (y_pos >> 3);  // 1/2 ^ 3 = 1/8

在本书关于优化的那章里,你将会发现更多类似的技巧。

7、设计高效率的算法。没有任何一种汇编语言能使复杂度为 O(n^2) 的算法运行得更快。更好的做法是使用清楚、高效率的算法而不是蛮力和穷举型的算法。

8、不要在编程过程中优化代码。这通常只是浪费时间。建议你等到主要的代码块或整个程序都完成后才开始着手进行繁重的优化工作。这样做最终会节省你的时间,因为你不必对一些含义模糊的代码进行不必要的优化。当游戏基本完成 时,才到了性能测试( Profiling )和查找需要优化的问题的时候。另一方面,程序代码要注意错落有致,不要写得杂乱无章。

9、不要为简单的对象定义太多复杂的数据结构。链表结构很好用,但这并不意味着当你所需要的其实是大约有 256 个元素的固定数组的时候,你也该使用链表 ,而是只须为其静态地分配内存即可。视频游戏编程中 90% 的部分都是数据操作。所以数据应尽可能简单、可见,以便能够迅速地存取它、随意操作它。应当确保你的数据结构适合你所真正要解决的问题,不要杀鸡用牛刀。

10、使用 C++ 应谨慎。如果你是位经验丰富的 C++ 专家,只管去做你想做的事 ,但是不要疯狂地写过多的 class ,也不要把任何东西都重载( overload )。说到底,简单而且直观的代码才是最好的程序,也最容易调试。我个人就不想在游戏代码中看到多重继承!

11、如果你知道自己的爱车将要开上 一条坎坷的石子路,最好的做法是停下来,掉头然后绕路而行。我见过许多游戏程序员沿着一条很差的编程路线走着,直到在糟糕的代码堆中葬送自己。能够意识到自己所犯的错误并重新编写 500 行代码,比写出一个总是令人不快的代码结构要好得多。因此,如果在工作中发现 问题,那就要重新评估并确保你节约的时间是值得的。

12、 经常备份你的工作。在编写游戏代码时,需要相当频繁地锁定代码库中的代码。重写一个排序算法还比较容易,但是要重写角色 AI 或者重写碰撞检测则是困难得多了。

13、 在开始你的游戏项目之前,应当进行一下组织工作。使用合理的文件名和目录名,提出一种一致的变量命名约定,尽量对图形和声音数据使用分开的目录,而不是将所有东西都一股脑儿放在同一个目录中。

使用工具

1、C/C++ 编译器 –> VC++ 6.0
2、2D 艺术软件 –> Corel Photo-Paint
3、声音处理软件 –> Sound Forge
4、3D 造型软件 –> 3D Studio Max
5、音乐和 MIDI 排序程序 –> Cakewalk Sonar
使用工具
以上工具资源我都已经找好,需要的同学可以找我要,或者去资源区下载。
vc++ 6.0:https://download.csdn.net/download/yld10/10395122
Sound Forge 9.0a:https://download.csdn.net/download/yld10/10395126
剩下三个软件太大了我上传不了。
不过别灰心,我还准备了全家桶大礼包,5 个软件都有,不过就只是放到百度云分享里面,链接文件:https://download.csdn.net/download/yld10/10395144

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值