【问题标题】:Unity big scale world simulation performance problem.Unity 大规模世界模拟性能问题。
【发布时间】:2018-12-14 08:42:53
【问题描述】:

我们正在开发模拟游戏。我们在世界上有大约 25000 个对象。全部有 1 个统一 c# 脚本。如果我们激活空更新功能,我们会得到 15 fps,如果我们激活 0.02 时间尺度的空固定更新,我们会在平均规格计算机上得到 1-2 fps。在 Will 我们需要对更新功能做一些事情。所以需要一些帮助来解决这个性能问题。

在这种情况下,我们可以为性能做些什么?

感谢您的建议和帮助。

【问题讨论】:

    标签: c# performance unity3d simulation frame-rate


    【解决方案1】:

    好吧,即使您的问题很广泛,我也会尝试提供一些提示。我的猜测是您在更新中进行了一些繁重的计算,这会导致 fps 问题。同时渲染 25000 个对象也会导致 fps 问题。首先我建议使用Unity ProfilerUnity statistics 找出导致问题的原因。那么我的建议将基于我假设的问题:

    1. 使用 Coroutines 而不是在 Update 中进行所有计算。
    2. 使用Occlusion culling 尽可能少地渲染对象。您不需要渲染不在Camera frustum 中的对象。
    3. 如果您有详细的网格,请在有机会的情况下使用 level of detail

    如果您缩小问题范围,我很乐意为您提供进一步帮助。祝你好运!

    【讨论】:

    • 使用协程而不是 Update 进行计算不会改变任何东西,因为它们也在主线程中运行,因此会阻塞渲染
    • 是的,但是使用协程,您可以在计算完成之前返回。你在Update 没有这个机会。因此,它会降低 fps,因为更新无法及时执行。我错过了什么吗?
    • 您所描述的内容实际上更像async-await。对我来说,很难理解你会在协程中等待什么样的计算。
    • 在协程中使用任何需要时间的计算对我来说都是有意义的。例如在运行时生成网格。难道 async-await 不是我们使用协程最重要的原因之一吗?
    • 协程仍然在主线程中运行并且不是异步的。它们只是允许您在一段时间内分散指令或等待其他指令完成。如果您没有只是等待或执行某些事情的事情,那么“每帧一步”协同程序不是您想要的。这有点像有多个微小的Update 方法运行一次迭代(直到达到yield)每一帧
    【解决方案2】:

    非常需要调用 Update() 是 Unity 的主要减速之一。这就是为什么他们现在正朝着不需要这种跳跃的实体组件系统前进。 如果所有对象都具有相同的脚本,则应该很容易修改代码,以便只有 1 个对象具有脚本,但对所有其他对象进行操作(即通过 for (;;) 循环)。这应该已经带来了巨大的改进。

    此外,如果您的对象有可能共享网格 - 请使用实例化网格渲染,它的速度会快两个数量级

    【讨论】:

    • 谢谢,我开始学习Unity的新组件和Job系统了。
    猜你喜欢
    • 2020-04-02
    • 2022-10-09
    • 2016-12-08
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 2020-01-18
    相关资源
    最近更新 更多