游戏服务器架构通识

前言

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

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

一、早期网游服务器。

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

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

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



如图,客户端通过某种形式验证登陆以后,就和服务器通过TCP直接相连了。这种服务器的承载能力不高,但那时在游戏逻辑上也务求简化,把负载减少到极致。

· 例如:1、玩家看不到怪物的血量,或者只能看到正在打的怪物的血量。2、地图有格子的概念,每个格子只能有一个单位,极大限制了同屏人数。

由于逻辑尽量简化,虽然这时的服务器逻辑服务都是单进程单线程的,但是也足够表现交互的感受。

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

虽然这时的游戏服务器设计很简陋,但是网游第一次给了玩家真实世界的感受。单服人数不足的问题可以靠开多组服务器实现,所以曾经出现了几百上千组服务器的辉煌时代。

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

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



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

连接服务器负责把客户端和服务器之间的消息转化为服务器之间的消息,可以顺便做一些加解密的工作。

这一点小改动极大提高了单服连接人数的上限。但是玩家要求提高了,空出来的性能很快被丰富的游戏系统吃掉了。

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

三、成熟形态的服务器框架

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




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



对游戏服务器历史有了基本了解后,成熟形态的游戏服务器很容易理解。简单来说,就是把逻辑服务器单个进程的压力分摊到多个服务器。

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

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

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

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


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

当然有实力的公司在这个基础上会做很多改动,实现动态开辟副本、相位技术等等,但是万变不离其宗,其本质和上图没有什么区别。


附:开房间式的网络游戏

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

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

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




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

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


小结:游戏服务器框架特点

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

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

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

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

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

五、先进服务器框架

· 先进服务器框架1 BigWorld

BigWorld引擎的代表作:

· 中国:《天下贰 》《天下叁》等等数十款,网易对BigWorld的实用化贡献很大。

· 国际:《魔兽世界》早期版本,《坦克世界》,《战争雷霆》

BigWorld的核心理念,要回到上面讲过的场景分割问题。

BigWorld利用平面切分的原理,将场景划分为小块,不同的块可以运行在不同的服务器上。而且块的划分是动态的,根据玩家密集程度、数量动态调整块的大小。。

具体技术上,使用了Actor模型,要求每个对象都是独立的Entity,对象之间只能通过消息协作,严格限制对象之间的直接交互。

后来随着手游的崛起、端游的衰落、网游玩法向多元化发展,这一系列的变化,导致BigWorld引擎很快就衰落了。

BigWorld引擎从曾经的大红大紫,到现在的无人问津,反映出游戏服务器技术的发展趋势。BigWorld的强制Actor模型,实际上是牺牲了开发效率,换取了服务器可扩展性。

理论上单服承载人数可以达到百万级别。但是游戏的业务逻辑的修改很频繁,开发效率低下是游戏设计师不能承受之重。

这种架构天生就是为云计算准备的,而且单个物理机承载量十分有限,每个游戏大区都需要大量实体机。

如果BigWorld成功…… 可惜的是,它和实际市场的发展趋势背道而驰了。

游戏开发相比电商系统,项目规模小几个数量级,但是相对的,迭代速度要快几倍。项目之间如果类型不同或是玩法有差异,能复用的代码并不多。

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

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

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


· 先进服务器框架2、Skynet

Skynet是新兴的一种通用型服务器框架(完全开源),它游走在传统不易分布服务器和分布式服务器之间。

它是一种泛用型框架,不仅能很好的作为游戏服务器框架使用,而且用来搭建HTTP服务也具有惊人的性能(几百行代码的简单HTTP实现,能达到nginx 60%的性能)。

矛盾的是,由于它对脚本虚拟机做了一些重要的Hack,导致它完全绑定在了Lua这一种语言上。

Skynet原理阐述:

把服务抽象为微服务,一个系统内可以建立成千上万个微服务,Skynet调度m个线程(m=CPU核心数)、处理n个微服务各自的事件。

由于n个微服务在同一个进程内,可以达到0延迟的内部通信(极端情况下无拷贝)

