实例化使用大量CPU资源,如何切换到池化
本文关键字:何切换 资源 CPU 实例化 | 更新日期: 2023-09-27 18:04:14
我有一个方法用这个for循环实例化了很多对象
for(int i = 0; i < 8; i++){
Vector3 position = new Vector3(Random.Range(player.position.x+30f, player.position.x+80f), Random.Range(player.position.y, player.position.y+40), 0);
Instantiate(prefabs[Random.Range(0, 15)], position, Quaternion.identity);
}
基于游戏玩法,这个循环每5-10秒运行一次。(基于检查Update()
一段时间后,我使用gameObject.Destroy()
不需要的对象。问题来了:
- 在
- 有时
Destroy
和Instantiate
方法会同时运行,导致CPU节流。
Instantiate
上,我在Profiler中看到70%的CPU使用率在Destroy
上,我在Profiler中看到10-20%的CPU使用率需要说的是,我的目标是移动。FPS还可以,但是在测试游戏时,手机一分钟就会发热。我很确定我不应该这样做。我读过有关轮询的内容,但不确定如何基于此代码重现轮询。
我在华为Ascend G600上进行测试,但我猜这不是手机的问题,因为Profiler在台式机上也显示出同样的高CPU使用率。
由John Johnson使用产卵池解决。非常容易实现:
GameObject obj = SpawningPool.createFromCache(""+Random.Range(0, 15))
所有预制件都附加到SpawningPool对象上,并通过key name访问。代替Destroy()
,我现在使用SpawningPool.ReturnToCache(gameObject)
完全推荐,CPU使用率显著降低。