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

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

既然 MMORPG 都有千篇一律同质化的趋势,好歹我们技术人员也应该总结出点东西来,新项目开发可以用现成的模式。

一般来说,MMORPG 服务器要解决的问题无非是,同步玩家的位置,状态,把这些信息广播出去(细分的话,有非战斗环境和战斗环境);需要建立一个聊天服务,供玩家文字交流;有一个信息发布渠道;有任务 NPC 和玩家一对一交流;玩家调整自己的装备(也可以看成是和一特定 NPC 交流)。

以上,我们可以看到几个基本需求是可以正交分解出来,并有不同的实现方式的。

同步玩家的状态,基本上是由玩家自己不断提交自己的最新状态,然后由服务器把这些信息广播给其他人。

聊天服务比较成熟,基本上就是玩家订阅聊天频道,并按权限向频道内发布信息。

信息发布可以看成是一个特殊的聊天频道。

任务 NPC 或是整理自己装备,都类似于向特定节点做请求等待回复。

我经历的几个 MMO 项目都实现的比较简单,无论是 server 还是 client ,都是跑一个消息循环,对每个到来的消息包进行处理。通常都是一个 timer 消息源和一个网络包消息源,共同组成最终的消息源,主程序是标准的消息循环分发结构。

但对比前面的需求,可以看到,这些方式略显简陋。最后能再此基础上再做一个层次的封装工作,让这些不同的需求可以分开处理。更方便的解决一些有状态的需求,或是能够对信息处理进行优先级排序。

最近一段时间,我受 zeromq 的设计思想影响较多。对于未来的项目设计方法,我有一些想法需要梳理一下。

玩家 Client 和游戏 Server 方面,我还是倾向于采用单一的 TCP 连接。但是希望再其上加一个层次。可以在单一 TCP 连接上模拟多个通讯信道。实现 zeromq 提出的几个模式(的变形)。

在我看来,MMORPG 的服务器端,可以看成是若干服务的集合。那么这些服务无论布置在哪里,我都希望他们是在一个逻辑上的网络中。玩家通过网关也接入这个网络,并可以根据授权来使用网络上的服务。

抛开玩家登陆(注册)流程不谈。典型的场景是玩家在虚拟场景中漫步。这可以看成是 Client 订阅一个指定场景的环境。订阅本身会先鉴权,服务器会查阅玩家是否有权限订阅(玩家是否在这个场景中)。场景会不断的发布场景中每个玩家,NPC 的动态。订阅者将不断的获得这些信息。由于性能问题,我们可以把不同类别的信息放在不同的订阅点上。订阅可以按需进行。

玩家会选择向特定场景 PUSH 自己的状态数据,按 zeromq 的模式,这应该走另一个信道。

每个可对话的 NPC 都可以看成是一个特定服务。玩家向它建立连接,然后以 Request/Reply 模式工作。这样可以方便完成带状态的任务。同样,建立连接的过程可以引入鉴权(比如说检查玩家是否在 NPC 附近等)。当然,NPC 同样需要订阅场景,当场景中和他交流的玩家跑开后,可以自动切断信道。

战斗部分的处理可以独立。以即时战斗为例,战斗计算服务订阅场景中对象的位置和动作。计算他们的动作的后果,得到每次攻击的伤害值。它自己是一个信息订阅点,玩家通过订阅战斗服务,可以了解场景中每个个体受伤害的情况。

同样,某些增值服务,比如自动寻路,都可以独立出来实现。


只是一些想法,希望整理出来后,可以有更多启发。对人也对己。

相关 [传统 mmorpg 通讯] 推荐:

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

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

MMORPG 中场景服务的抽象

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

电影通讯2011

- zun - 卫西谛,照常生活
【选了上半年看的一些新片做小小推荐,在微博上陆续写过(http://t.sina.com.cn/weixidi)】. 阿尔及利亚堤比邻修道院的七位法国修士,96年遭到恐怖分子绑架继而被杀害. 牺牲与殉道让人恍若看见最后的晚餐. 坚定者在死亡阴影里免除疑惧,重新回归日常生活,无论未来如何. 诵经歌声圣洁:除了爱,什么都不存在.

网络通讯协议图

- 李斌 - C++博客-首页原创精华区
阿π 2010-11-04 14:13 发表评论.

Android_ContentProvider_访问通讯录

- - CSDN博客推荐文章
本博文为子墨原创,转载请注明出处. 联系人提供者是一个很强很灵活的应用组件,用来管理联系人信息,可以方便的操作和查询联系人信息. 主要的3张表格,contact,raw contact,data,但是我们操作主要为raw contact,data两张表. /** * 使用批处理,插入联系人信息 * 插入姓名,email,家庭电话,工作电话,手机号码信息 * @param view */ public void insert() {.

JAVA 远程通讯机制

- - 移动开发 - ITeye博客
远程服务通讯,需要达到的目标是在一台计算机发起请求,另外一台机器在接收到请求后进行相应的处理并将结果返回给请求端,这其中又会有诸如one way request、同步请求、异步请求等等请求方式,按照网络通信原理,需要实现这个需要做的就是将请求转换成流,通过传输协议传输至远端,远端计算机在接收到请求的流后进行处理,处理完毕后将结果转化为流,并通过传输协议返回给调用端.

TCP协议通讯流程

- - 操作系统 - ITeye博客
服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN-ACK段,客户端收到后从connect()返回,同时应答一个ACK段,服务器收到后从accept()返回.

JAVA RPC 通讯框架

- - 经验沉淀 知识结晶
Bison 是一个JAVA 程间的通信框架,基于apache mina 实现,对mina进行了byteBuffer 缓冲区重用以及半包出处时减少拷贝. 客户端(bison-client) 功能点. 2 支持高用性:高可用的一个基本原则,可以接受快速的失败,但不能接受长时间的等待. Githup地址:https://github.com/gavenpeng/Bison.

大数据和传统BI

- - 人月神话的BLOG
对于传统企业内部,更多的应该是使用了大数据技术的传统BI平台,或者是融合了传统BI+大数据的混合平台,而不能单纯说是大数据平台. 在谈大数据平台的时候,一味去否定传统BI是不合适的. 在没有和互联网打通的传统企业内部,更多接触的仍然是结构化数据, 优先要解决的是围绕企业核心价值链的数据建模和企业战略,各业务域KPI体系的建立,决策支持和分析这些内容.