服务器优化

本文只是提供一些游戏服务器优化思路,其中一些思路是用在不同场合的,不是同个架构的。需要根据应用场景选用合适方式。本文的引用的文章都是在自己写的在本博客内的,也都是上线开几百个服的成熟项目的。

 

一、框架设计优化

1、分静态服务器和动态服务器。

2、动态服务器使用两层负载均衡:多网关  和 多场景。网关的选择是登陆服务器根据网关的负载来选择。场景则作为分线和副本等分开。

框架图参考:http://blog.csdn.net/chenjiayi_yun/article/details/18891591

3、中心服务器负责服务器依赖检查和内部消息转发和控制登录流程。中心服务器会主动连接登陆服务器和后台服务器。其他服务器会主动连接中心服务器。中心服务器有主动连接和被动连接的管理器,可根据需求的服务器类型来查询需要的连接。

中心服务器参考: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)对于树状多网关对象的单逻辑服务器。读写线程使用不同线程。连包使用单独线程。监听连接使用单独线程。

逻辑网关对象参考:http://blog.csdn.net/chenjiayi_yun/article/details/20288433


连接处理

超过10min没有逻辑消息的客户端连接可以关闭和回收。

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)缓存

自定义缓存

缓存角色描述数据到数据服务器。装载角色描述数据到内存,参考:http://blog.csdn.net/chenjiayi_yun/article/details/37834121

缓存账号信息到登录服务器(或者数据服务器)。

有些常用查询可用惰性缓存兼查数据库两个方式结合(优先查内存)。


第三方网络数据存储引擎

应用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、玩家。

(4-1)九屏同步

1)为了减少服务器内部数据同步(网关与场景服务器之间的):网关和场景都有玩家的屏索引,更改时需要同步。可以减少场景服务器和网关服务器之间数据同步。

2)限制广播范围:技能、场景道具、npc、玩家形态上的变化只需要同步给九屏中的玩家。

参考:http://blog.csdn.net/chenjiayi_yun/article/details/14554353#t6

(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

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

4、算法计算

加密算法xtea 简单高效的加密算法,算法上根据维基提供的方式来使用,根据游戏安全性需求减少了计算轮数(16)和key长度(16字节),提高一些效率,c风格修改,参考:http://blog.csdn.net/chenjiayi_yun/article/details/21990645
校验码,使用键异或缓冲区每个字节,参考: http://blog.csdn.net/chenjiayi_yun/article/details/17678209

转载。 https://blog.csdn.net/jiayichendddd/article/details/37040191
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值