关于Matchvs一些使用心得与建议
我的项目是类似《贪吃蛇》玩法的一款IO游戏,就是几个玩家在游戏界面中可以吃食物,也可以相互吃,吃了食物或对方都会变大这样子。我是在用cocos creator做完前端开发的部分后,开始接入的Matchvs。其实在接触Matchvs之前,也了解过国外的一些产品,比如photon、proudNet,不过网络问题和收费是一个现实问题,...毕竟对于一个人开发者来说技术和资金都比较有限,这点大家应该都懂得。
虽然Matchvs把他们提供的服务官方称为“一站式服务”,其实在我看来主要就是两个,一个是接入他们的SDK,可以实现联网功能。二是gameServer,gameServer命令行工具用于后端代码本地调试。后端的代码提交到Matchvs为我们提供的git仓库,直接运行在它为我们提供的服务器中。
在Matchvs有一些像注册、登陆、加入房间、发送事件这种很通用的功能,这些不用花太多时间就能基本掌握。二对我来说,最大好处还是在于几乎不需要对服务器相关知识有所了解,只需要关注前端和后端的逻辑编写,就可以完成一个游戏的开发。
一开始认为,这些api已经可以满足我大部分的需求,但之后在使用过程中,我发现了它设计中一些存在改进空间的地方。
以下是我在接入Matchvs过程中的部分使用总结:
先说优点吧。
1、api简洁且覆盖面广。
关于数据收发,sdk的api有sendEvent、sendEventNotify、sendEventEx;gameServer的api有pushHander、pushEvent。 游戏的数据交互,只用调用这几个接口就可以了。我的项目属IO项目,类似贪吃蛇,一个玩家给了食物调用sendEvent,另一个玩家绑定sendEventNofity, 数据就从这两个简单的api中传递了。
支持多平台,也可以配合其他游戏引擎使用。
例如: 在windows平台, 我使用cocos creator+matchvs开发,按照以下配置,打包成Web Mobile、Web Desktop、Wechat Game、Android、Windows等等平台。
// 以下是伪代码,调用不用环境的的sdk
var engine
var response = {}
if (isNative) {
engine = Matchvs.MatchvsEngine.getInstance()
} else if (isWeb) {
var jsMatchvs = require("matchvs。all")
engine = new jsMatchvs.MatchvsEngine()
response = new jsMatchvs.MatchvsResponse()
} else ...
2、gameServer比较实用。
如果游戏逻辑简单,简单到只需要客户端运行所有的逻辑代码,我们就可以不使用gameServer。 如果游戏逻辑复杂,可以使用gameServer来同一管理所有的客户端。
gameServer+node(gs),使会js的人就可以写后端代码,开发速度更快。
例如在我的项目里,由于房主会变化,客户端中,用房主来判断游戏是否要开始是很繁琐的。 让gs这个大管家来判断的话,就显得很方便, 客户端不需要太关注房主的改变,只需要关心是不是要开始游戏,减少了客户端if-else逻辑。
Matchvs提供了断线重连的功能。
在一些网络差(地铁,电梯),已与服务器异常断开的情况,matchvs会帮助玩家自动连接,开发者可以设置连接次数和频率,但只能满足一些基础场景。
例如: 如果掉线重连了,loginResponse会返回一个roomId的参数,表示是断线重新的, 这时,客户端可以选择重连和忽略。
多节点服务器部署以及帧同步技术
例如: 我的项目是IO游戏,玩家移动的过程中,不断的传递当前位置的数据,画面看上去还是很流畅的,感觉游戏延迟还挺不错的。开发者不用担心数据同步的问题,也不需要对服务器有太多了解,就可以完成一个游戏。感觉还是很棒的。
缺点。
目前,Matchvs主要围绕着'房间'这个概念。创建、加入、获取房间,房间内各成员数据发送和接受。 所以目前不适用于房间外数据发收的场景。
例如: 客户端中,需要修改用户名,这个操作就不能轻松实现。
目前GS不支持数据库,而是使用hashSet,hashGet,用起来太麻烦。 如果有数据存取的需求,开发者需要自己买个数据库服务。
希望后续有数据库支持,或者改为支持使用官方提供的数据库和自己购买的数据库。
GS的命令行工具部分不太好用,存在一些小问题
登陆时密码没有隐藏,错误提示令人不解。
退出是输入quit,而不是习惯的ctrl+c。
关闭debug,断开时间太长,甚至有时无响应。有时只好强关。
gs+node服务使用热更新,会导致gs服务断开等等一些小问题。
官网中,对应的文档比较难找,引导性不强。找个文档需要花不少时间,跟Matchvs团队反馈后是说文档会持续优化,近期也会改版一次文档中心的结构。
有些接口和方法并没有在官方中说明,只能通过查看源码或者询问官方了解使用方法。
例如: 在研究Demo-GS-JS的时候,想到一个问题,gameServer给客户端推送消息的时候,客户端用什么来监听。后来,知道是由sendEventNotify来接收的。
我发现文档并没有这个描述。官网表示,会尽快补上所有的缺少的说明
回调的写法不科学。
例如: mvs。response。sendEventResponse = callback(msg){} mvs。engine。sendEvent(data) 这种写法是很不科学的,如果后续代码中也有sendEventResponse, 在此之前的sendEventResponse就会被覆盖。
建议: 回调的方式改成 sendEvent(data, callback(err, msg) { })
特别提示
随机加入和指定加入的房间是相互独立的。
例如: 通过'随机加入'加入的房间,用户想通过'指定加入',是加入不了这个房间的。
官方人员解释也是这么一回事。但是,官方文档并没有说明,希望官方人员注意到这一点。
刚收到joinRoomNotify通知时,用户与其他用户不一定能消息通知。
例如: 此时其他人(客户端)给加入者发送消息,这个加入者很大可能不会收到。
官方人员给予了解释: '这时用户已经在房间中了,但是还没有和其它玩家建立通讯通道。目前js-SDK还不够完善,应该确定通道建立完成后再发出joinRoomNotify通知', 并表示后续版本会修改这个bug。
我的解决方案: 在上述的加入者joinRoomResponse的时候,发送isEnter消息,告知其他人,我是真的进来了。
问题与建议差不多就这些了,不过有一点要说明下,虽然在之后的使用过程中的确遇到的一些问题,但这里要特别感谢下官方客服在Q群里面耐心解答与卖力优化(可以感觉到这是一个在用心做产品的团队,现在想起来那个客服八成就是Matchvs的产品),让游戏顺利上线并保持稳定运行。
PS:听说Matchvs最近马上要更新一个大版本优化,小小期待一下,希望能越来越好吧。
关于Matchvs一些使用心得与建议的更多相关文章
- Python使用心得之魔法参数**kw
通过设置字典类型参数直接传递给接收魔法参数(**kw)的方法,对应赋值.示例如下: jdbcConnectionDict = {, , 'database': 'test', 'charset': ' ...
- 单片机小白应该如何学习stm32的一些实践心得!
嵌入式搬砖道路上的大三狗一枚,撑死算个初学者吧.才学有限,下面仅仅是本人对STM32学习的一点心得与建议,希望对题主有帮助吧. 心得:本人当初学习STM32的时候有一些跟风的因素,自以为学的芯片越多就 ...
- JS面向对象的程序设计
面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...
- 知道创宇研发技能表v3.1
by @知道创宇(www.knownsec.com) @余弦 & 404团队 后续动态请关注微信公众号:Lazy-Thought 说明 关于知道创宇 知行合一 | 守正出奇 知道创宇是一家黑客 ...
- 知道创宇研发技能表v3.0
知道创宇研发技能表v3.0 2015/8/21 发布 by @知道创宇(www.knownsec.com) @余弦 & 404团队 后续动态请关注微信公众号:Lazy-Thought 说明 关 ...
- 装黑苹果的那些事儿(以ThinkpadE540为例)
苹果系统,有着比window更好的安全性和方便性,更重要的事,没有MAC系统环境,进行iOS开发,是很麻烦的,对新手来说,是很懊恼的一件事.但是白苹果像件奢侈品,吾等常人,很难有经济消费.如是黑苹果是 ...
- Linux服务器建站基础-选择何种配置和安装环境项目
我们准备在搬瓦工笔记中,边整理和分享利用Linux VPS建站过程的同时,也会分享关于用户在选择和使用VPS服务器以及网站管理运营中的一些心得和建议.经常有很多网友在很多主机论坛.QQ群众问道,有没有 ...
- 速成KeePass全局自动填表登录QQ与迅雷(包括中文输入法状态时用中文用户名一键登录)
原文:http://bbs.kafan.cn/thread-1637531-1-1.html 使用目的:1 网页和本地客户端登录一站式解决2 通过KeePss修改密码和登录更方便,可以复制粘贴,省了输 ...
- 91 Testing Linux学习笔记
91 Testing Linux学习笔记... 学习地址:91Testing 的Linux教程=====================学习网址:http://www.91testing.net/ar ...
随机推荐
- Linux网络配置(仅主机模式)
1.启动虚机,网络选择:仅主机模式 2.命令行输入 rm -rf /etc/udev/rules.d/70-persistent-net.rules 3.修改虚机中的网络配置 >>vim ...
- 命名参数名(含*args , * *kw的区别)
要限制关键字参数的名字,就可以用命名关键字参数 # coding=utf-8 # 命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数.调用方式如下 def person(name, ...
- 定点化_mif文件生成
clc; %全屏清零 clear all; %变量清零 N=^; %设置ROM深度(字变量)的变量参数, s_p=:; %正弦波一个周期的采样点数 sin_data=sin(*pi*s_p/N); % ...
- hdu1249 三角形分割平面---递推
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1249 题目大意: 用N个三角形最多可以把平面分成几个区域? 思路: 知道了直线和折线分割平面的情况这 ...
- delphi 10.1 Berlin 中使用自带的 MD5 校验
uses System.Hash;//要引用这个单元哈 var Digest: TBytes; MD5: THashMD5; MD5Buf: TBytes; params: string; begin ...
- 在MySQL中使用子查询
子查询作为数据源 子查询生成的结果集包含行.列数据,因而非常适合将它与表一起包含在from子句的子查询里.例: SELECT d.dept_id, d.name, e_cnt.how_many num ...
- Spring Cloud学习笔记-009
API网关服务:Spring Cloud Zuul API网关是一个更为智能的应用服务器,它的定义类似于面向对象设计模式中的Façade模式,它的存在就像是整个微服务架构系统的门面一样,所有的外部客户 ...
- java设计模式之代理设计模式(Proxy)
一个简单Proxy代理模式范例 interface Subject{ //定义核心主题所要完成的功能 public void make(); } class RealSubject implement ...
- [LeetCode] Next Greater Element III 下一个较大的元素之三
Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly th ...
- 众说纷纭的ul、ol、li
(1)提到ul ol li,大家都知道,就是三个列表标签,ul表示无需列表(unordered list),ol表示有序列表(oredr list), li 表示列表项(list item),之前我也 ...