本文档列举了游戏服务器开发过程中应当注意的一些规范,以保证我们服务器代码具有更高的可读性、可维护性以及更高的稳定性和运行效率。
1. 定义struct必须要在构造函数中对所有成员变量进行初始化。
这样可以确保一个对象生成时,其所有成员变量都有可知的固定的初值,而不是系统分配的初值。另外,尽量使用初始化列表的方式对复杂数据类型的成员变量进行初始化,这样可以只调用一次拷贝构造函数,不需要调用赋值操作符,代码更高效。
2. 自增自减操作符在不是必要的时候全部使用前置操作符。
++i比i++具有更少的汇编指令,虽然编译器优化后这两条语句可能完全相同,但是养成良好的代码风格也很重要。
3. 无符号整数与0比值直接使用==判断。
不需要使用<=,因为无符号整数永远不可能小于0。同样的,判断一个无符号整数>=0也是没有意义的。
4. 浮点数的比较。
。
5. 使用typedef对较长的类型定义进行重命名。
这样可以使该类型使用地方的代码更加有可读性,也减少了代码出错的可能。
6. 减少局部变量不必要的初始化。
这种情况大部分是写代码时粗心造成的。主要是为了节省性能(个人感觉初始化还是必要的)
7. 非基本数据类型作为函数参数不要使用值传递。
非基本数据类型是指int、float、char这些C/C++基本类型之外的数据类型,比如std::string和自己定义的struct等。非基本数据类型一般是由多个基本数据类型组成的,如果值传递会进行大于4个字节的内存拷贝,严重影响效率。而函数参数无外乎有两种情况,一种是函数内部不会改变参数的值,另一种的函数内部需要改变参数的值。前者使用const引用或者const指针,后者使用引用或指针,就能解决所有需求,因此非基本数据类型以值传递的形式作为函数参数是没有必要的。另外,基本数据类型作为函数参数如果函数内部不需要改变值的话建议直接值传递。
8. 类成员变量数组大小避免直接使用数字。
定义一个常量作为数组的大小使代码更易维护,也能减少数组越界等bug的出现几率。
数据结构优化
一) 选择合适的算法和数据结构
1)如果固定大小,并且随机访问就用数组
2) 如果数据大小不固定,并且涉及大量的插入和删除操作,使用链表
3)如果涉及海量数据,并且要求高效的查找就用map
二)查表
1)客户端程序经常用到的sin cos等值可以再初始化的时候计算出(0-360度)的值保存在表里,用的时候直接使用 (空间换时间)
运算符优化
1)取余用与(&)替换
2)乘与除2的倍数可以用位移操作来替换
3)除法可以用乘法替代
语句优化
一)顺序语句的优化
1)相同功能的代码放在一个语句块,避免出现开头定义了一个变量
几百行代码后才引用
2)尽量多用中间变量保存代码块重复引用的值
二)if swtich 语句的优化
嵌套if把执行几率小的判断放在前边
Switch
使用跳转表
switch语句执行的时候并不是和if elseif 一样傻傻的一个一个去执行,而且把左右跳转地址保存起来,如果是连续的只需要一个跳转表,如果case不连续的就需要两个挑战表,从表A就是上边0x4140a8地址找到实际的跳转偏移看到了把1-3是跳转偏移是,后边3-100全部是04然后在存储实际的跳转地址0x414094+偏移找到跳转地址,过去
三)循环语句的优化
1)循环展开
4)多重循环的时候一定要注意内循环的效率,因为内循环执行的次数是最多的。
AStyle 格式化代码
&AStyle
C:\ProgramFiles (x86)\Microsoft Visual Studio 8\Common7\Tools\AStyle.exe
-A1 -s4 -c-K -w -m0 -M80 -j -H -p -U -Y -N -k2 $(ItemDir)$(ItemFileName)$(ItemExt)
$(ItemDir)