loading
乱一世狂傲
赞赏支持
关注

游戏服务器与普通服务器有什么区别?

乱一世狂傲

经过火的洗礼,泥巴也会有坚强的体魄。

游戏服务器架构通识

前言

我们将从游戏服务器发展的简单历程出发鸟瞰一下目前大多数的游戏服务器架构

这里尽可能的避免陷入细节的技术问题而是从技术进化的结果状态反推原始问题是什么希望能通过这个过程解释清楚游戏服务器是在解决什么问题痛点到底在哪里

早期网游服务器

<img src="https://pic4.zhimg.com/50/v2-d0d7eed73b05de796146c3a8c621adcc_hd.jpg" data-rawwidth="1011" data-rawheight="535" class="origin_image zh-lightbox-thumb" width="1011" data-original="https://pic4.zhimg.com/v2-d0d7eed73b05de796146c3a8c621adcc_r.jpg"/>

蛮荒时期的游戏服务器框架我们一笔带过那时的游戏服务器和一个小Web服务没有区别

蛮荒时代的服务器只负责存储玩家账号数据转发场景内其他玩家的行为很多移动使用技能等关键逻辑在服务器上根本没有随意就能用变速齿轮改变游戏速度

从传奇的时代开始游戏服务器就不再是简单的上传存档下载存档访问页面而已游戏服务器内部出现了游戏逻辑既能用于同步每个玩家看到的世界又能让逻辑与客户端分离避免早期的网络游戏那种毫无防范的逻辑体系(对外挂防御能力为0)

这种架构奇怪的地方是处理网络连接数据传输的压力和逻辑处理的压力在同一个服务器上(存储模块可能也在同一个进程)就算逻辑处理压力为0承载人数也高不到哪去

早期游戏服务器的改进版本

当开发者们有了初步经验以后新作品的开发自然而然的过渡到了如下的形式

<img src="https://pic4.zhimg.com/50/v2-4c91ae5157453352ee6a9e00f8ef834a_hd.jpg" data-rawwidth="1112" data-rawheight="680" class="origin_image zh-lightbox-thumb" width="1112" data-original="https://pic4.zhimg.com/v2-4c91ae5157453352ee6a9e00f8ef834a_r.jpg"/>

游戏逻辑服务依然是在一台服务器上单进程(逻辑处理本身肯定是在一个线程中可以有子线程负责内网通信)但是我们自然的想到存储负载和网络连接负载可以从逻辑服上拆出来

由于连接服务器本身没有时序性很容易做分布式的(其实大部分游戏还是只用一个连接服)存储服务不要求高实时性高峰期存盘间隔可以稍长一些不会对游戏服造成影响

成熟形态的服务器框架(这节是重点)

1逻辑服务器的负载均摊方法一按照功能划分多个服务器进程

<img src="https://pic2.zhimg.com/50/v2-83d176b88c6ffcf64211a8d34ba9d842_hd.jpg" data-rawwidth="1154" data-rawheight="657" class="origin_image zh-lightbox-thumb" width="1154" data-original="https://pic2.zhimg.com/v2-83d176b88c6ffcf64211a8d34ba9d842_r.jpg"/>

2逻辑服务器的负载均摊方法二按照场景划分多个服务器进程

<img src="https://pic2.zhimg.com/50/v2-3c87d414d04a2ab57c24f6bb78af5d45_hd.jpg" data-rawwidth="1139" data-rawheight="654" class="origin_image zh-lightbox-thumb" width="1139" data-original="https://pic2.zhimg.com/v2-3c87d414d04a2ab57c24f6bb78af5d45_r.jpg"/>

难点在逻辑的设计上要像做手术一样把本来是一体的功能切开并抽象出若干个API来保持联系(服务器之间是TCP连接)

在分解时要找联系相对最薄弱的环节入手比如场景和场景之间分开单独抽出聊天服务组队服务好友服务

无论如何分解最终结果只能是有限个服务而且分解的越细开发难度就越大因为跨服务器逻辑是把简单的同步逻辑变成了异步Callback逻辑而且容易出现时序问题等不易测试的问题

单个场景服务几乎是无法分解的分解单个场景难度巨大以至于出现了BigWorld引擎来专门的解决场景分割问题后面会谈到

这种成熟形态的游戏服务器已经能满足现实中99%的频繁交互类网游需求是大型MMO端游页游的主流形式

对比Web服务器

大致只说一点由于数据库的存在以及HTTP请求的特性Web服务器天生就是并发的也一直在高并发的路上越走越远

<img src="https://pic2.zhimg.com/50/v2-e465c12055355c1170130c7c9602a9d2_hd.jpg" data-rawwidth="1143" data-rawheight="650" class="origin_image zh-lightbox-thumb" width="1143" data-original="https://pic2.zhimg.com/v2-e465c12055355c1170130c7c9602a9d2_r.jpg"/>

开房间式的网络游戏

开房间式的网络游戏也是游戏的一个重要分支英雄联盟DOTA很多手游例如皇室战争王者荣耀等等

这种游戏房间之间几乎没有交互只有大厅内有交互可以理解为原始形态的游戏服务器的平行扩展

房间式游戏扩展难度较小只是需要根据玩家数量动态扩展游戏房间的数量服务器数量很像网站的架构

这种游戏架构最最适合放在云平台上设计合理的话它可能遇到的问题和大型网站几乎一模一样不需要特别的讨论它们

只是毕竟游戏不都是开房间的玩法

小结游戏服务器框架特点

1真正的数据都在内存中数据库性能不那么重要

很多大型游戏采用了共享内存避免宕机时损失过大

2单CPU性能比CPU数量重要的多

3目前有很多游戏特别是手游使用Redis读写代替内存读写甚至也有用Mongo的

4开新服旧区合服的情况非常适合云平台

先进服务器框架

1BigWorld理念过于超前把并发性做到极致开发友好度弱到极致已废

2Skynet本人强烈推荐谁学谁知道除了必须要用lua语言没有什么缺点

聊聊十万行代码

游戏服务器开发速度受美术资源制作速度客户端开发速度制约近几年我猜测服务器方面并不会有大的技术革新

游戏开发未来的趋势是多元化低门槛化大众化很长一段时间内BigWorld这种大怪兽级别的引擎不会再崛起

分布式框架的崛起时间点无论如何也在VR技术成熟之后了


2019-09-10
服务器
服务器
服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。
暂无相关品牌
¥38.71
总资产
1051
获点赞
627
关注者
「真诚赞赏,手留余香」
赞赏支持
还没有人赞赏,支持一下吧
发布讨论

网友评论

还没有用户评论

相关链接

写评论
0
0
0
打赏