【问题标题】:Am I missing something or Unity3d skips frames?我错过了什么还是 Unity3d 跳过了帧?
【发布时间】:2015-01-24 15:30:15
【问题描述】:

我有一把带 4 个枪口的枪。每个枪口可以发射一颗子弹(因此一次可以发射 4 发子弹)。在我的场景中,我有 100 支枪,因此可以同时发射 400 发子弹。

问题是,如果枪数低于 20 则没关系,但如果我将其提高到 20 以上,一些子弹会穿过目标(一个大立方体)。如果超过 100 颗子弹,就会有大量子弹穿过立方体。

这是检查碰撞的代码:

private IEnumerator ProjectileCoroutine() {

    while (Vector3.Distance(transform.position, Target.transform.position) > 5)
    {                            
        yield return null;
    }

    Explode();
    yield break;
}

一些注意事项:

  • 游戏以 49 - 68 fps 的速度运行(现场有 100 支枪)
  • 我使用预制池化方法
  • 以上代码运行在一个单独的协程(StartCoroutine)中

请谁能告诉我发生了什么? 我怀疑 Unity 会跳过一些帧,因为 Coroutine 与它有一些联系。

【问题讨论】:

    标签: unity3d collision-detection coroutine frame-rate


    【解决方案1】:

    我不认为 Unity 是“跳帧”。也就是说,我希望您的协程每个完整的图形帧只运行一次。物理更新通常发生得更频繁,尤其是在较低的帧速率下。

    请注意,子弹越多,场景运行的速度可能越慢。对于时间步长的物理模拟,这意味着子弹必须在每个时间步长移动得更远。如果子弹移动得很快,并且时间步长很大,子弹可能会在立方体中移动太远,以至于无法在一帧中检测和解决碰撞。如果这是问题所在,您可能需要添加某种光线投射,以更好地检测碰撞。

    也就是说,我不认为您的 ProjectileCoroutine 是解决冲突的最佳方式。对于初学者来说,它似乎检查的是一个球体,而不是一个立方体,并且为每个子弹运行它在性能方面是一个坏主意。

    最好使用适当的碰撞器,并依靠实际的物理引擎来检测碰撞,而不是进行手动距离检查。

    【讨论】:

    • 谢谢兄弟! - 你拯救了我的一天 :) 正如你所提到的,事实证明这是一个时间步长的问题。所以我转到Edit -> [项目设置] -> [时间] 并将 [最大允许时间步长] 减少到 0.02,然后再次点击播放。对性能没有影响(实际上它的速度提高了 10fps)并且所有子弹都停止穿过立方体。另外,我切换回 Raycasting 方法来检查碰撞。最初我怀疑光线投射对性能有巨大影响,所以我尝试了一个纯数学解决方案。还有一点,移动对撞机会严重影响性能,尤其是当你有很多时。 :)
    猜你喜欢
    • 2010-12-31
    • 2021-09-06
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2017-05-21
    • 1970-01-01
    相关资源
    最近更新 更多