【问题标题】:Instantiate uses a lot of CPU resources, how to switch to Pooling?Instantiate 占用大量 CPU 资源,如何切换到 Pooling?
【发布时间】:2018-08-10 19:51: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()。问题来了:

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

需要说明我的目标是移动设备。 FPS还可以,但是在测试游戏的时候,手机一分钟就变热了。我真的很确定我不应该这样做。我已经阅读了有关轮询的信息,但不确定如何根据此代码重现它。

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

【问题讨论】:

  • 要进行对象池化,您必须披露您在游戏中的具体操作。例如,什么时候必须实例化一个新的 GameObject?你什么时候毁掉它?您在场景中一次实例化和销毁的游戏对象大约有多少?

标签: c# unity3d


【解决方案1】:

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

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

所有预制件都附加到 SpawningPool 对象并通过键名访问。 我现在使用的是SpawningPool.ReturnToCache(gameObject) 而不是Destroy() 完全推荐,CPU使用率大大降低。

【讨论】:

    猜你喜欢
    • 2015-05-27
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2022-10-20
    • 1970-01-01
    • 2013-01-02
    相关资源
    最近更新 更多