实例化大量资源的时候很卡怎么办?

我在对象池里面存放了150个 instantiate 的预制资源,然后在某一时刻我取出来加载到屏幕上,帧率直接掉到了20。
代码:
for(let i = 0; i < 125; ++i){
let food = null;
if(this.sixPool_1.size() > 0){
food = this.sixPool_1.get();
}else{
let node = cc.instantiate(this.sixPrefab_1);
this.sixPool_1.put(node);
food = this.sixPool_1.get();
}
food.parent = parent;
food.setPosition(posArr[i]);
}

这些都是在屏幕上方添加到屏幕上的,请问有没有什么好的办法避免帧率突然掉下来的现象???

求解答 我有同样的问题 是这样:
塔防游戏地图比较大 能在线6个人 所以塔 子弹 特效非常多,技能还可以加速 所以子弹生成的非常多。所以加载场景的时候通过对象池创建了几百个 然后使用的过程中内存会越来越多 帧率也会下降 越往后卡帧越厉害,我每通过一关的时候都使用了cc.sys.garbagecollet 这个api 但是内存并没有下降 为什么 。。

有一个方案。但在js环境内我还没有测试过
利用ecmascript的timer延迟机制
基本描述为
创建一个延迟为0的计时器。启动,
然后创建大约100个物体作为一个单元
那么这个计时器虽然延迟是0理当马上执行,但实际上会延迟大约10ms后才执行。
利用这个原理。就可以把同步逻辑拆分成n个异步逻辑做成进度条。
然后根据实际timer的延迟偏移估计计算量。比如一次延迟32毫秒。那么在60fps下。就应该减少一个单元一半以上的计算量使得整个异步处理过程不过超过负载。

两种处理方法:
1: 分帧实例化资源(处理难度高,麻烦)。
2: 使用对象池来实例化资源(简单实用)。

你的问题。以上我的回答不适用。

你所说的问题。属于无法使用一个node来对应一个子弹。换句话说。不要为每个子弹创建对象。
我建议你做一个bulletVectices一唯数组,[bulletX1,bulletY1, bulletX2, bulletY2, …];
用来管理所有子弹。同时不要创建任何多余对象。
然后改动部分内核。(canvas和webgl要分开处理),对子弹做画家算法渲染,也就是只提交顶点坐标色彩信息给渲染器。但不创建对象。
同理。物理方面。也不能挂载到node上。因此有引入第三方独立物理引擎的可能
虽然物理引擎会分配每个子弹单独的刚体对象。但肯定远远优于一个带有显示和物理等信息的cocos node节点。

我尝试过创建的时候用scheduleOnce把要加载到场景的100+个prefab对象分成三个部分来加载, 第一部分不用scheduleOnce, 后两次是1秒和2秒之后加载, 不会卡得那么明显, 但是任然会卡!!!

我现在就是使用对象池的, 但是就是实例化加载到场景的时候,要实例化的数量有点大,所以会卡。
你说的分帧实例化怎么说?是指将要实例化的资源分到每一帧实例化一定数量的意思吗?

是的。但最簡單的的策略的。不創建太多物體。雖然代碼會看起來很凌亂
有些極端的時候
甚至矩形會寫成
var xList:Array
var yList:Array
var wList:Array
var hList:Array
var rList:Array
甚至所有的幾何函數能採用調用
fun(x, y)
就絕不寫成調用
fun(point)
如果無法避免使用point返回
我都會採用這種形式。可以從外部共享一個對象進行結果運算來避免創建物體。
fun(arg1, arg2, ?result:Point):Point;

你的意思是说point这种参数消耗会比直接用x,y消耗高是吗?

是啊。
一個node 對象至少裡面也有幾十個對象吧。

首先你自己得清楚 这个问题是跑逻辑导致的掉帧 还是渲染多到掉帧的

应该是一下子渲染太多导致的, 因为我的代码是通用的, 渲染超过30的时候就会在加载的时候掉帧到40以下, 渲染少的时候基本可以维持在50以上。

drawcall 过高吧 ?

10以下

typeScript异步了解下 也许可以

说来惭愧,我是拿起来js就用的, 语法那些什么机制啊 特性啊都没去看过!

大佬,怎么解决的?目前也是一次性渲染多个预制体很卡顿

请问大佬解决了吗。我现在也是一次渲染大佬预制体就会很闲的掉帧。也是用的对象池但是没啥用

delay值要不要 0.01 * i

不需要啊 这样做是为了开启线程避免主线程阻塞