游戏服务器之服务器优化思路

本文只是提供一些游戏服务器优化思路,其中一些思路是用在不同场合的,不是同个架构的。需要根据应用场景选用合适方式。

一、框架设计优化

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

游戏服务器之服务器优化思路

时间: 2024-10-07 18:19:05

游戏服务器之服务器优化思路的相关文章

游戏服务器之多进程架构通信 协程切换只是简单地改变执行函数栈,不涉及内核态与用户态转化,也涉及上下文切换,

游戏服务器之多进程架构通信 https://gameinstitute.qq.com/community/detail/124098 https://www.zhihu.com/question/23508968 游戏服务器与普通服务器有什么区别? 游戏开发中的TCP.UDP.HTTP.WebSocket四种网络通讯协议对比 https://gameinstitute.qq.com/community/detail/127562 https://www.jianshu.com/p/4eb37c1

Netty游戏服务器之protobuf编解码和黏包处理

我们还没讲客户端怎么向服务器发送消息,服务器怎么接受消息. 在讲这个之前我们先要了解一点就是tcp底层存在粘包和拆包的机制,所以我们在进行消息传递的时候要考虑这个问题. 看了netty权威这里处理的办法: 我决定netty采用自带的半包解码器LengthDecoder()的类处理粘包的问题,客户端我是用这里的第三种思路. 消息的前四个字节是整个消息的长度,客户端接收到消息的时候就将前4个字节解析出来,然后再根据长度接收消息. 那么消息的编解码我用的是google的protobuf,这个在业界也相

Nginx高性能web服务器之性能优化(八)

我们该如何充分发挥Nginx的高效和稳定性呢?这里我介绍下从编译安装开始,到系统内核,和利用第三方插件对Nginx进行优化,最大限度的发挥Nginx的性能. 一.编译安装过程的优化 1.减小Nginx编译安装后的文件大小 在编译Nginx的时候,默认是以debug模式进行的.而在debug模式下面会插入很多跟踪ASSERT之类的信息.当编译完成之后,一个Nginx要有好几M的字节.如果我们取消Nginx的debug模式,那么Nginx只有几百个字节.因为我们修改相关源码,取消debug模式: 在

网页游戏服务端-人物移动广播优化

[本文转自网络http://janeky.iteye.com/blog/1614175] 这段时间在处理服务端人物移动广播遇到了问题,记录一下. 1.问题 现在的页游都朝着客户端的方向靠齐了,大地图,千人同屏.因此,也给页游的服务端开发带来了不少的挑战.假设一个场景地图是8000*8000大小,同时有1000人在.1秒钟内,每个玩家移动一次.按照最原始的做法,就是给同一个场景的用户广播消息.简单计算一下广播量:1000*1000=1000000的广播量,有点恐怖. 2.方案 优化的目标肯定是减少

服务器的设计与实现(三)——FTP服务器之设计与实现

在实现了Http服务器之后,本人打算再实现一个Ftp服务器.由于Ftp协议与Http一样都位于应用层,所以实现原理也类似.在这里把实现的原理和源码分享给大家. 首先需要明确的是Ftp协议中涉及命令端口和数据端口,即每个客户端通过命令端口向服务器发送命令(切换目录.删除文件等),通过数据端口从服务器接收数据(目录列表.下载上传文件等).这就要求对每个连接都必须同时维护两个端口,如果使用类似于上一篇文章中的多路IO就会复杂很多,因此本文采用了类似Apache的多进程机制,即对每个连接创建一个单独的进

DNS服务器之二:从服务器的实现

DNS从服务的搭建 一.安装  [[email protected]~]# yum install bind 二.修改主配置文件  [[email protected]~]# cat /etc/named.conf 将以下三行注释掉 //               listen-on port 53 { 127.0.0.1; }; //               listen-on-v6 port 53 { ::1; }; //               allow-query     {

XMPP——xmpp协议详解、优点、缺点及优化思路

XMPP(Extensible Messaging and Presence Protocol,前称Jabber)协议介绍 可扩展消息处理现场协议(eXtensible Messaging and Presence Protocol , XMPP) 是一种基于可扩展标记语言(eXtensible Markup Language, XML)的近端串流式即时通信协议.它将现场和上下文敏感信息标记嵌入到XML 结构化数据中, 使得人与人之间.应用系统之间以及人与应用系统之间能即时相互通信 XMPP是一

Web下的整体测试 --性能测试及优化思路

随着Internet的日益普及,现在基于B/S结构的大型应用越来越多,可如何对这些应用进行测试成为日益迫切的问题.有许多测试人员来信问我B/S的测试如何做,由于工作较繁忙,对大家提出的问题也是头痛医头脚痛医脚,没有对WEB的测试过程做一个整体的概述.希望通过本篇能够让大家了解大型Web应用是如何来进行测试的. B/S下的功能测试比较简单,关键是如何做好性能测试.目前大多数的测试人员认为只要跑一些测试工具证明我的产品是可以达到性能的就ok了,为了证明而去测试是没有任何价值的,关键是要发现产品性能上

Serverless 架构:用服务代替服务器

Serverless 架构:用服务代替服务器 转载本文需注明出处:EAII企业架构创新研究院(微信号:eaworld),违者必究.如需 加入微信群参与微课堂.架构设计与讨论直播请直接回复此公众号:"加群 姓名 公司 职位 微信号 ". 还记得在十多年前,SaaS鼻祖SalesForce喊出的口号『No Software』吗?SalesForce在这个口号声中开创了SaaS行业,并成为当今市值520亿美元的SaaS之王.今天谈谈『No Server』有关的事, 继OpenStack.Do