unity fixed timestep

本文深入探讨Unity中的时间管理器,介绍其关键属性如固定时间步长、允许的最大时间步长和时间尺度的作用及应用场景,帮助开发者更好地理解并利用这些属性以实现更稳定的游戏物理模拟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间管理器 (time manager)

时间管理器 (time manager)

属性

属性:

功能:

固定时间步长 (fixed timestep)

独立于帧速率的时间间隔,用来命令何时执行物理计算fixedupdate()事件

允许的最大时间步长 (maximum allowed timestep)

独立于帧速率的时间间隔,当帧速率低时,它会覆盖最坏的案例场景。执行物理计算和(fixedupdate()) 事件的时间不会超过规定的时间。

时间尺度 (time scale)

时间前进的速度。更改此值以模拟子弹时间特效。1 表示实时时间。.5 表示速度减半;2 表示速度加倍。

详细信息

固定时间步长 (fixed timestep)

对于稳定的物理模拟来说,固定时间步长 (fixed time stepping) 非常重要。计算机不尽相同,不同的硬件配置在运行 unity 游戏时表现出来的性能也不同。因此,物理计算必须独立于游戏的帧速率进行。诸如碰撞检测和刚体 (rigidbody) 移动这样的物理计算是在独立于帧速率的离散固定时间步长中进行。这使不同电脑间或帧速率发生变化时模拟的一致性更强。例如,帧速率可能会由于屏幕上多个游戏同时进行或用户在后台执行另一应用程序而降低。

以下是固定时间步长的计算方法。在屏幕上绘制帧之前,unity 将固定时间提前一段固定增量时间,并在到达当前时间之前执行物理计算。这直接与固定时间步长 (fixed timestep)属性相关联。固定时间步长 (fixed timestep)的值越小,进行物理计算的频率越高。每秒的固定帧数的计算方法是,用 1 除以固定时间步长 (fixed timestep)。因此,1/0.02 = 50(帧每秒) 以及 1/0.05 = 20(帧每秒)。

简而言之,固定更新值越小,物理模拟越精确,但是 cpu 的负担也会更大。

允许的最大时间步长 (maximum allowed timestep)

固定时间步长是稳定的物理模拟的保证。然而,如果游戏对物理负担大并且已经运行缓慢或偶尔会降至低帧速率,那么固定时间步长也可能对性能带来负面影响。帧所用时间越长 - 就必须执行更大的固定更新步长以转到下一个帧。这会导致性能下降。为避免这种场景的出现,unity ios 引入了允许的最大时间步长 (maximum allowed timestep),以确保物理计算的运行时间不会超出规定的阈值。

如果帧所用时间超过允许的最大时间步长 (maximum allowed timestep)中规定的时间,那么物理会“假设”帧仅用了允许的允许的最大时间步长 (maximum allowed timestep)秒数。换句话说,如果帧速率降低到某个阈值以下,那么刚体的速度就会变慢一点,以便让 cpu 可以赶上。

允许的最大时间步长 (maximum allowed timestep)对物理计算和fixedupdate()事件都会造成影响。

允许的最大时间步长 (maximum allowed timestep)固定时间步长 (fixed timestep)时,都以秒为单位。因此,如果帧速率降低到 1/0.1 = 10 (帧每秒)以下,那么设置 0.1 就会使物理和 fixedupdate() 事件速度降低。

典型场景

假设固定时间步长 (fixed timestep)是 0.01,也就是说应该每 10 毫秒处理一次 physx、固定更新 (fixedupdate) 和动画。

当您的帧时间大约是 ~33每个视觉帧平均要执行 3 次固定循环。

但是,帧时间不是固定不变的,它取决于许多因素,包括您的场景状态、os 后台任务等。

由于 3. 的原因,帧时间有时会达到 40 - 50 毫秒,也就是说会执行 4 - 5 次固定步长循环。

当您的固定时间步长任务相当繁重时,physx、固定更新 (fixedupdate) 和动画花费的时间会将帧时间延长 10 毫秒,也就是说为所有这些固定时间步长任务增加了一次迭代。

