在一帧中实例化多个对象还是每帧实例化一个对象?

时间:2019-04-11 03:39:12

标签: performance loops unity3d random

这个想法很简单,就是在Awake中使用随机值简单地“实例化地图”。

但问题是: 我是否应该在一帧中实例化整个地图(使用Loop)? 还是最好每帧实例化每个对象?

因为我不想在不到一秒钟的时间内实例化300个游戏对象来破坏玩家的记忆。

3 个答案:

答案 0 :(得分:1)

无论您是否在一帧中实例化所有gameobjects,它们都将始终以相同的方式存储在RAM中。 “破坏”某人的内存的唯一方法是实例化许多gameobjects直到没有内存。考虑到一个典型的prefab统一大小只有几kb,而如今的典型RAM大小只有几GB,大约需要一百万个游戏对象。

答案 1 :(得分:0)

永远不要制造依赖于框架的东西,永远! 当这可能很好时,有一些例外,但在大多数情况下却不是。

很好的情况: -增量垃圾收集(仍然有缺点)

坏情况: -您的情况是,加载地图应该在开头

为什么我不应该依赖游戏框架?

  • 因为PC的计算速度不同,例如“哈利·波特II”就是一个很好的例子,该游戏是为每秒30帧的机器开发的,现代机器可以非常快地运行该游戏,因此游戏基本上可以加速,您需要手动限制CPU使游戏可玩。
  • 另一个示例是unitys delta time,这是在将对象移动到多帧时使用它的原因,因为它考虑了最后一帧的计算速度

从游戏玩家的角度来看,加载游戏时300个对象也算不了什么

加载10秒或30秒15 fps比正常速度更好 (上面的例子夸大了)

答案 2 :(得分:0)

加载地图时,可以在进入场景开始时异步进行。这样,您可以在加载期间放置一个加载屏幕。如果您正在制作单人游戏,这是一种很好的方法。如果是多人游戏,则还需要在服务器上为其他所有玩家同步它。加载场景异步的方法是SceneManager.LoadSceneAsync()

如果由于要随机化某些对象而试图在运行时实例化对象,我建议通过进入场景来加载每个不需要随机化的对象(将它们放到场景中)。

这就是我对您的问题的解释,告诉我是否有错。