可复用的游戏服务器端开发框架之副本系统

在早期的联网游戏中,有两种典型的不同种类,一种是类似《传奇》的全地图,分区分服的MMORPG;另外一种则是类似QQ Game类型的“大厅-开房间”的全区全服游戏。

这两种游戏在底层架构上有非常大的差异。但是,随着网络游戏的发展,在MMORPG中出现了类似开房间的“副本”系统,甚至出现了可以跨服跨区玩的“副本”;而开房间的游戏也离开了简单的UI界面,出现了《地下城勇士》(DNF)这类所有战斗都发生在关卡副本中的游戏。到后来,如《英雄联盟》《星际争霸2》这类复杂的游戏,都渐渐走上了全区全服开房间的架构。因此,本章的名字叫“副本系统”,其实也可以叫“大厅-房间”系统。

在“副本系统”中,最需要考虑的是游戏服务器的隔离性和生命周期。这时游戏服务器不再简单的代表一个静态的“虚拟世界”,而是一批动态的,不断生灭的小虚拟空间。同时我们还需要一个相对静态的“大厅”。

因此在副本系统中,最典型的模型就是:大厅、房间这两个概念。大厅提供玩家的接纳,了解房间的情况,提供玩家对房间的管理、操作;有很多游戏还需要提供自动匹配建立房间的功能。而房间则应该是一个对游戏关卡的容器,能承担任何一段游戏逻辑,但是需要大厅提供一组玩家和选择关卡作为输入,最后在结束时提供一个返回给大厅,修改房间的状态和触发玩家的关卡结算。对比与那些复杂的游戏逻辑系统,副本系统本身。

这个模型下各类的行为:

  • 大厅
    • 列出所有房间
    • 使用关卡数据建立房间
    • 角色进入、离开房间
    • 启动房间游戏
    • 自动匹配玩家进入房间
  • 房间
    • 输入关卡数据构建房间
    • 房间类型setter/getter:公开、加锁
    • 关卡数据getter/setter
    • 列出房间中所有副本角色
    • 列出房间所有者(队长)
    • 切换房间所有者(队长)
    • 启动关卡对应游戏
  • 副本角色(与玩家角色类型绑定的模板类)
    • 根据玩家角色构建
    • 返回副本角色匹配数据:匹配数据为一个map类型自定义结构
    • 返回玩家角色对象
    • 准备就绪-锁定
  • 关卡(与关卡数据类型绑定的模板类)
    • 关卡人数范围
    • 返回关卡对应游戏数据:游戏关卡数据为另外定义的特有类型,因此此方法应该为模板方法。
    • 启动关卡对应游戏(虚函数):输入副本角色(玩家列表),根据自身具体游戏数据启动。
    • 副本角色中断副本,离线保存(虚函数):当玩家断线或其他操作,系统调用此回调
    • 副本角色重新进入副本(虚函数):当玩家重新进入游戏,系统调用此回调

副本系统的整体调用流程:

总结

本文初步介绍了可重用的游戏服务器框架中的三层结构。其中底层的通用性强,技术含量高,关注非功能特性较多,事实上你可以用这个底层开发任何后台服务器,其对游戏最有意义的功能在于广播和复杂结构的本地数据缓存能力。

而框架的中层结构,提供了大量的游戏业务领域的建模,这些建模也许不是非常详细,不够详细,但是如果我们坚持分层设计原则,并且以库和开放源码的方式去维护,那么这些中层模型将日渐强大,成为可重用代码的核心模块,让游戏开发效率飞速提高。

游戏的高层模型更依赖于具体游戏内容,但是如果能在此框架下开发,那么其通用性将通过少量特异化修改来实现;同时这些高层模型,在一定积累和沉淀后,很容易的就能成为通用性更强的中层模块。这个转换并无任何硬性规定,而是随项目和使用团队(社区)的变化而变化的:当某个游戏设计成为“主流”,对应的实现代码就能成为可服用的模块——这正是整体框架想要表现的最重要功效。

感谢大家的阅读,如觉得此文对你有那么一丁点的作用,麻烦动动手指转发或分享至朋友圈。如有不同意见,欢迎后台留言探讨。

原文发布于微信公众号 - 韩大(handa1740168)

原文发表时间:2016-01-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯云数据库团队的专栏

云MongoDB优化让LBS服务性能提升十倍

腾原生MongoDB在LBS服务场景下有较大的性能瓶颈,经腾讯云团队专业的定位分析与优化后,云MongoDB在LBS服务的综合性能上,有10倍以上的提升。

7922
来自专栏BestSDK

Getting Things Done|浅谈一个初学者眼中的 GTD 成型与逻辑

image.png 相信各位在接触 Things、OmniFocus 这样的软件之前,是不是也曾去了解过其核心价值 GTD 的概念?可能在这之后,不少人会觉得...

2385
来自专栏SAP最佳业务实践

想学FM系列(7)-SAP FM模块:主数据(5)-基金计划程序

3.1.4 基金计划程序 基金计划程序是可选账户分配要素,可以用它来进行跨公司、跨年度的框架内预算控制,比如一个大型项目。它同其他账户分配要素不同,它可以直接进...

2748
来自专栏杨建荣的学习笔记

Active Data Guard初探(一) (r10笔记第76天)

对于Active Data Guard,我是这样想的,可能会有很多不对的地方,互相讨论,一起补充吧。 如果有一天我成了Oracle的产品架构师,时光倒退...

3109
来自专栏AI科技大本营的专栏

经验 | 如何成为一名顶级战斗力的数据分析师?

翻译 | AI科技大本营(rgznai100) 参与 | reason_W 不知道大家以前听没听说过“10x Developer”这个词,如果你连听都还没听说过...

2777
来自专栏程序人生

是时候想想该怎么删代码了

武林外传里秀才怼上姬无命,来了一段关于「我是谁」的精彩逼问。 我是谁?我生从何来,死往何处,我为何要出现在这个世界上?我的出现对这个世界来说意味着什么,是世界选...

33111
来自专栏有趣的django

Django+xadmin打造在线教育平台(七)

代码 github下载 十、授课教师  10.1.讲师列表页 拷贝teacher-list.html和teacher-detail.html到template...

41010
来自专栏挖掘大数据

如何成为一名10x的数据分析师?

不知道大家以前听没听说过“10x Developer”这个词,如果你连听都还没听说过,那可真是时候考虑放弃自己的程序猿事业了。就像传说一样,一些程序猿的战斗力能...

2058
来自专栏AI研习社

用Python支持 7 亿月活用户的应用?Instagram 是这样实现的

PyCon 简介 PyCon 是全世界最大的以 Python 编程语言 为主题的技术大会。大会由 Python 社区组织,每年举办一次。在大会上,来自世界各...

3826
来自专栏数据库

NoSQL为什么需要模式自由的ETL工具?

【IT168 评论】了解一个开源工具,可以有效帮助人们解决NoSQL在数据输入、处理、输出方面困难。大数据时代,不了解NoSQL数据库的程序员大抵应该是没有的吧...

18610

扫描关注云+社区