热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

游戏服务器架构通识BigWorlds丨skynet

前言我们将从游戏服务器发展的简单历程出发,鸟瞰一下目前大多数的游戏服务器架构。这里尽可能的避免陷入细节的技术问题,而是从技术进化的结果状态ÿ

前言

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

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


一、早期网游服务器。

蛮荒时期的游戏服务器框架我们一笔带过,那时的游戏服务器和一个小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对服务器架构的挑战也是最大的),兼谈到一些其他类型的游戏。由于游戏类型多种多样,各个国家和地区的开发商所偏好的架构方式也大有不同,文中难免挂一漏万,但不太影响整体脉络,也不影响对网游服务器的核心问题的总结——逻辑拆分。


给大家推荐一个关于skynet项目实战的一个训练营 现在报名相当于免费,主讲内容:

多核并发编程
消息队列。线程池
actor消息调度
网络模块实现
时间轮定时器实现
lua/c/接口编程
skynet编程精要
demo演示actor编程思维

地址:点击观看视频
更多skynet资料加群:832218493免费领取!
在这里插入图片描述


推荐阅读
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 近年来,BPM(业务流程管理)系统在国内市场逐渐普及,多家厂商在这一领域崭露头角。本文将对当前主要的BPM厂商进行概述,并分析其各自的优势。目前,市场上较为成熟的BPM产品主要分为两类:一类是综合型厂商,如IBM和SAP,这些企业在整体解决方案方面具有明显优势;另一类则是专注于BPM领域的专业厂商,它们在特定行业或应用场景中表现出色。通过对比分析,本文旨在为企业选择合适的BPM系统提供参考。 ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • Node.js 配置文件管理方法详解与最佳实践
    本文详细介绍了 Node.js 中配置文件管理的方法与最佳实践,涵盖常见的配置文件格式及其优缺点,并提供了多种实用技巧和示例代码,帮助开发者高效地管理和维护项目配置,具有较高的参考价值。 ... [详细]
  • TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得
    TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得 ... [详细]
  • 在当今的软件开发领域,分布式技术已成为程序员不可或缺的核心技能之一,尤其在面试中更是考察的重点。无论是小微企业还是大型企业,掌握分布式技术对于提升工作效率和解决实际问题都至关重要。本周的Java架构师实战训练营中,我们深入探讨了Kafka这一高效的分布式消息系统,它不仅支持发布订阅模式,还能在高并发场景下保持高性能和高可靠性。通过实际案例和代码演练,学员们对Kafka的应用有了更加深刻的理解。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • 免费赠送《Python Selenium WebDriver 3.0 自动化测试框架实战指南》电子书资源
    免费赠送《Python Selenium WebDriver 3.0 自动化测试框架实战指南》电子书资源 ... [详细]
  • MongoDB核心概念与基础知识解析
    MongoDB 是一种基于分布式文件存储的非关系型数据库系统,主要采用 C++ 语言开发。本文将详细介绍 MongoDB 的核心概念和基础知识,包括其与传统 SQL 数据库的区别,数据库及集合的基本操作,如数据的插入、更新、删除和查询等。通过本文,读者可以全面了解 MongoDB 的基本功能及其应用场景。 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
  • 人人租机作为国内领先的信用免押租赁平台,为企业和个人提供全方位的新租赁服务。通过接入支付宝小程序功能,该平台实现了从零到百的迅猛增长,成为全国首家推出“新租赁小程序”开发服务的阿里巴巴小程序服务商(ISV)。这一创新举措不仅提升了用户体验,还显著增强了平台的市场竞争力。 ... [详细]
author-avatar
珠海南驰焊接检测工程有限公司
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有