同时Lua虚拟机又提供了沙盒机制,微服务之间的Lua逻辑代码不会有任何干扰,必要的时候又可以在C语言层面、Lua沙盒之外共享数据。

由于服务本身有良好的隔离性,可以较为方便的把服务部署到多物理机上(考虑到性能问题,不能像BigWorld那样任意部署)。

Skynet这种架构已经在Lua体系的游戏公司内大量使用(以网易系为代表),悄无声息的渗透到其他公司里。(和Lua语言当年的情况有点像,是金子总会发光的。)


六、先进服务器框架3、以Go语言为主的其他框架

Go语言的goroutine特性,给游戏开发者带来巨大的想象空间。

在Go语言的基础上,很容易出现更好的房间式游戏框架、类似Skynet的框架、改进型的传统框架。

但是可以大胆预测,最终实现的效果不会超过erlang、skynet这类框架的范围。这是因为游戏业务本身的特性决定的。


结束语

本文简要探讨了十几二十年来,主流服务器框架的发展脉络,以MMO-RPG这种最具代表性的网游类型为主(同时MMO对服务器架构的挑战也是最大的),兼谈到一些其他类型的游戏。由于游戏类型多种多样,各个国家和地区的开发商所偏好的架构方式也大有不同,文中难免挂一漏万,但不太影响整体脉络,也不影响对网游服务器的核心问题的总结——逻辑拆分。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1618702.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

游戏服务器架构设计整理

文章目录 前言一、单进程多线程的服务器设计模式,只有一个进程,但一个进程包好多个线程二、多进程单线程的服务器设计模式,多个进程,每个进程只有一个线程1.早期的MMORPG服务器结构2.中期-用户分离集群式3.中后期数据分离集群式4.…

游戏服务器被攻击了怎么办?

随着互联网的发展,网民数量激增,电子游戏的普及,庞大的玩家数量必然推动游戏市场发展。游戏受到攻击是游戏开发者的痛点,DDOS攻击是流量攻击的一个总称,还包括SYN Flood、ACK Flood、UDP Flood、TCP Flood、ICMP Flood…

经典游戏服务器端架构

文章目录 一、 讨论的背景二、 游戏服务器架构的要素三、核心的三个架构四、 游戏服务器模型的进化历程五、分服模型1.模型描述2.调度架构1.单进程游戏服务器2.多进程游戏服务器 3.内存架构1.动态内存2.预分配内存 4.进程间通讯手段1.Socket通讯2.消息队列3.远程调用 5.容灾和扩…

哪家的云游戏服务器好?如何选择云游戏服务器?

现如今,不少行业领域都对云服务器有不少的需求,尤其是游戏行业,需要专门的云游戏服务器。目前市场上的云游戏服务器有很多种类型,那么,哪家的云游戏服务器好呢?如何选择云游戏服务器?下面就跟着…

游戏开发商如何租用合适稳定的游戏服务器?

随着互联网的快速发展,网络游戏的发展令人目不暇接。有些游戏开发商在开发游戏时,对游戏服务器的要求非常高,毕竟一款游戏最重要的是流畅度。如果大量用户在玩游戏,而游戏直接因为服务器的宕机而崩溃,这种体验可能会直…

游戏服务器开发

1 2-课程概述 https://www.bilibili.com/video/BV1Ks41177oi?fromsearch&seid5543458349378694564nodejs lua STL IO 语言方面 精简 不像Python 无统一 游戏服务器 工作量 不是 网络连接 是 逻辑的 实现 定义 一个 struct 有两个成员 指针 和 值 …

从零开始搭建游戏服务器 第一节 创建一个简单的服务器架构

目录 引言技术选型正文创建基础架构IDEA创建项目添加Netty监听端口编写客户端进行测试 总结 引言 由于现在java web太卷了,所以各位同行可以考虑换一个赛道,做游戏还是很开心的。 本篇教程给新人用于学习游戏服务器的基本知识,给新人们一些…

鹅厂公开课:游戏服务器,了解一下?

