前言
《欢乐坦克大战》是一款3V3实时竞技微信小游戏创作,是最早在线发布的游戏之一。由于这款游戏是最重要的微信小游戏之一,项目的开发周期很短,游戏复杂度、开发难度、性能挑战也很大,项目组先后开发了单机版和联机版。完全的。一个月内玩一场战斗游戏。
同时,由于客户端开发团队核心成员拥有多年cocos2dx引擎开发经验,项目组决定使用CocosCreator V1.6.1版本引擎进行开发。微信小游戏平台使用的JavaScript语言,开发团队基本上是从零开始,边学边做,是一个很大的挑战。
1. 架构
关于网络通信,项目使用WebSocket协议进行通信,通信格式为json。为了支持tdr xml 协议,项目团队开发了专有的tdr-json 转换工具。
为了帮助学生计划使用Excel表格进行数据组织,项目团队开发了一个工具将Excel转换为JSON文件,以便客户可以读取配置文件。
对于地图,我们没有使用cocos引擎自带的TileMap,而是自己实现了类似TileMap的机制。规划学生可以使用工具在Excel中配置地图信息,并将Excel转换为JSON格式的地图文件以供客户端加载。
由于开发进度紧张,单机玩法和PVP玩法必须同时开发。所以我们封装了一个驱动战斗逻辑的命令层(CMD层)。例如,使用摇杆控制坦克的移动,在独立模式下,表示层将CMD命令发送到逻辑层进行处理,CMD保存在客户端的本地列表中,然后发送到命令管理器。它将被保存。 CMDMgr 在更新层处理期间读取本地命令列表以驱动逻辑。在战斗模式下,CMD命令被发送到服务器,服务器将它们广播给所有玩家,并且玩家客户端的命令管理器CMDMgr驱动逻辑层在更新期间进行处理。引入命令层(CMD层)后,战斗逻辑层变得抽象和独立,开发者无需担心当前的玩法模式,并且可以轻松复用,降低开发成本。
在PVP实时战斗中,客户端进行碰撞检测,将碰撞检测结果通知服务器,服务器验证并计算伤害并广播给其他玩家。游戏支持断线重连和客户端崩溃重连机制,服务器会发送战斗过程中的所有状态数据,客户端会恢复战斗场景。
基于时间戳的位置点同步算法用于玩家位置同步。该算法最初用于《全民飞机大战》中的双打和决斗模式。《全民飞机大战》实时战斗采用UDP通讯。《欢乐坦克大战的》 在WebSocketTCP环境中也获得了良好的结果。算法原理如下。
2. 挑战
在开发过程中,我们遇到了很多挑战,但具体我们一一解决了以下问题。
1.微信小游戏平台增加动态代码执行限制
微信小游戏平台对eval(\’console.log(1)\’)、new Function(\’console.log(1)\’)、setTimeout(\’console.log(1)\’)等代码的动态执行有限制。 )\’) call 方法无法被调用。 CocosCreatorV1.6.1 源码中广泛使用的函数为了解决这个问题,我们联系了cocos 引擎的开发者,并参考了cocos 1.7 版本(当时尚未发布)的修复,修复了部分源码。这个问题就解决了。
2.微信小游戏不能超过400万个
正如标题所示,微信小程序对大小有严格的要求。我们想了各种办法来解决这个问题。
措施一:定制引擎,通过删除不必要的模块来减小引擎的体积。这可以通过配置引擎模块来实现。
措施二:图像压缩
PNG图像压缩工具pngquant可用于有效减小PNG图像的文件大小(通常压缩60%-70%)。
即使采取了上述两种措施,资源仍然高于标准,所以唯一的解决办法就是采用资源的动态下载。
措施三:动态下载资源
游戏中添加了资源更新场景。启动游戏时,更新场景资源时并不创建游戏业务模块,而是在场景发生变化之前在游戏场景内创建并初始化业务模块。具体计划如下。
1. 首先,下载资源更新配置文件。该文件包含资源下载列表和资源验证MD5信息。
2.根据资源下载列表将验证MD5与本地文件进行比对。如果相同,则不会下载。如果不同,则会下载。
3. 下载完成后,运行MD5 验证。如果验证失败,请删除本地文件并重新启动下载过程。这里的MD5验证不仅可以验证资源的下载是否正确,还可以起到防止资源被非法修改、防止资源欺诈的作用。
4、修改cocos引擎源码,将加载管道中读取资源替换为读取本地下载文件。
由于游戏运行中可能出现Bug,可能需要发布客户端补丁。资源更新配置文件可以多次修改,这可能会导致CDN更新延迟并导致某些播放器下载可能是旧版本的配置文件。此外,出于成本原因,一些中小型企业会缓存旧文件。以前的项目如果出现这样的情况,我们一般会联系玩家确定问题原因,如果确定是操作人员造成的,就会报告给运维同学和A网络部的同事推了话务员。这效率不高。为了减少这种情况发生的可能性,我们使用双CDN策略。
具体做法是对同名文件添加版本号机制,将文件内部存储中的版本号+1,更新文件时在两个不同的CDN上更新。客户端下载时,会下载版本号较高的两个文件。这样,在更新配置文件时,只能同步两个不同CDN中的一个,这不仅减少了CDN更新延迟,还减少了操作员缓存问题发生的可能性。
3、性能优化
与普通游戏不同,微信小游戏平台本身的JS 脚本执行效率较低,且目前iOS 环境下小游戏的JavaScript 引擎没有默认启用JavaScriptCore,导致JS 执行速度较慢。单纯从测试结果来看,它的速度大约是Mobile Safari 的两倍。从profiler来看,js脚本占用了80%左右的执行时间。因此,减少脚本中的计算量也是性能优化的一个重要方面。
小米6
安卓游戏
安卓微信浏览器
安卓铬
57.55
53
58
iPhone 6
iOS小游戏
iOS微信浏览器
iOS 浏览器
20
48
50
帧率测试对比
为了解决这些问题,项目组进行了以下优化。
绘图调用
渲染批量合并与大多数游戏项目类似,需要合理规划图集的使用,并将GameObj 使用的图像资源拼图到同一水平。
这可以分为地图背景图层、表面、地图对象、坦克、子弹、特效、UI 和其他谜题。确保同一关卡中的游戏对象使用相同的图集,并且相邻的精灵使用相同的材质。
面具
玩家在游戏中显示的头像是圆形的,但从微信平台下载的头像是矩形的。最初的头像显示使用了cocos mask组件进行渲染,效率较低。我们实现了自己的基于网格的控件,通过将一个圆分成n 个三角形并将相应的UV 分配给这些三角形的顶点来绘制圆形头像。渲染头像时的批处理开销已减少。
冲击检查
cocos Creator自带的碰撞系统效率不高,不划分空间,不适合大量单元的碰撞检测。此外,对撞机的碰撞盒必须每帧更新。游戏地图内有许多静态物体(例如砖块、主基地、铁板等)。当玩家在场景中移动时,移动摄像机会改变地图的视图。地图上的许多静态物体都有恒定的世界坐标,它们的碰撞盒只需要计算一次。
为了解决这个问题,我们添加了一个属性static,可以让你缓存静态节点的计算结果,避免重复计算。
对象池
游戏中的坦克、子弹、砖块等都使用对象池。当进入战斗场景时,会预加载足够数量的对象并在战斗中重复使用,以避免实时对象创建和销毁。
避免场景和节点更新
在分析cocoscreator源代码后,我们发现当一个节点变得活跃时,它会触发场景的代价高昂的递归遍历。
为了避免这种开销,当游戏中的一个物体死亡时,它不会被从场景中移除或禁用,而是通过将其坐标移到很远的地方来死亡,而不进行任何相应的逻辑处理设置状态。代码。尽量保持帧速率稳定,以避免性能曲线出现故障。
农作物
如果物体不在主角的视野内并且特效或声音没有永久播放,它们可能会被剪掉并且不播放。
模型适配
美术资源分为高、中、低三个级别,规划者在资源表中设置不同级别的资源名称。游戏过程中,根据模型和实际表现选择表现水平。
图中横轴是时间(秒),纵轴显示FPS有明显提升。一系列的优化措施最终保证了低端iPhone 5S基本满足游戏需求。
以上是《欢乐坦克大战》微信小游戏开发概况。有兴趣的朋友可以过来一起交流。
本文和图片来自网络,不代表火豚游戏立场,如若侵权请联系我们删除:https://www.huotun.com/game/656974.html