做了一个子弹打小人的游戏。都用了物理引擎来做碰撞。子弹与小人相撞的时候,在oColliderEnter()里就直接将子弹和小人destroy()了。然后发现游戏运行大概10分钟到20分钟左右,cannon.min.js就会报错。
使用的是3D 1.0.1版本。
我这边实验了一下。开一个定时期。每帧创建一个子弹。子弹上有一个方形的碰撞器。然后子弹飞行一会消失被destroy()掉。大概等到创建好几千个子弹之后。浏览器就会报上述错误。估计可能创建我刚体达到了一定的数量就会出现这种致命的问题。引擎组的大佬快来看看啊。

emm,对象池确实是个好的思路呢。不过这个确实是物理引擎的bug吧。必须得修复啊。
而且你这个游戏是 Box2d。 现在3D用的是cannon.js呢。估计是新物理引擎,触控还没有踩完全部的坑吧。哎可怕
额3d游戏哦。那不晓得了。
cocos引擎有bug,你还没有习惯吗。。
我可以提供demo给引擎组看看。
1.我在Chrom浏览器上实验了3次,发现只要创建到 5458颗子弹的时候,cannon.min.js一定报错
2.在Safari上实验,因为safari浏览器很卡,所以在5458次的时候没有报错。
但是我完整的子弹打小人的游戏,在两个浏览器上运行一段时间后一定会报错。看起来这不是个例
如果这个Bug不修复的话,估计我工作就得没了。哎
感谢反馈,原因已经找到了,是内部算法使用了位运算,以及分配给形状的唯一 id 只增不减导致的
数值超过了算法的最大范围,暂时解决可以考虑改用对象池
感谢 吴彦祖 反馈。不过就算用对象池也不能完美规避这种风险啊。万一玩家连续玩了10关。不就完蛋了。请问具体的修复时间是什么时候呢。如果修复的话,麻烦到时候先给我个代码。我自己替换一下。公司的第一个3d游戏,是我力排众议,说用cocos3D做。没想到遇到了这样子一个天坑。
现在只能用对象池哦
这个问题是这样的,形状每个形状会分配一个 ID 用标志唯一性和查找,你生成的形状的数量已经超过了 js 位运算能够处理的最大范围,这个修改底层依赖库的实现方式,没有哪么快的
5天已经过去了,不知道这个惊天的大 bug。有没有被引擎组提上日程。哎,项目要上线,要是还没有修复就完蛋了啊。
谢谢引擎组大佬的修改,我已经把所有的物理引擎从项目删除了,所有的碰撞我都是自己代码算的,虽然精度不高,不过也能用,因为物理引擎实在是太耗费资源了,帧数难以得到保证