在一些不幸的情况下,5. 中描述的过程时间会延长至处理固定步长循环所用时间的 10 倍及其以上。

这就是引入允许的最大时间步长 (maximum allowed timestep)的原因。它是在单个视觉帧期间限制 physx、固定更新 (fixedupdate) 和动画处理次数的方法。如果将允许的最大时间步长 (maximum allowed timestep)设为 100 毫秒,并固定时间步长 (fixed timestep)设为 10 毫秒,那么在每个视觉帧会最多执行 10 次固定步长任务。因此,随着固定时间步长迭代次数的增加,小的性能故障有时会引发大的性能故障。通过将允许的允许的最大时间步长 (maximum allowed timestep)降到 30 毫秒,可将最大固定步长迭代次数限制到 3,这就是说您的 physx、固定更新 (fixedupdate) 和动画不会将帧时间延长太多,但这种限制也有一些负面作用。您的动画和物理在性能故障发生时会变慢。

提示

使玩家可以通过编写脚本,动态地更改时间尺度 (time scale)来控制时间。

如果您的游戏物理负担重或在fixedupdate()事件中花费大量时间,那么请将允许的最大时间步长 (maximum allowed timestep)设为 0.1。这会防止物理以低于 10 帧每秒的速率驱动游戏。

Unity中,Animator的帧率设置并不是直接通过Animator组件本身进行调整的。Animator的更新频率依赖于Unity引擎的时间管理机制,特别是`FixedUpdate`和`Time Manager`中的`Fixed Timestep`设置[^4]。以下是如何在Unity中调整Animator帧率的方法: ### 1. 调整 Fixed Timestep Animator的状态更新与`FixedUpdate`紧密相关,而`FixedUpdate`的调用频率由`Fixed Timestep`决定。可以通过以下步骤修改`Fixed Timestep`值: - 打开Unity编辑器,进入`Edit -> Project Settings -> Time`。 - 在`Time Manager`中找到`Fixed Timestep`参数。 - 修改该值以改变`FixedUpdate`的调用频率。例如,将`Fixed Timestep`设置为0.01秒(即每秒100次调用),可以提高动画更新的频率[^4]。 ```csharp // 示例代码:动态调整 Time.fixedDeltaTime using UnityEngine; public class AdjustFixedTimestep : MonoBehaviour { void Start() { // 设置 Fixed Timestep 为 0.01 秒 Time.fixedDeltaTime = 0.01f; } } ``` ### 2. 使用脚本控制动画帧率 如果需要更精确地控制动画帧率,可以通过脚本手动干预动画播放。例如,使用`Animation`或`Animator`的API来逐帧控制动画播放[^3]。以下是一个示例代码: ```csharp using UnityEngine; public class CustomAnimationFrameRate : MonoBehaviour { public Animator animator; private int currentFrame = 0; private int endFrame = 60; // 假设动画总帧数为60 private float frameDuration = 0.02f; // 每帧持续时间 void Start() { animator.Play("YourAnimationName", 0, 0); // 初始化动画 } void Update() { if (currentFrame < endFrame) { currentFrame++; animator.Play("YourAnimationName", 0, (float)currentFrame / endFrame); } else { animator.Rebind(); // 强制更新动画状态 } // 控制帧率 StartCoroutine(WaitForNextFrame()); } IEnumerator WaitForNextFrame() { yield return new WaitForSeconds(frameDuration); } } ``` ### 3. 注意事项 - **性能优化**:调整`Fixed Timestep`或使用脚本控制动画帧率可能会影响性能,尤其是在复杂场景下[^2]。建议在实际项目中测试不同帧率对性能的影响。 - **动画事件**:如果动画中包含事件回调,需确保帧率调整不会影响事件触发的准确性。 - **物理系统耦合**:`FixedUpdate`不仅影响动画更新,还会影响物理系统的计算。因此,在调整`Fixed Timestep`时需考虑对物理模拟的影响[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值