写的射击游戏,只实现了跳跃和射击功能,应该是射击模块的问题,浏览器和模拟器正常,但是实机运行的话,一直开火,开始几十秒帧数正常,然后忽然开始减帧,而且减少的很快,不继续开火帧数也不会恢复,可是GL verts最高也只是90,而且增减正常,不开火逐渐回到初始值,calls始终为2,不开火则始终不会减帧,但是子弹相关我始终未能找出问题所在,望大家帮忙,非常感谢。
PS:用了物理引擎和缓冲池,而且即使不用缓冲池,也会有这个情况。
版本是JS-3.61 ,用的WebStorm 10.0.3
代码:
src.zip (6 KB)
建议看下http://www.cocos.com/doc/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/html5/v3/cc-pool/zh.md
js 的不懂 不过肯定是有逻辑在跑 检测for 时钟等是否有累加没有删除的
是这样,画面上最高渲染并不高,所以即使不用缓冲池最高上限也不应该会减低帧数,verts数的增减也正常,虽然不能完全排除是资源回收的问题,但是应该不是缓冲池的问题。
我在代码里还没有使用for循环的地方,用计时器的地方也不多,不过基本上也就这两个可能性最大,
一个是确实可能是计时器的问题,不过就三个相关:计算子弹移动轨迹、出屏幕移除、满足条件发射子弹;
另一个是物理引擎相关,
JS里用Chipmunk有一些东西没有搞懂,好像也没有JS用的API相关文档。
所以也可能子弹的释放不完全。
我在子弹类的update里写的,满足移除条件的子弹用
this.body.data = null;
this.removeFromParent(true);
移除子弹对象,不知道完不完全,但是一旦移除shape的话就报错了,
而用this.space.removeBody(this.body)移除body的话,还是会减低帧数,而且帧数比之前降低的更快,甚至连模拟器和浏览器也会变慢。
你用到物理引擎了么?对象缓冲池,也是有释放的。子弹多了,如果用到物理引擎,这里可能导致降帧
用到了物理引擎,现在我把缓冲池去掉了,最高渲染只到120,calls恒定2,应该不至于影响帧率,另外我又试了下,模拟器上也会变慢,只不过很久之后才会。
我在子弹类(直接继承的物理精灵)的update里释放了满足条件的子弹(附件里的代码还没改成这个)
if(this.body.getPos<GC.w){
this.space.removeBody(this.shape.getBody());
this.shape=null;
this.removeFromParent();
}
用了物理引擎即使释放了还会导致降帧?还是说还没有释放完全?我shape和body都释放了,而且用了removeFromParent方法啊,还有什么没放的呢?
这样写释放的话,手机上一直开火可以在20秒左右保持完全不降帧,但是一旦开始降帧就无法挽回了,只要再开火就会一直降帧,停火,渲染数回复初始值也不能恢复帧数。
这个肯定是有东西没有删干净 还有假如是做弹幕游戏的话 建议主要逻辑还是不要用脚本来做 扛不住的