打灰机游戏的子弹,飞出屏幕后要收集到节点池中,使用哪种方案性能更高?
1、 屏幕外放一圈碰撞体,用碰撞体监听飞出的子弹
2、子弹脚本中update判断位置是否超出屏幕之外
- 方案1
- 方案2
0 投票者
打灰机游戏的子弹,飞出屏幕后要收集到节点池中,使用哪种方案性能更高?
1、 屏幕外放一圈碰撞体,用碰撞体监听飞出的子弹
2、子弹脚本中update判断位置是否超出屏幕之外
0 投票者
以前写代码的时候也想过方案1,但是后来研究下来发现根本就是脱裤子放屁,用碰撞体往往每帧需要更多的判断
update检测位置的这点计算量,比碰撞的计算量小太多了。你怕一直计算。 你可以在子弹射出后一秒再启动计算。这样所有的子弹都不会立刻计算,相当于把子弹计算时间错开了。
您的意思是每隔一段时间,遍历所有子弹吗? 判断哪些移出屏幕之外?
显然是的,用碰撞体本质上还是需要每帧去遍历场景所有子弹,就算再优化,加上各种剪纸,性能也绝对不会比只用位置去计算是否出界这件事高
private _countTime = 0;
update(dt) {
this._countTime += dt;
if (this._countTime >= 1) {
//进行复杂判断
}
}
不用去“遍历”,子弹是一个独立的东西。射出去以后,要处理的逻辑子弹自己判断。不要统一遍历。
假设1w个子弹,你去遍历一遍,这一帧你需要大量计算,这一帧就会卡.
子弹射出去以后,1s过后子弹各算各的,因为射出去的时间不一样,子弹开始计算的时间也不一样。
这样可以把1w个子弹计算错开
UNITY中可以使用OnBecameInvisible简单实现判断离开相机视野的功能,cocos中不知道有没有对应的。感觉也没必要做这个功能,早几秒晚几秒回收意义不是很大,我一般都是倒计时n秒没击中就自动回收。当然要是玩法这么要求当我没说。
给子弹加个lifetime属性,比如赋值3s,3s倒计时完成后就回收该子弹。飞行慢的lifetime设长点。
还是新手的时候,就觉得碰撞体可以直接检测到碰撞,性能好到爆啊!
直到有一天研究发现了计算碰撞的方式,直接汗颜 
当年我也是这样 
碰撞检测迭代太多了,直接update判断位置