gpt4 book ai didi

ios - iOS游戏中不一致的抖动

转载 作者:可可西里 更新时间:2023-11-01 03:18:24 26 4
gpt4 key购买 nike

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

游戏

Gameplay screenshot

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

问题

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

我们尝试了什么

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

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

提前致谢。

最佳答案

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

<强>1。浮点精度误差

  • 角色是否不断下降?
  • 错误是在角色倒下一段时间后发生的吗?

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

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

  • 您是在实例化对象还是将它们合并?
  • 您是否在进行长时间的计算?
  • 你有很多for/foreach/while循环吗?

实例化会导致滞后峰值并产生垃圾,从而导致垃圾收集器更频繁地运行。由于帧率是固定的,当发生缓慢的操作时,您会看到一些抖动。

您应该在场景加载后实例化游戏对象池,而不是在玩家移动一定距离时实例化和销毁对象,使用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 运行时,它都会创建新变量并为它们分配内存。下次 Update 运行时,它会创建新变量,并分配更多内存。最终,内存使用会触发垃圾收集器,垃圾收集器会循环并释放之前所有 Update` 函数使用的内存。相反,您应该在开始时分配内存,然后重用变量。

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 的说明:

Connect your iOS device to your WiFi network (local/adhoc WiFi network is used by profiler to send profiling data from device to the Unity Editor). Check “Autoconnect Profiler” checkbox in Unity’s build settings dialog. Attach your device to your Mac via cable, check the “Development Build” checkbox in Unity’s build settings dialog, and hit “Build & Run” in Unity Editor. When app launches on device open profiler window in Unity Editor (Window->Profiler).

更多信息:The Profiler Window

关于ios - iOS游戏中不一致的抖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38749831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com