本文只是提供一些游戏服务器优化思路,其中一些思路是用在不同场合的,不是同个架构的。需要根据应用场景选用合适方式。
一、框架设计优化
1、分静态服务器和动态服务器。
2、动态服务器使用两层负载均衡:多网关 和 多场景。网关的选择是登陆服务器根据网关的负载来选择。场景则作为分线和副本等分开。
框架图参考:http://blog.csdn.net/chenjiayi_yun/article/details/18891591
3、中心服务器负责服务器依赖检查和内部消息转发和控制登录流程。中心服务器会主动连接登陆服务器和后台服务器。其他服务器会主动连接中心服务器。中心服务器有主动连接和被动连接的管理器,可根据需求的服务器类型来查询需要的连接。
中心服务器参考:http://blog.csdn.net/chenjiayi_yun/article/details/19329287
二、业务设计优化
1、网络
方式一:网络被动连接线程池
(1)动态线程调度
网络接收线程池的动态线程调度策略。接收发送网络使用多线程,每多增加512连接动态增加一条线程。
动态线程调度策略参考:http://blog.csdn.net/chenjiayi_yun/article/details/35922173
(2)网络收发处理优化
有读才可能有写(优先读)。使用单独的epoll描述符来处理读(读epoll描述符不处理写,另一个epoll描述符处理读和写)。每隔一段时间才写。写是检查写缓冲区。
网络收发详细分析参考:http://blog.csdn.net/chenjiayi_yun/article/details/31765803
(3)网络消息队列
读的是无锁队列。
写会写缓存。
方式二:逻辑网关
(1)对于树状多网关对象的单逻辑服务器。读写线程使用不同线程。连包使用单独线程。监听连接使用单独线程。
逻辑网关对象参考:http://blog.csdn.net/chenjiayi_yun/article/details/20288433
2、数据服务
(1)读档
(1-1)持久性档案
文件数据库
使用文件数据库的方式参考:http://blog.csdn.net/chenjiayi_yun/article/details/17880275
mysql
游戏服务器之mysql句柄连接池
参考:http://blog.csdn.net/chenjiayi_yun/article/details/36698011
使用存储过程
参考:http://blog.csdn.net/chenjiayi_yun/article/details/36674223
(1-2)缓存
自定义缓存
缓存角色描述数据到数据服务器。
缓存账号信息到登录服务器(或者数据服务器)。
有些常用查询可用惰性缓存兼查数据库两个方式结合(优先查内存)。
装载角色描述数据到内存,参考:http://blog.csdn.net/chenjiayi_yun/article/details/17880275
第三方网络数据存储引擎
应用redis服务器,惰性写入redis。参考: http://blog.csdn.net/chenjiayi_yun/article/details/18887647
(2)写档
(2-1)定时写档
随机几分钟定时器(十分钟或者更长)
(2-2)分优先级写档
分任务、物品、技能、其他等标签来写。参考:http://blog.csdn.net/chenjiayi_yun/article/details/37775429
3、逻辑
(1)ai
(1-1)场景ai优化
有效屏计算:只计算有效屏上的ai,分批(如10批)计算。
有效屏计算参考:http://blog.csdn.net/chenjiayi_yun/article/details/14554353 场景服务器的有效屏
(1-2)ai类型优化
追击类型
优化ai寻路:使用移动定时器。限制寻路长度(20格),限制a*计算次数(150内),使用开启和关闭列表,使用小根堆记录最小f值。
ai寻路参考:http://blog.csdn.net/chenjiayi_yun/article/details/18509023
攻击类型
使用攻击定时器。优化ai玩家搜索,优先仇恨列表。
ai参考:http://blog.csdn.net/chenjiayi_yun/article/details/18509023
回归类型
回归时直接刷新位置。
(1-3)计算时间优化
超过20ms的ai类型处理被打断。
(2)技能
范围搜索
几何范围搜索:按场景具体类型屏索引来搜索(分成三类场景屏索引:物品、npc、玩家)
羁绊范围搜索:视野内队友搜索
参考:http://blog.csdn.net/chenjiayi_yun/article/details/19429133
(3)背包
(3-1)多格子的物品使用按图的方式记录物品在背包的位置(按位记录位置)
参考:http://blog.csdn.net/chenjiayi_yun/article/details/18960847
(4)场景数据同步
场景服务器屏索引分为:物品、npc、玩家。
参考:http://blog.csdn.net/chenjiayi_yun/article/details/14554353
(4-1)减少服务器内部数据同步
网关和场景都有玩家的屏索引,更改时需要同步。可以减少场景服务器和网关服务器之间数据同步。
(4-2)九屏同步
技能、场景道具、npc、玩家只需要同步给九屏中的玩家。
(5)角色移动
如果不是很严格检查,后端可以不计算阻挡(包括动态和静态阻挡)。
(6)校验
客户端连接的校验和数据包的校验在网关处理。
三、c++技术优化
1、对象内存优化
定长的内存对象可使用内存池
(1)自定义小对象分配器
根据需求实用单对象分配器或多对象分配器。
单对象分配器参考:http://blog.csdn.net/chenjiayi_yun/article/details/24358135
多对象分配器参考:http://blog.csdn.net/chenjiayi_yun/article/details/24359611
(2)stl内存池
sgi标准的stl拓展内存池 __gnu_cxx::__pool_alloc
参考:http://blog.csdn.net/chenjiayi_yun/article/details/28253361
支持多线程的stl拓展内存池内存池 __gnu_cxx::__mt_alloc
参考: http://blog.csdn.net/chenjiayi_yun/article/details/36190543
2、语法使用优化
参考:http://blog.csdn.net/chenjiayi_yun/article/details/8719831
3、自定义容器优化
对常用容器进行封装使用。
自定义字符串为键的哈希表,有效提高查找字符串的键的节点,参考:http://blog.csdn.net/chenjiayi_yun/article/details/37698083
自定义小根堆,有效获取优先级最高的节点,参考:http://blog.csdn.net/chenjiayi_yun/article/details/37654845
自定义多写者的读写间无锁队列,在多线程写的情况下, 有效减少读写线程间锁竞争,参考:http://blog.csdn.net/chenjiayi_yun/article/details/36190543
自定义列表,简化封装,提高添加列表效率,不提供迭代器模式访问,提倡指针访问数组,参考:http://blog.csdn.net/chenjiayi_yun/article/details/17712039
自定义锁,方便开发使用,参考:http://blog.csdn.net/chenjiayi_yun/article/details/8780784
游戏服务器之服务器优化思路