bug反馈 cannon.min.js的问题

做了一个子弹打小人的游戏。都用了物理引擎来做碰撞。子弹与小人相撞的时候,在oColliderEnter()里就直接将子弹和小人destroy()了。然后发现游戏运行大概10分钟到20分钟左右,cannon.min.js就会报错。
使用的是3D 1.0.1版本。

我这边实验了一下。开一个定时期。每帧创建一个子弹。子弹上有一个方形的碰撞器。然后子弹飞行一会消失被destroy()掉。大概等到创建好几千个子弹之后。浏览器就会报上述错误。估计可能创建我刚体达到了一定的数量就会出现这种致命的问题。引擎组的大佬快来看看啊。

:3:

对象池有用吗

或者你需要一个同类型游戏研究一下别人思路 http://res123.com/view/1011

emm,对象池确实是个好的思路呢。不过这个确实是物理引擎的bug吧。必须得修复啊。

而且你这个游戏是 Box2d。 现在3D用的是cannon.js呢。估计是新物理引擎,触控还没有踩完全部的坑吧。哎可怕

额3d游戏哦。那不晓得了。

cocos引擎有bug,你还没有习惯吗。。

我可以提供demo给引擎组看看。
1.我在Chrom浏览器上实验了3次,发现只要创建到 5458颗子弹的时候,cannon.min.js一定报错
2.在Safari上实验,因为safari浏览器很卡,所以在5458次的时候没有报错。
但是我完整的子弹打小人的游戏,在两个浏览器上运行一段时间后一定会报错。看起来这不是个例

PlaneFire_5458.zip (2.8 MB)
我直接上demo吧。


如上图,只要创建子弹达到了5458个,cannon.min.js必出问题

坐等修复

如果这个Bug不修复的话,估计我工作就得没了。哎

感谢反馈,原因已经找到了,是内部算法使用了位运算,以及分配给形状的唯一 id 只增不减导致的

数值超过了算法的最大范围,暂时解决可以考虑改用对象池

感谢 吴彦祖 反馈。不过就算用对象池也不能完美规避这种风险啊。万一玩家连续玩了10关。不就完蛋了。请问具体的修复时间是什么时候呢。如果修复的话,麻烦到时候先给我个代码。我自己替换一下。公司的第一个3d游戏,是我力排众议,说用cocos3D做。没想到遇到了这样子一个天坑。

现在只能用对象池哦
这个问题是这样的,形状每个形状会分配一个 ID 用标志唯一性和查找,你生成的形状的数量已经超过了 js 位运算能够处理的最大范围,这个修改底层依赖库的实现方式,没有哪么快的

5天已经过去了,不知道这个惊天的大 bug。有没有被引擎组提上日程。哎,项目要上线,要是还没有修复就完蛋了啊。

这个问题已经修复了哈,数量可以超过5千多了,将会合并到 v1.1 版本中

然后还是建议你复用对象哈

谢谢引擎组大佬的修改,我已经把所有的物理引擎从项目删除了,所有的碰撞我都是自己代码算的,虽然精度不高,不过也能用,因为物理引擎实在是太耗费资源了,帧数难以得到保证

1赞