讲师简介:张正,腾讯互娱北极光工作室群专家工程师,拥有12年游戏后台开发经验,主导和参与了《天涯明月刀》、《轩辕传奇》等自研大型MMORPG项目的后台开发,现担任《天涯明月刀》项目后台技术总监,北极光后台…

游戏服务器的那些事儿

游戏程序开发有两个大方向,包括前端和后端。其中,前端是指客户端方面,包括PC、手机和平板上面的可视化图形技术。后端则偏向于服务器,即用户不可见的部分。本文将通过游戏服务器的起源、功能特点、分类和发展历史,以及…

〔017〕Stable Diffusion 之 常用模型推荐 篇

✨ 目录 🎈 模型网站🎈 仿真系列🎈 国风系列🎈 卡通动漫系列🎈 3D系列🎈 一些好用的lora模型 🎈 模型网站 由于现在大模型超级多,导致每种画风的模型太多,那么如何选择最…

通达信形态匹配选股,不会编写指标公式也可以形态选股

编写指标公式匹配技术形态难度比较高,公式也很复杂,新手往往难以掌握,即使是老手也常常感到困难。之前编写了N字形态、W底(双底)、头肩底,虽然成功完成,但工作量巨大,公式理解起来也…

python函数学习

def add(num1,num2):resultnum1num2print(f"函数add输出的结果是{result}")return result resultadd(int(num1), int(num2)) print(f"调用def add(num1,num2):这个函数最终返回的结果是: {result}")# 函数返回值 ②无返回值(也就是说是返回值类…

【python】python智能停车场数据分析(代码+数据集)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

Linux驱动之platform设备驱动

目录 前言 一、Linux驱动的分离与分层 二、开发环境 三、驱动程序编写 3.2 platform 驱动模块程序 3.3 测试app程序 四、运行测试 4.1 编译 4.2 运行测试 前言 前面几章编写的设备驱动都非常的简单,都是对 IO进行最简单的读写操作。像 I2C、SPI、 LCD 等这…

嵌入式系统启动文件及其流程的理解

简单概括总结嵌入式上电启动顺序 启动第1步:加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、…

python使用win32库模拟拖拽文件发给指定窗口

最近要用python模拟人的操作给窗口发送拖拽文件的消息,网上搜了一大圈也没搜到现成可用的代码。幸好以前做过vc开发,熟悉点win32编程,于是装上vs和msdn,从消息WM_DROPFILES查起,慢慢得实现了这个功能。 WM_DROPFILES是…

TMS FNC UI Pack 3.1Crack,四个框架和五个操作系统的强大控件

TMS FNC UI Pack是TMS软件的产品,具有针对四个框架和五个操作系统的强大控件和丰富功能。 TMS FNC控件可以在以下框架中同时使用: TMS FNC控件可以在以下操作系统/浏览器中同时使用: TMS FNC控件可在以下IDE中同时使用: TMS FNC U…

TMS FNC组件crack,TMS FNC跨平台的图形组件

TMS FNC组件crack,TMS FNC跨平台的图形组件 TMS FNC Chart 为公司、统计、财政和科学信息开发的完全跨平台的图形组件。 TMS FNC 组件可以在这些框架上同时使用。 TMS FNC 组件可以在这些操作系统/浏览器上同时使用。 TMS FNC 控件可以在这些 IDE 上同时使用。 TMS FNC图表应用…

开源代码扫描工具 Socket新增对 Go 生态系统的支持

导读继日前宣布完成 2000 万美元的 A 轮融资后,开源代码扫描工具 Socket 紧接着宣布新增了对 Go 语言的支持;此前其仅支持 JavaScript 和 Python 语言。 “在过去的几个月中,我们观察到针对 Golang 的供应链攻击有所增加。意识到这种迫在眉睫…

Python数据分析的bs4用法

在爬虫的世界里,数据解析占用很重要的位置 数据解析原理: 标签定位提取标签、标签属性中存储的数据值 bs4数据解析原理: 1.实例化一个BeautifulSoup对象,并且将页面原码数据加载到该对象中2.通过调用BeautifulSoup对象中相关的…