Instantiate使用了大量的CPU资源,如何切换到Pooling?

时间:2016-08-27 19:37:40

标签: c# unity3d

我有一个方法用这个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()。这就是问题所在:

  1. Instantiate我在Profiler中看到70%的CPU使用率
  2. Destroy我在Profiler中看到10-20%的CPU使用率
  3. 有时DestroyInstantiate方法会同时运行导致CPU限制。
  4. 需要说我的目标是移动版。 FPS还可以,但在测试游戏时,手机会在一分钟内变热。我确信这不是我应该怎么做的。我已经阅读了有关轮询但不确定如何根据此代码重现它的信息。

    我正在测试华为Ascend G600,但我想这不是手机问题,因为Profiler也在桌面上显示了相同的高CPU使用率。

1 个答案:

答案 0 :(得分:0)

使用Spawning Pool by John Johnson解决。非常容易实现:

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

所有预制件都附在SpawningPool对象上,并通过键名加入。 而不是Destroy()我正在使用SpawningPool.ReturnToCache(gameObject) 完全建议,CPU使用率会大幅降低。