本文仅仅是提供一些游戏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

4、算法计算

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

游戏server之server优化思路的更多相关文章

  1. sql server优化思路

    查询速度慢的原因很多,常见如下几种:    1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)    2.I/O吞吐量小,形成了瓶颈效应.    3.没有创建计算列导致查询不优化 ...

  2. 谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现(更新优化思路)

    注:本文仅用于在博客园学习分享,还在随着项目不断更新和完善中,多有不足,暂谢绝各平台或个人的转载和推广,感谢支持. 一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是 ...

  3. 使用阿里云RDS for SQL Server性能洞察优化数据库负载-初识性能洞察

    简介 数据库性能调优通常需要较高数据库水平,并伴随较多的前期准备工作,比如收集各种性能基线.不同种类的性能指标.慢SQL日志等,这通常费时费力且效果一般,当面对多个数据库时总体拥有成本会大幅增加.今天 ...

  4. SQL Server数据库性能优化之SQL语句篇【转】

    SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一 ...

  5. SQL SERVER 查询性能优化——分析事务与锁(五)

    SQL SERVER 查询性能优化——分析事务与锁(一) SQL SERVER 查询性能优化——分析事务与锁(二) SQL SERVER 查询性能优化——分析事务与锁(三) 上接SQL SERVER ...

  6. SQL Server 查询性能优化 相关文章

    来自: SQL Server 查询性能优化——堆表.碎片与索引(一) SQL Server 查询性能优化——堆表.碎片与索引(二) SQL Server 查询性能优化——覆盖索引(一) SQL Ser ...

  7. SQL Server DBA性能优化

    虽然查询速度慢的原因很多,但是如果通过一定的优化,也可以使查询问题得到一定程度的解决. 查询速度慢的原因很多,常见如下几种:1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)2. ...

  8. Sql Server查询性能优化之走出索引的误区

    据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是, ...

  9. SQL Server查询性能优化——堆表、碎片与索引(二)

    本文是对 SQL Server查询性能优化——堆表.碎片与索引(一)的一些总结.  第一:先对 SQL Server查询性能优化——堆表.碎片与索引(一)中的例一的SET STATISTICS IO之 ...

随机推荐

  1. android常用控件的使用方法

    引言 xml很强大 TextView <TextView android:id="@+id/text_view" android:layout_width="mat ...

  2. nyoj--42--一笔画问题(并查集)

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. ...

  3. React ----- 路由懒加载的几种实现方案

    传统的两种方式 1.import() 符合ECMAScript提议的import()语法,该提案与普通 import 语句或 require 函数的类似,但返回一个 Promise 对象.这意味着模块 ...

  4. EasyUI--Alert()

    1.$.messager.alert(title, msg, icon, fn) 2 <script type="text/javascript"> $(functio ...

  5. TP5 模板渲染语法

    每次都要去网上找,又发现都不全.所以自己记录一下 volist:循环 {volist name="collection" id="v"} {/volist} i ...

  6. 修改route.php文件对ThinkPHP快速注册路由

    THINKPHP快速注册路由方式可以用 return[ "test"=>"index/index/demo", 'getid/:id'=>'inde ...

  7. windows下用winscp的root连接ubuntu“拒绝访问”的解决方法

    转载:https://www.cnblogs.com/weizhxa/p/10098640.html 解决: 1.修改ssh配置文件:sudo vim etc/ssh/sshd_config 在#Pe ...

  8. oracle创建静态监听

    [oracle@localhost admin]$ pwd /u01/app/oracle/product/11.2.0/dbhome_1/network/admin [oracle@localhos ...

  9. ATP自造8Gb内存颗粒供DDR3使用

    随着整个行业已经全面转向DDR4内存,不少厂商都陆续停产了DDR3,并准备好了迎接DDR5,但对于很多特殊用户,尤其是网络和嵌入式领域,仍然对DDR3有着强劲且持续的需求. 工业内存存储厂商ATP E ...

  10. caioj 1082 动态规划入门(非常规DP6:火车票)

    f[i]表示从起点到第i个车站的最小费用 f[i] = min(f[j] + dist(i, j)), j < i 动规中设置起点为0,其他为正无穷 (貌似不用开long long也可以) #i ...