【问题标题】:Inconsistent jitter in iOS gameiOS游戏抖动不一致
【发布时间】:2017-04-05 16:03:29
【问题描述】:

我正在为 Unity iOS 开发一个非常简单的垂直滚动游戏。我的游戏出现不一致的抖动。我在网上广泛搜索了一个没有任何运气的解决方案。我正在使用 Unity 版本 5.3.4 f1。

游戏

  • 一个角色跌倒了。我们正在使用 unity 的角色控制器来移动 Update() 中的角色(Time.deltaTime 正在成倍增加)。
  • 相机正在跟随LateUpdate() 中的角色(使用Vector3.Lerp() 跟随)。
  • 由于角色向下移动,因此屏幕上的障碍物似乎向上移动。
  • 场景中有 1 个定向光,用于设置实时阴影。阴影质量为高阴影和硬阴影。
  • 场景中没有刚体。并且探查器中没有明显的峰值。
  • 我们的几何结构非常简单,绘制调用/设置传递调用很少(平均 7 个设置传递调用)。
  • 我们有恒定的 60 fps。
  • 由于我们在 iOS 上运行,vSync 默认情况下处于开启状态且无法禁用。

问题

  • 背景元素/障碍物(树木、岩石等)无缘无故开始抖动。行为不一致,有时会抖动,有时不会。
  • 即使它不抖动,当用户通过触摸进行输入时,我们也会遇到轻微的卡顿。

我们的尝试

  • 我们已经尝试了Update()LateUpdate()FixedUpdate()Time.deltaTimeTime.smoothDeltaTime、Lerp 的所有组合,将场景缩减为几个立方体并移除所有碰撞器和触发器。
  • 我们已经研究过以下线程:Link1Link2Link3 和无数其他线程。
  • 最初我们的游戏以默认的 30 fps 运行。但经过一番研究,我们的问题似乎是由于“帧率”和“屏幕刷新率”之间的差异。 (要了解此问题,请参阅以下LINK)。由于 iOS 设备的刷新率为 60Hz,我们将目标帧率设置为 60,并且我们的游戏保持恒定的 60 fps。
  • 将目标帧速率设置为 60 后,抖动有所改善,但现在不一致。

我完全没有想法。任何帮助或指示将不胜感激。

提前致谢。

【问题讨论】:

  • 场景中有多少实时灯光,可以分享一下相机运动的代码吗?
  • 楚苏哥。只有一种定向光。我正在使用Vector3.Lerp() 来移动相机。我已经测试了相机的移动,这不是问题。我还将更新帖子并在其中添加此信息。
  • 欢迎来到 StackOverflow!如果您通过添加一些代码来更新您的问题,将会更有帮助。如果您还没有阅读,Docs 会这样说:请注意,设置 targetFrameRate 并不能保证该帧速率。由于平台的具体情况可能会出现波动,或者由于计算机速度太慢,游戏可能无法达到帧速率。 另外,您想分享一个带有 deep profile 的 Profiler 的屏幕截图吗?已启用且不限制 targetfps。
  • 我遇到了同样的问题;它似乎发生在高度简单化(或几乎空洞)的场景中。我用一个非常非常基本的粒子系统制作了一个场景,只是为了查看项目中没有任何自定义脚本的一些运动。

标签: ios unity3d unity5 jitter


【解决方案1】:

这可能是由很多不同的原因造成的,在没有看到任何代码的情况下,我只能提出一些想到的建议:

1.浮点精度误差

  • 角色是否不断坠落?
  • 这个错误是在角色倒地一段时间后出现的吗?

这将指向浮点精度错误。不要让角色跌落,而是将角色周围的物体从屏幕视图下方移动到屏幕视图上方,以便一切都发生在原点附近。

2。经常实例化或其他滞后峰值

  • 您是实例化对象还是池化它们?
  • 您是否正在执行任何长时间的计算?
  • 你有很多for/foreach/while循环吗?

实例化会导致延迟峰值并创建垃圾,从而导致垃圾收集器更频繁地运行。由于帧率是固定的,当出现慢速操作时,您会看到一些抖动。

