MMORPG 中场景服务的抽象

标签: 游戏开发 | 发表时间:2011-08-10 17:15 | 作者:云风 2sin18
出处:http://blog.codingnow.com/

MMORPG 中,场景信息同步是很基础而必不可少的服务。这部分很值得抽象出来,专门做成一个通用的服务程序。

此服务无非提供的是,向有需求的对象,同步场景中每个实体的状态信息。那么,我们分解需求,可以看到两点,一是提交状态,二是同步状态。

每条状态信息其实是由三部分构成,状态对象名(key)、状态值(value)、时间。

玩家、NPC、场景中的可变物品,其实都有可改变的状态。比如对象的位置坐标是最常见的状态。其它的状态还有玩家或 NPC 做的动作,玩家离线,上线,等等。

可以有若干数据源向这个服务提供数据,如果借用 zeromq 中的模式的话,这个服务应该使用一个 PULL socket 收集数据。它获取从不同数据源 PUSH 来的,key-value 。然后打上时间戳,储存在内存中。

这个服务另外提供一个发布服务,向所有订阅者广播其收到的状态改变信息,每条信息包括推送来的 key-value 以及附加上去的时间戳。

第三,这个服务应该提供一个请求应答服务,除了订阅模式外,允许别人索取从指定的 timeline 到现在的所有状态。这多用于新的订阅者上线,它需要获取历史上的状态信息。

综上,这三条看起来就是一个 twitter 的基础服务,但缺少了对象之间的关注关系。嗯,在这个简化系统中,这点是可以省略的。另外,状态并不是 tweet 。我们在意的是对状态的修改,而不是同一 key 下的历史上所有状态值。比如,我们只关心一个玩家当前最新的位置,而不关心他历史上在哪里。


这个玩意能做什么?除了同步玩家和 NPC 的位置外,还可以作为战斗系统的基础。比如,玩家做一个攻击动作,可以做为一个状态提交。对于显示来说,场景中的其它玩家都应该看到他做这个动作。但一个额外的战斗模块也可以通过订阅场景,了解到这个玩家做了攻击动作。

之后,战斗模块通过其它途径获得这个攻击动作的具体含义(会产生多少伤害等等),进行运行,得到结论。而进入战斗状态的玩家,可以通过订阅战斗模块发布的信息来获得细节。

嗯,这只是举例说明其一可以想到的用途而已。如果我的归纳没有错误的话,提供上面基本服务的设施,可以做的事情很多,却只需要实现定义好的简单需求了。再列一下:

  1. 一个 PULL socket,获得格式为 key-value 的状态信息。收到后加上 time 储存。

  2. 一个 PUB socket ,一旦受到 1 里面获得的状态信息,即可连同 time 发布出去。

  3. 一个 REP socket ,收到 REQ 请求(一个 time 值),把从这个时间点之后的所有状态信息反馈回去。


下一步,我们看看怎么增强这个服务,解决更复杂的问题:场景很大怎么办?

我们的状态信息还需要增加一个部分,位置。即 key-value-position 。

我们可以增加发布点,把场景分成若干区域,每个区域树立一个灯塔。position 本身会被匹配到临近的几个灯塔上。每个灯塔都是一个子发布点。

增加这样一个服务 :提供一个 REP socket ,收到 REQ 请求(一个position 值)后,返回若干临近的灯塔 id 以及灯塔的信号半径 。然后,用户可以选择订阅这些灯塔。当发现自己的视野即将超出灯塔覆盖后,可以重新索取更换一批灯塔。


关于状态的删除。当物品消失,玩家下线,npc 死亡 等等事件发生后,相关状态,变得只有时间线最后一条信息有意义了。这个时候我建议提交 k/v 对的时候将 v 设置为空,表示把这条状态删除。这样以后用户在请求时就不用获取到无用信息了。

相关 [mmorpg 中场 服务] 推荐:

MMORPG 中场景服务的抽象

- 2sin18 - 云风的 BLOG
MMORPG 中,场景信息同步是很基础而必不可少的服务. 这部分很值得抽象出来,专门做成一个通用的服务程序. 此服务无非提供的是,向有需求的对象,同步场景中每个实体的状态信息. 那么,我们分解需求,可以看到两点,一是提交状态,二是同步状态. 每条状态信息其实是由三部分构成,状态对象名(key)、状态值(value)、时间.

传统 MMORPG 通讯模式实现的一点想法

