防止Unity中的物理计算吞噬太多FPS的最佳方法?



我是一名高级软件工程师,但对Unity编程完全陌生。几个星期以来,我一直通过编写一些SteamVR玩具来自学Unity。我想询问Unity的标准内置方法,以提高具有大量密集物理计算的程序的帧率。

在我当前的VR场景中,我有一个球上面有一个Rigidbody。当我拿起它并扔出去时,我让它自然地移动,但我对每个Update()呼叫施加小的力来调整着陆位置并总是击中目标。

我看到我的帧率大幅下降,所以我编写了自己的函数来限制更新,将其限制在每秒5次。问题是,我是否应该使用一些标准的Unity行为,而不是自己滚动这些代码?

在我的投掷脚本中,我维护了一堆顶级变量,并首先更新它们,以决定是否应该对当前帧进行计算。

private void updateCalculationFrame() {
isCalculationFrame = Time.time > nextCalculationTime;
while (nextCalculationTime < Time.time) {
nextCalculationTime += (1 / calculationsPerSecond);
}
}

在每一帧上,我运行这个函数,然后如果isCalculationFrame为真,我继续计算并添加力向量。我只是想知道我是否忽略了一些更标准的方法,用更少的代码做到这一点?我觉得这一定是一件很常见的事情。

你所拥有的代码将冻结Unity直到循环完成。你根本不应该这样做。

您可以简单地设置一个新的Time.fixedDeltaTime。默认情况下,它通常是0.02,但你可以把它设置为任何你想要的。

执行物理和其他固定帧率更新(如MonoBehaviour的FixedUpdate)的秒间隔。

请注意,fixedDeltaTime间隔是相对于受timeScale影响的游戏时间。

最新更新