您应该在场景加载后Instantiate 一个游戏对象池,使用gameObject.SetActive(false) 使它们处于非活动状态,并将它们存储在列表、数组等中,而不是在玩家移动一段距离时实例化和销毁对象。当您需要 Instatiate 一个新对象时,只需从池中抓取一个,并在需要时将其更改为 Transform.positiongameObject.SetActive(true)

3.垃圾收集器经常运行

这个不太可能是一个问题,但仍然提到它。拿这个示例代码:

void Update()
{
    Vector3 someVector = new Vector3(0,0,0);
    float distance = someVector.magnitude;
    if (distance > 5.0f)
        Vector3 someNewVector = someVector + transform.position;
    else
        Vector3 someNewVector = Vector3.zero;
}

每次Update 运行时,它都会创建新变量并为它们分配内存。下次更新runs, it creates new variables, and allocates more memory. Eventually, the memory usage sets off the garbage collector, which goes around and frees up the memory used by all the previousUpdate`函数。相反,您应该在开始时分配内存,然后重用变量。

void Start()
{
    Vector3 someVector = new Vector3(0,0,0);
    Vector3 someNewVector = new Vector3(0,0,0);
    float distance = 0f;
}
void Update()
{
    someVector = Vector3.zero;
    float distance = someVector.magnitude;
    if (distance > 5.0f)
        Vector3 someVector += transform.position;
    else
        Vector3 someVector = Vector3.zero;
}

要诊断此问题,您需要附加配置文件调试器并观察抖动是否与垃圾收集器一致。

希望这里的内容可能对您有所帮助。查找抖动源的最佳选择是使用分析器。以下是 iOS 的说明:

将您的 iOS 设备连接到您的 WiFi 网络(本地/adhoc WiFi 网络 分析器使用分析器将分析数据从设备发送到 Unity 编辑)。在 Unity 的构建中选中“Autoconnect Profiler”复选框 设置对话框。通过电缆将设备连接到 Mac,检查 Unity 的构建设置对话框中的“开发构建”复选框,然后点击 Unity 编辑器中的“构建和运行”。当应用程序在设备上启动时打开 Unity 编辑器中的探查器窗口(Window->Profiler)。

更多信息:The Profiler Window

【讨论】:

    【解决方案2】:

    感谢大家的宝贵时间。

    1. 不,这不是浮点进动错误。
    2. 我们在运行时实例化对象,但当问题发生时,我们切换到对象池,但它没有帮助。
    3. 我已经完成了彻底的分析,甚至在设备和垃圾收集器上进行远程分析也不是问题。

    经过进一步研究,我遇到了BLOG POST,这些人几乎面临着类似的问题,并且解决方案在我的场景中有效。

    简而言之,问题在于统一帧与设备的帧绘制速率不同步。当 Unity 需要更长的时间来渲染其帧时,设备渲染循环将不会等待 unity 完成并绘制一个导致抖动的空帧。但是,正如我在文章标题“Inconsistent Jitter”中所说,博客也报告了相同的情况,因此它不会一直发生。

    你怎么知道这是同一个问题?好吧,您会在分析器中看到Render 尖峰(尽管我们有非常简约的几何形状)。它看起来更像是 Render 疯了。

    虽然该博客更多地是关于输入变得滞后,但它在我的场景中也有所帮助。有些人可能不明白如何为他们解决这个问题,我推荐这个POST,它提供了一个非常清晰的解决方案。

    为了进一步研究,当名为“cgJames”的用户跳转到CONVERSATION时开始阅读。

    我希望这对其他人也有帮助。

    【讨论】:

      【解决方案3】:

      我最近遇到了同样的问题。完全正确... Unity 中的垂直滚动条,图形简单,仅在 iOS 上遇到帧率不一致的情况,有时可能与输入有关,也可能与输入无关。

      不管怎样,我终于找到问题出在哪里了。尝试将 iOS 上的渲染引擎从 Metal 更改为 OpenGL ES 2 或 3。

      希望这也能解决您的问题。

      【讨论】:

      • 感谢您的回答。如果这对我有用,我一定会尝试并回复您。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2022-10-15
      • 2013-02-04
      • 1970-01-01
      相关资源
      最近更新 更多