经验1 NULL安全
服务器是一个非常关注数据安全的东西,尤其对于C/C++
程序来说,空指针和野指针是一个非常重要且一定要避免的问题,与之同级的还有数组越界的问题。
经验2 善用unsigned long long int
当年OI的经验告诉我们,u64可以存很大的数,于是这个类型就用来解决了算法结束后答案过大导致int32溢出的问题,但没想到,这个东西用来当“身份证”有奇效!
我们的游戏中涉及大量的元素,包括但不限于大量的NPC,大量的同时在线的玩家,大量的建筑,大量的怪物……各种各样不同的元素。游戏将所有的实体都使用一个u64 rid
作为唯一标记,通过哈希函数和哈希表实现rid查万物。
经验3 善用Enum
枚举类型Enum在C++中经常当做一个常数来使用,在一些只给程序员使用的配置项,比如数组长度,请求超时,资源类型,使用这个可以避开污染Define、全局变量的问题。
经验4 代码生成
在很多情况下,我们的需求其实都是简单且重复的,比如对某一些变量的增删改查,那么对于这种类型的需求,其实我们可以采用代码生成的方式来解决,通过简单的配置,直接生成对应的代码,能够极大地提高开发效率。
经验5 原子项
原子项这个名字容易让人想到多线程编程中的原子操作,实际并不是。
在这里原子项指的是一系列暴露的接口,这些接口通常对应一些比较简单的函数,用户将这些接口排列组合调用,以便实现自己想要的效果。
整个原子项系统可以类比成一个脚本引擎。服务器程序中制作原子项,并将原子项暴露给用户调用,用户编写脚本,传到服务器,服务器解析脚本语意并调用其中的原子项来服务用户。
经验6 版本管理
其实版本管理不论对于什么团队来说都是一个不可避免的问题,我们没法用程序去强行限制人的行为,所以团队内部需要形成一些常见的规矩,所有人都“原则上”遵守这个规矩办事,就能避免很多问题了。
对于一个多人协作的项目而言,开发阶段一定会涉及到多端的协同问题,客户端有客户端的需求,策划有策划的想法,服务器又有服务器的实现方式,因此我们需要形成一些内部统一的工作流,并准备好备用方案,每个部门各自维护自己的版本,版本分为若干类,并交由版本管理工具来管理。
服务器组有自己的开发版,开发过程不对客户端和策划公开;但是对于客户端和策划来说他们又需要私服进行开发调试,那么服务器组就需要每过一段时间发布一个新版本,这个更新频率非常快,有时版本构建机都需要排队使用,依次构建,构建成功并上传至版本库之后,面向客户端和策划开放,他们可以将自己的私服更新到这个版本,用来开发调试。
相应的客户端也是一样,组内的版本管理工具保证开发者的代码处于最新状态,构建开发版并公开给其他组保证其他组能第一时间进行开发调试。
经验7 善用do while()
do while()
在学习过程中作为一种很冷门的循环语法其实一直不被重视,但是实际工作中,do while()在优化代码可读性方面有奇效。
借助它一定运行一次的特性我们可以用do while(0)
使代码只运行一次,在其中使用break来中断循环,以此起到一种平替inline function
的用法。
借助它一定运行一次的特性我们可以用do while(1)
使代码反复运行,在其中使用break来中断循环,以此起到一种。
经验8 性能和易读性
“当一件事情没有达到性能瓶颈时,就不要去考虑性能问题,易读性优先。”