「技术分享」:iOS、Android、H5三端通版本常见问题及解决方案

幼麟棋牌从一开始就选择了 Cocos Creator 作为唯一客户端引擎。 从 Cocos Creator v1.2 正式版本开始,到现在的 v1.4.2(由于项目太多,无法逐一升级。目前大部分项目保留在了 v1.4.2版本。 少量项目进行了 v1.6.1 尝试)。


幼麟棋牌从一开始就设定了一个目标:做 iOS、Android、H5 均可互通的棋牌。这其中,也遇上了不少坑,在此分享给大家,以供探讨。

1

游戏中语音通话问题

棋牌开发,目前实时语音消息已经是标配了。


如果单纯做 APP,可以接入各种 SDK。当然也可以像幼麟一样,自己写一个语音SDK,小巧耐用。 如果单纯做H5,可以直接使用微信提供的语音接口。

但这两类语音接口,所提供的数据格式是不一样的。


1、比较直接的方式,就是 iOS 和 Android 互通,H5 和 H5 互通。 
2、比较绕的方式,就是 iOS 和 Android 接入腾讯语音 SDK,并使用 SDK 的文字识别功能。 这样 H5 平台虽然听不到,但可以看到发言者说的内容,而 H5 这边也是如此,可以让 iOS 和 Android 平台看到文字。这种方式,把地方方言给带的风生水起。

3、服务器转码,强转为三端都可以识别的音频格式。


之所以不能互通的原因,是因为语音格式在不同平台上都不一样。 我们可以克服 iOS 和 Android 的不互通,但无法解决 H5 问题。所以,只有利用另一个中间格式来做支持,比如 MP3。 三个平台的录音发送到服务器,服务器进行强制转码,生成像 MP3 这样的音效文件。 再将这个 MP3 文件存储到云上并广播云地址。 其它平台将这个 MP3 文件当普通的音效文件播放即可。


这个方案的缺点是很明显的:

1、需要消耗服务器大量的 CPU 资源; 

2、对服务器行带宽要求高; 

3、MP3 格式始终比语音格式的文件大,对玩家的带宽要求高。

上面的方式,就看各位客官自己怎么想了。

2

屏幕适配问题

屏幕适配问题一般有两个:宽高自适应,横竖屏切换。


1、宽高自适应
在这里比较推荐的是长边优先。 如果是横屏游戏,优先选择 fixed width,如果是竖屏模式,优先选择 fixed height。


我们以横屏为例。IPAD 为最宽的设备,iPhone 8 为最长的设备。如果这个设备在微信中访问,那么横屏的时候就更远远小于 2:1 了。


因此,我们选择了定宽模式后,在高度适应上要反复测试,尽量在不同的分辨率上都有较好的展现效果。


值得一提的是, 在 IPAD 上玩棋牌的比例远远小于手机上的玩家人数。


因此,确保手机玩家的效果最优,并能够让 IPAD 这类设备显示不出错即可。

2、横竖屏切换
大部分情况是用不上的。但假如你是一个平台性的游戏,并且想以轻量级玩法为主,比如, 牛牛、金花、德州等,竖屏为主。捕鱼、麻将、斗地主等,横屏为主。这个时候就需要用到横竖屏切换了。

Cocos Creator 提供了 cc.view.setOrientation 来进行切换,但仅针对 H5 有效。iOS 和 Android 上,需要自行处理横竖事件,并设置对应的 VIEW 参数。

3

网络机制不统一的问题

socket.io 的 emit 和 on,在 iOS 下都会自动进行 JSON 到 OBJECT 的映射。比如,你可以直接 emit 一个 obj。 服务器那边会自动收到(我们服务器是NODEJS+SOCKET.IO)。


服务器 emit 一个 obj,H5 客户端也会自动收到并转换为 obj。

但在 iOS 和 Android Native上面,就不会自动做这个转换。 如果客户端要强行 emit 一个 obj 给服务器,会挂掉的。


因此解决的办法,就是不管是 H5 还是 Native,都做好 string -> obj 以及 obj->string 的手动转换。

目前的版本中,Native 环境下是收不到 socket.io 断线事件的。 因此需要自行在上层做心跳,并鉴定是否网络超时。

4

微信分享机制不统一的问题

微信分享在 H5 中,只能是点系统的菜单,然后触发对应的回调。 因此,在 H5 中我们需要先设置好对应的 share 信息,以供微信回调。而在 Native 中,则是直接将需要分享的信息发送到分享接口。这两个是截然不同的操作。 因此需要针对 Native 和 H5 的情况,做好界面按钮的事件处理。 

