本文仅仅是提供一些游戏server优化思路,当中一些思路是用在不同场合的,不是同个架构的。须要依据应用场景选用合适方式。
本文的引用的文章都是在自己写的在本博客内的。也都是上线开几百个服的成熟项目的。
一、框架设计优化
1、分静态server和动态server。
2、动态server使用两层负载均衡:多网关 和 多场景。网关的选择是登陆server依据网关的负载来选择。场景则作为分线和副本等分开。
框架图參考:http://blog.csdn.net/chenjiayi_yun/article/details/18891591
3、中心server负责server依赖检查和内部消息转发和控制登录流程。
中心server会主动连接登陆server和后台server。
其它server会主动连接中心server。中心server有主动连接和被动连接的管理器,可依据需求的server类型来查询须要的连接。
中心server參考:http://blog.csdn.net/chenjiayi_yun/article/details/19329287
二、业务设计优化
1、网络
多线程使用
方式一:网络被动连接线程池
被动连接线程池 http://blog.csdn.net/chenjiayi_yun/article/details/17793459
(1)动态线程调度
网络接收线程池的动态线程调度策略。接收发送网络使用多线程。每多添加512连接动态添加一条线程。
动态线程调度策略參考:http://blog.csdn.net/chenjiayi_yun/article/details/35922173
(2)网络收发处理优化
有读才可能有写(优先读)。使用单独的epoll描写叙述符来处理读(读epoll描写叙述符不处理写,还有一个epoll描写叙述符处理读和写)。每隔一段时间才写。写是检查写缓冲区。
(3)网络消息队列
读的是无锁队列。參考:http://blog.csdn.net/chenjiayi_yun/article/details/36190543
写会写缓存。使用发送字符队列,參考:http://blog.csdn.net/chenjiayi_yun/article/details/37933099
方式二:逻辑网关
(1)对于树状多网关对象的单逻辑server。读写线程使用不同线程。连包使用单独线程。
监听连接使用单独线程。
逻辑网关对象參考:http://blog.csdn.net/chenjiayi_yun/article/details/20288433
连接处理
超过10min没有逻辑消息的client连接能够关闭和回收。
2、数据服务
(1)读档
(1-1)持久性档案
自己定义文件数据库:提供复杂度O(1)的查询和插入效率,插入和更新数据会添加和改动内存数据索引,和须要改动和加入索引文件和数据文件的数据记录。
使用自己定义文件数据库的方式參考:http://blog.csdn.net/chenjiayi_yun/article/details/17880275
mysql
mysql句柄连接池,实现多线程句柄管理。启动时获取连接上的全部的表结构作为orm功能的字段检查标准。
參考:http://blog.csdn.net/chenjiayi_yun/article/details/36698011
使用存储过程。提高经常使用查询(或插入sql)效率。
使用存储过程查询,參考:http://blog.csdn.net/chenjiayi_yun/article/details/36674223
(1-2)缓存
自己定义缓存
缓存角色描写叙述数据到数据server。
装载角色描写叙述数据到内存,參考:http://blog.csdn.net/chenjiayi_yun/article/details/37834121
缓存账号信息到登录server(或者数据server)。
有些经常使用查询可用惰性缓存兼查数据库两个方式结合(优先查内存)。
第三方网络数据存储引擎
应用redisserver。惰性写入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 场景server的有效屏
(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)场景数据同步
场景server屏索引分为:物品、npc、玩家。
(4-1)九屏同步
1)为了降低server内部数据同步(网关与场景server之间的):网关和场景都有玩家的屏索引。更改时须要同步。能够降低场景server和网关server之间数据同步。
2)限制广播范围:技能、场景道具、npc、玩家形态上的变化仅仅须要同步给九屏中的玩家。
參考:http://blog.csdn.net/chenjiayi_yun/article/details/14554353#t6
(5)角色移动
假设不是非常严格检查。后端能够不计算阻挡(包含动态和静态阻挡)。
(6)校验
client连接的校验和数据包的校验在网关处理。
三、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:
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
自己定义字节缓冲队列。用于发送和接收字节的缓冲,參考:http://blog.csdn.net/chenjiayi_yun/article/details/37933099