Unity里的Time

Time and frame rate management

Time类: Time script reference page.

一些常见的属性有:

  • Time.time 返回从游戏开始经历的时间.
  • Time.deltaTime 返回从上帧结束到现在经历的时间,和帧率成反比
  • Time.timeScale 控制时间流逝的因子
  • Time.fixedDeltaTime 控制fixed update 更新的间隔时间
  • Time.maximumDeltaTime 控制最大的deltatime,如果超过这个时间,也会执行一次update

Variable and Fixed time steps

Unity有两个系统分别跟踪 可变的时间间隔 和 不可变的时间间隔

可变的就是update,和帧率有关,不可变的和帧率无关

Variable frame rate management

下边的代码,是每帧移动一个距离,它就会收到帧率的影响,从而每个手机上表现不一致

//C# script example
using UnityEngine;
using System.Collections;public class ExampleScript : MonoBehaviour {public float distancePerFrame;void Update() {transform.Translate(0, 0, distancePerFrame); // this is incorrect}
}

通过和 Time.deltaTime 属性相乘,这样就是每秒执行多长时间,因为帧率再怎么变化,总的时间是不变的:

Fixed Timestep

不像main frame update, Unity’s physics system根据fixed timestep更新, 在每帧的开始,unity会尽可能的多次执行 fixed updates 来赶上当前的时间

fixedDeltaTime 控制的是1秒内执行的步骤数,比如 0.01 表示每个固定的时间步长是持续时间的百分之一秒, 所以每秒有100个固定的时间步长

Unity’s Time Logic

下面的逻辑很重要:

Controlling and handling variations in time

如上所述,每帧之间的时间间隔可能会有所变化。

The properties explained in this section are:

  • Time.time
  • Time.unscaledTime
  • Time.deltaTime
  • Time.unscaledDeltaTime
  • Time.smoothDeltaTime
  • Time.timeScale
  • Time.maximumDeltaTime

Time.time 表示玩家开始游戏后经过的时间,所以通常是连续稳定地上升.

Time.deltaTime 表示自上一帧以来经过的时间量,因此理想情况下保持相当恒定

Time.timeScale 为0会暂停游戏,Update 方法依然执行,不过 Time.time 不会增加了,且Time.deltaTime 为0.

Time.unscaledTime、Time.unscaledDeltaTime不收缩放因子的影响,这对UI动画有用 

The table below shows an example of 16 frames elapsing one after another, with one large delay occuring half-way through, on a single frame. These figures illustrate how the various Time class properties report and respond to this large variation in frame rate.

FrameunscaledTimetimeunscaledDeltaTimedeltaTimesmoothDeltaTime
10.0000.0000.0180.0180.018
20.0180.0180.0180.0180.018
30.0360.0360.0180.0180.018
40.0540.0540.0180.0180.018
50.0710.0710.0170.0170.018
60.0890.0890.0180.0180.018
70.1070.1070.0180.0180.018
8 (a)1.123 (b)0.440 (c)1.016 (d)0.333 (e)0.081 (f)
91.1400.4570.0170.0170.066
101.1570.4740.0170.0170.056
111.1750.4920.0180.0180.049
121.1930.5100.0180.0180.042
131.2110.5280.0180.0180.038
141.2290.5460.0180.0180.034
151.2470.5640.0180.0180.031
161.2650.5820.0180.0180.028

如果不存在任何限制,那么由deltaTime缩放的物体就能够在帧速率高峰期间穿过游戏中的墙壁,因为从理论上讲,物体从一帧移动到下一帧的距离是没有限制的,所以它可以在一帧内从障碍物的一边跳到另一边而不会与之相交。因为还没有到on collider ***的检测

可以在上面的第8帧中看到,unscaledDeltaTime (d)和deltaTime (e)经过时间不同。尽管在第7帧和第8帧之间经过了整整一秒的实际时间,但deltaTime报告的时间仅为0.333秒。这是因为deltaTime被限制为maximumDeltaTime值。

类似地,unscaledTime (b)增加了大约整整一秒,因为添加了真实的(未缩放)值,而time (c)只增加了较小的偏移值。时间值没有赶上实际的时间,而是表现得好像延迟的持续时间只有maximumDeltaTime。

Time.smoothDeltaTime 属性表示最近deltaTime值的近似值,并根据算法平滑所有变化。 这是另一种技术,可以避免不必要的大步幅或移动波动或其他基于时间的计算。 In particular, those which fall below the threshold set by maximumDeltaTime. 平滑算法不能预测未来的变化,但它逐渐调整其值来平滑最近经过的增量时间值的变化,从而使平均报告时间保持与实际经过的时间量大致相等。

Time variation and the physics system

maximumDeltaTime也会影响 physics system.就像之前图片中提到的,如果它特别大的话,可能每帧之间需要执行的fixed update 比较多,会带来额外的压力

如果一个帧更新花费的时间超过了maximumDeltaTime,物理引擎
不会尝试模拟超过maximumDeltaTime的任何时间,而是让帧处理赶上。一旦帧更新完成,物理就会恢复,就好像它停止后没有时间过去一样。这样做的结果是,物理对象不会像通常那样完美地实时移动,而是会稍微放慢速度。然而,物理“时钟”仍然会跟踪它们,就好像它们在正常移动一样。物理时间的变慢通常是不明显的,通常是可以接受的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/702798.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32_HAL_TIM_通用计时器_实现计时

项目思路 1使用定时器计数每秒一次 2使用一个变量记录定时器响应多少次 3使用UART将记录的次数发出 1STM32Cude设置 1配置时钟源 2打开UART 3打开TIM2 3.1界面介绍 3.2选项介绍 Slave Mode(从模式):当设备被设置为从模式时&#xff0c…

推荐网站(10)storyset故事集 |免费定制、制作动画和下载插图

今天介绍一个免费定制、制作动画和下载插图的网站storyset故事集。Storyset故事集是一个提供丰富动画插图资源的在线平台,它不仅免费,而且用户友好,可以极大地丰富你的演示文稿(PPT)和其他视觉内容。 通过Storyset故事…

替补url

检查图片数量是否为6张,如果图片数量不足6张&#xff0c;则用本地图片补充当前位缺失的URL <div class"right-pic-box" v-for"(i, index) in imagesWithReplacement" :key"index"><img :src"i" width"316" height&…

Axure “情形”的使用

这篇笔记的主要内容是如果在Axure中使用“情形”&#xff0c;对应在我们的研发中就是“判断条件”的使用 Axure情形的使用Axure添加caseAxure的if &#xff0c;sele if 条件判断 条件判断不管是在研发代码中还是实际生活中&#xff0c;无处不在&#xff0c;只是表现形式不同罢…

牛客热题:二叉树的最大深度

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;二叉树的最大深度题目链接方法一…

C++ 程序员常用的VScode的插件

vscode中好用的插件 Better CommentsBookmarksC/C ThemeChinese (Simplified) (简体中文) Language Pack for Visual Studio CodeclangdClang-FormatCodeLLDBCMakeCMake ToolsCode RunnerCode Spell CheckerCodeSnapColor Highlightvscode-mindmapDraw.io IntegrationError Len…

图文详解JUC:Wait与Sleep的区别与细节

目录 一.Wait() 二.Sleep() 三.总结Wait()与Sleep()的区别 一.Wait() 在Java中&#xff0c;wait() 方法是 Object类中的一个方法&#xff0c;用于线程间的协作。当一个线程调用wait() 方法时&#xff0c;它会释放对象的锁并进入等待状态&#xff0c;直到其他线程调用相同对…

常用的一些字符转换工具--web(在线进制转换)

十进制 转2进制&#xff0c; 16进制 十进制浮点数转16进制&#xff08;4个Byte) http://www.speedfly.cn/tools/hexconvert/

基于EBAZ4205矿板的图像处理:11阈值系数可调的图像局部阈值二值化

基于EBAZ4205矿板的图像处理&#xff1a;11阈值系数可调的图像局部阈值二值化 先看效果 还是一样拿我的pynq当模特&#xff0c;然后用usb——HDMI采集卡把输出图像采集到电脑上。 注意看右边mobelxtem中的通过串口调节的参数&#xff0c; 我这里是实现了阈值系数可调的局部阈…

深入 Go 语言:使用 math/rand 包实现高效随机数生成

深入 Go 语言&#xff1a;使用 math/rand 包实现高效随机数生成 介绍math/rand 包的核心功能设计哲学应用场景 基础使用方法初始化和种子设置设置种子创建私有随机数生成器 基础函数详解生成整数生成特定范围的整数生成浮点数随机置乱数组 进阶技巧随机数的统计属性生成正态分布…

【MATLAB】Enigma机加密原理与自实现

文章目录 什么是EnigmaEnigma机加密通信流程Enigma的物理构造Enigma的加密设置Enigma加密通信密码重新设置Enigma加密消息拼接注意 Enigma的解密分解设置Enigma解密通信密码重新设置Enigma解密消息 Enigma的弱点MATLAB自实现Enigma加密与解密Enigma_functionRotate_functiontes…

macOS上使用qt creator编译调试ffmpeg.c

1 前言 上文macOS上将ffmpeg.c编译成Framework介绍了使用xocde将ffmpeg.c编译成Framework的方法&#xff0c;这里列举另外一种办法&#xff0c;就是用qt creator来完成这件事情。 编译环境如下&#xff1a; qt creator 9.0.2&#xff1b;ffmpeg release/6.1; 2 编译ffmpeg.c 大…