竞速类物理引擎帧同步实现方案

前言
上半年要做一款实时竞速类微信小游戏.要求操控流畅且碰撞交互模拟物理世界的真实效果.之后开始预研游戏帧同步服务和支持跨平台物理引擎.这期间预研并测试了许多方案.最终才得出最终的游戏实现方案

预研
预研大概经历了四个过程:
1.物理引擎
斥资购买论坛某位研发同学的物理引擎与帧同步游戏实现方案.了解了帧同步和物理引擎以及游戏整个生命周期如何保持同步.并了解了此类游戏开发的注意事项
2.帧同步服务
考虑后台研发和维护成本初步选型了微信的帧同步游戏服务.学习并参考官方的帧同步项目
3.初步测试
根据第一步中的整体框架方案和第二步中的帧同步项目开始实现自己游戏的核心竞速功能.不过实际结果是稳定的.论坛上的帧同步游戏实现方案选型的物理引擎是Box2D和自身搭建的帧同步服务器.由于Box2D本身并不是确定性物理引擎.是不能满足跨平台物理同步的.就算适配了三角函数仍然有问题.我测试期间发现比较明显的情况就是多个刚体之间发生碰撞的时候很大概率就出现不同步的问题.尤其是碰撞区域很小的时候不同步情况会很明显.另外玩家自身搭建的服务器不稳定给测试造成了很大的问题.最终放弃了Box2D物理引擎.复盘的时候想想一开始就不应该选择一个不确定性物理引擎.引擎做不到就是做不到.强扭的瓜不是很甜.不过帧同步服务选择微信的确定是没有问题的.最重要的问题每帧同步需要服务端处理的逻辑应该怎么处理
4.预研结果
长痛不如短痛.所以不再考虑CocosCreator中自带的物理引擎.而且我比较倾向与TS研发.所以最终选择了Rapier引擎.这是一个确定性的物理引擎.能满足我前面的要求.不过老外的东西一个是维护不及时.另外就是参考文档少.不过这些不是重点.重点微信开发者功能和Web上可以通过插件的形式加载Rapier.但是在真机上中是不可以的.因为微信API封装了WebAssembly.使用自己的WXWebAssembly它限制游戏只能加载本地的.wasm.这就会出现更多的问题.Rapier打包之后的.wasm达到了1M左右.这样游戏基本废了.随便一搞就超过了首包4M.
办法总比困难多.j经过研究发现微信支持加载wasm的压缩格式wasm.br.压缩之后300K左右.满足了需求.不过问题又来了微信中直接加载wasm本地文件会出现WebAssembly.instantiate加载异常.经过查找定位问题最终这个异常只能通过修改源码解决.到此为止微信帧同步和物理引擎都已定型并可以正常运行了.之后便可进入具体调研阶段

调研
1.物理引擎控件封装
由于官方对内置的物理引擎封装了Collider和Shape和Body等插件使用起来也比较方便.我做的游戏需要大量刚体.所以封装成类似的控件会一劳永逸.之后便封装了RapierCollider和RapierShape和RapierBody和RapierDebug.不过测试这些Rapier物理控件引擎期间遇到许多使用的坑和问题.好在都一一解决了.有了这些控件再添加一个RapierManager单例整体控制物理引擎与游戏的交互.


2.帧同步服务
官方的帧同步项目只是简单的发射子弹游戏很简陋.完全是代码的堆叠.复用基本不可能.我的游戏数据交互比较复杂而且功能比较多.索性架构一个帧同步模块.这样其它游戏复用也就简单了
image
3.游戏同步与帧同步和物理同步
搞定物理引擎和帧同步封装之后下面就是与游戏逻辑同步的问题了.这其中的注意事项很多很多.列出比较重要的几点:
(1)帧同步控制所有客户端逻辑
(2)客户端所有的不稳定因素不能控制逻辑.比如通过动画的开始与结束控制客户端逻辑.不能使用系统的随机函数等
(3)物理引擎的同步时机
(4)应该放到服务端处理的玩家交互逻辑如何处理
等等

研发
搞定调研的问题之后就剩下业务逻辑开发了.下面是1.0版本的功能图谱:

发布
对物理引擎帧同步游戏感兴趣的 或者对养成了游戏感兴趣的可以体验下线上版本.欢迎各位指指点点.有什么问题可以私信或者留言交流

5赞

iphone14pro 在新手引导的 说话干净利索不磕巴就卡住了
手感很奇怪,有点像太空飘逸,手机好烫,整个ui的体验等感觉要优化的地方很多啊,

先别管什么物理帧同步了,先把游戏第一次进不去和新手引导卡死解决一下

引导有些怪,字太小了,没人喜欢看文字。
如果没看引导内容,点击单人联系,还需要去设置出战宠物,设置地图。比如第一个宠物可以自动设为出战的(或者点击的时候引导设置出战宠物)。
抽奖有些慢,效果不是很炫酷

以后这种不明所以,体验糟糕得游戏就别发啦。论坛里有个小小御剑士,你看人家得质量。(果然痴迷技术,搞不好游戏)

匹配半天没匹配上, 没有弄机器人兜底啊

没 玩明白,游戏操作困难,按钮都小的可怜,要精准点击才能生效,太累了

谢谢您的建议下个版本会优化 目前刚上线处于小范围内测阶段

按钮问题已记录下个版本优化 谢谢您的建议
请收下游戏兑换码: VBmSoRMPHV

请收下游戏兑换码: iFjYccV1zF

您好 方便描述下或者截图吗

感谢您的建议
1.卡住的问题是必现的吗?方便清除下游戏再进去看下不
2.手感的操作最开始我设计是实时跟随虚拟摇杆旋转和移动的 但是在物理世界中感觉这样太生硬 所以就添加了惯性 另外就是整个地图都在物理模型中 所有刚体施加力不能迅速反应 有个过程
3.整体性能优化还在持续搞 UI是买了一套这种效果的 目前还没更好的UI方案

请收下兑换码: fJN0w6Cr3G

兑换码我去兑了一下,这个兑换过程我感觉也是不明确的,提示我兑换成功,但是没有任何获得具体奖励的展示,我观察了一圈,在邮箱里看到了奖励,实话说这个操作反馈弱了点,没有爽感

这个是好建议 不过服务器是微信的帧同步服务 机器人这个无法实现应该 我再想想 谢谢建议
请收下兑换码: arH7QjjZgd

噢 不是 是你新手指引下一步ui点击太小了 正常都是点击屏幕以外区域下一步,点了没反应以为卡住了。起码你不是全屏点击范围也有个小半屏吧。还有第一次进游戏卡加载了加载进度0%,重进才可以

非常感谢 下个版本添加一个统一的获取奖励弹窗和特效

请收下兑换码: fJN0w6Cr3G

非常感谢您

这游戏的策划是你自己吗?游玩点击会提示设置出战宠物,为什么这里不优化成弹窗直接选择宠物,另外游戏过程中,你真的不觉得很卡吗?移动的这么慢,感觉上就是一顿一顿的,我觉得你需要找个其他人体验一下,现在我体验下来,是不会再玩第二把

玩起来太卡了,怎么拉都拉不回来

而且你这里有必要用物理引擎么?真的需要物理模拟么,直接自己算一下碰撞和反弹应该就好了吧

1赞

谢谢您的反馈 个人小游戏业余时间搞得 会逐步优化游戏体验的