- Rabbit, run - 云风的 BLOG
既然 MMORPG 都有千篇一律同质化的趋势,好歹我们技术人员也应该总结出点东西来,新项目开发可以用现成的模式. 一般来说,MMORPG 服务器要解决的问题无非是,同步玩家的位置,状态,把这些信息广播出去(细分的话,有非战斗环境和战斗环境);需要建立一个聊天服务,供玩家文字交流;有一个信息发布渠道;有任务 NPC 和玩家一对一交流;玩家调整自己的装备(也可以看成是和一特定 NPC 交流).

服务禁语

- tiancaicai - 白板报
前几天在一个公交汽车站拍到了一张规定,里面规定了服务禁语和礼貌用语,看了大乐. 3、乘车高峰车厢内拥挤时,禁语:“快往里走,站在前面又没有钞票检. ”文明语:“请尽量往里走,照顾没有上车的乘客”. 4、车子抛锚,禁语:“车子抛锚没有办法,人都要生毛病的,车子坏了也正常. ”文明语:“对不起,车子出现故障修一下,请大家理解.

服务熔断

- - CSDN博客推荐文章
服务熔断也称服务隔离,来自于Michael Nygard 的《Release It》中的CircuitBreaker应用模式,Martin Fowler在博文 CircuitBreaker中对此设计进行了比较详细说明. 本文认为服务熔断是服务降级的措施. 服务熔断对服务提供了proxy,防止服务不可能时,出现串联故障(cascading failure),导致雪崩效应.

面向服务与微服务架构

- - CSDN博客推荐文章
最近阅读了 Martin Fowler 和 James Lewis 合著的一篇文章  Microservices, 文中主要描述和探讨了最近流行起来的一种服务架构模式——微服务,和我最近几年工作的实践比较相关感觉深受启发. 本文吸收了部分原文观点,结合自身实践经验来探讨下服务架构模式的演化. 面向服务架构 SOA 思想概念的提出已不是什么新鲜事,大概在10年前就有不少相关书籍介绍过.

经理服务生

- netcasper - 坏脾气的小肥
2007年的时候,我和内容团队一起去报道上海车展,累得够呛,写稿子到凌晨一两点,早上八点钟又要爬起来去现场或更新早班. 有天上午,编辑都挤在大会议室里忙活着整理、发布、撰稿,而我搞完了竞品检查/数据分析/计划修订,一时间闲着,就打算去买些零食给大家. 环顾四周,没人有空,只好自己下楼,嘿咻嘿咻拎了两三百块钱的零食上来.

Kernel.org恢复服务

- Adam - Solidot
kernel.org 王者归来 写道 "Linux内核官网在八月份遭入侵,之后于9月11日linux.com linux.org kernel.org LinuxFoundation.org皆无法访问,进行安全维护. 经过紧张的修复,kernel.org终于恢复服务. LinuxFoundation.org也可以正常访问.

谈领域服务

- - 人月神话的BLOG
对于跨系统和模块间的SOA服务识别和分析我前面文章谈的比较多,这块的SOA服务重点是实现跨系统和模块的业务交互和协同,而对于领域服务而言则更加关心的是对于单个系统或模块,其应该如何抽象领域对象并将其能力以粗粒度服务方式保留给应用层用. 在领域建模中的整体思路中,我们做两个层面的理解,其一是领域模型层重点是隔离传统的数据表并抽象为领域对象;而对于领域服务层重点是则将应用层和领域模型层解耦,模型层提供的能力是以领域服务的方式暴露到应用层使用的.

DNS服务-详解

- - 操作系统 - ITeye博客
DNS(Domain Name System)域名系统,在TCP/IP网络中有非常重要的地位,能够提供域名与IP地址的解析服务. <1> 客户机提交域名解析请求,并将该请求发送给本地的域名服务器. <2> 当本地的域名服务器收到请求后,就先查询本地的缓存. 如果有查询的DNS信息记录,则直接返回查询的结果.

初识微服务

- - ITeye博客
微服务架构越来越火,有必要学习一下. 软件开发过程中碰到什么问题. 一个简单的应用会随着时间推移逐渐变大. 在每次的sprint中,开发团队都会面对新“故事”,然后开发许多新代码. 几年后,这个小而简单的应用会变成了一个巨大的怪物. 一旦你的应用变成一个又大又复杂的怪物,那开发团队肯定很痛苦. 敏捷开发和部署举步维艰,其中最主要问题就是这个应用太复杂,以至于任何单个开发者都不可能搞懂它.