实例化使用大量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()不需要的对象。问题来了:

    Instantiate上,我在Profiler中看到70%的CPU使用率在Destroy上,我在Profiler中看到10-20%的CPU使用率
  1. 有时DestroyInstantiate方法会同时运行,导致CPU节流。

需要说的是,我的目标是移动。FPS还可以,但是在测试游戏时,手机一分钟就会发热。我很确定我不应该这样做。我读过有关轮询的内容,但不确定如何基于此代码重现轮询。

我在华为Ascend G600上进行测试,但我猜这不是手机的问题,因为Profiler在台式机上也显示出同样的高CPU使用率。

实例化使用大量CPU资源,如何切换到池化

由John Johnson使用产卵池解决。非常容易实现:

GameObject obj = SpawningPool.createFromCache(""+Random.Range(0, 15))

所有预制件都附加到SpawningPool对象上,并通过key name访问。代替Destroy(),我现在使用SpawningPool.ReturnToCache(gameObject)完全推荐,CPU使用率显著降低。