方案无非就两个

1、H5 中分享按钮不显示
2、H5 中点击分享按钮的时候,界面提示玩家点击微信系统菜单中的分享。

5

微信开放平台与公众号互通问题

同一个玩家使用不同的开放平台账号和公众号登陆,拿到的 openid 是不一样的。因此,如果我们使用了 openid 作为玩家账号,是无法做到 H5 与 Native 互通。

基于这个需求,微信提供了 unionid。

普通的开放平台账号和服务号是没有这个 unionid 的。 要想让玩家登陆的时候带有 unionid,需要将公众号梆定到对应的开放平台账号下。

6

加载体验问题

加载体验一般就是指界面部分。 在 H5 中,我们第一次打开一个界面的时间较长,因此会做一个 loading 提示界面。 但在 Native 是不需要的,因为一闪就过了,体验感非常不好。

因此需要鉴别平台,并做好开关。

另外,说到这里。就需要说一下,不管是 Native 还是 H5,都尽量保证场景树上的资源足够少,否则切换场景的体验会非常不好。

7

贴图格式问题

如果要在不同的平台使用不同的纹理格式和压缩比例,最好的策略是在 build 后,执行相应的脚本,然后再进行构建。具体的工作流就由各团队自行研究了。普通的 PNG 压缩,一般使用 pngquat 命令行;PVRTC 压缩,一般使用 PowerVR 官方提供的纹理压缩工具;ETC 压缩,Mali 的工具挺不错。

8

跨域加载头像问题

服务器中转一次就好。值得注意的是,微信头像是不带后缀的,如果我们在地址中拼上 .jpg,也会导致加载失败。

如果我们强制指定 {type:'jpg'} 或者 {type:'png'} 也会有部分玩家加载不出来。 而如果我们不加后缀, cc.loader 又不会把我们加载的数据视为 Texture2D。

解决办法就是, 我们用把地址拼上 .jpg,交以 HTTP 的方式给我们的游戏服务器,游戏服务器去掉 .jpg 后,向微信 API 服务器请求数据加载。游戏服务器再将加载一的数据,以 HTTP 方式返回给客户端,客户端就能正常显示所有的玩家头像了。

9

微信滑动返回问题

在微信中,向右滑动即可关闭微信浏览器。

当我们锁定了手机旋转功能,玩横屏麻将时,如果你要从底部滑动出牌,有可能就会把微信浏览器关了。

解决这个问题的办法就是让它旋转180度,这个在论坛中有同学发过的。

终于整理完成。虽然处理办法简洁了当,但只有当大家在实际项目中真正遇到坑,才能找到一对一找具体的解决方法。问题整理稍显简陋,如果大佬有更深层次的见解,欢迎补充,共同体验「让游戏开发更简单」的处理方式。

幼麟棋牌社区版,是幼麟棋牌的开源版本,用于提供给大家学习游戏服务器编程和客户端编程。 在此之前,幼麟棋牌早已开源在Cocos社区,造成了不小的影响力。 已有不下百个团队或者个人在使用本套代码开发作品。 使用幼麟棋牌框架开发出来的产品更是无法统计,抛开幼麟科技官方的数十款不算,第三方已上线产品不下百款。 幼麟棋牌框架被业内众多爱好者评为 业界清流。 它打破了早期的C++为主的棋牌格局。开创了新一代的纯Javascript脚本模式。 同时也是目前唯一能够一次开发,同时发布iOS,Android,H5三端的棋牌框架。由于其纯脚本特性,在发布iOSAndroid时,天然支持热更新功能。 有了幼麟棋牌的动静,业内也有部分团队开始以棋牌平台为主打,建立开源社区,希望在开源社区找到新的盈利模式。 幼麟棋牌社区版包含功能如下: 完整的服务器客户端源代码,搭建后即可运行 完整的房卡棋牌玩法(加入,创建房间) 完整的四川麻将玩法(血战到底,血流成河两种模式) 房卡战绩记录 微信登陆,微信分享 断线重连 适合人群: 想过完整案例,快速入手游戏开发 想过完整源码,快速开发棋牌游戏 想过完整源码,快速开发麻将游戏 想替换一下美术资源,就拥有一款四川麻将 想直接打个包,就拥有一款四川麻将
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值