文档章节

时间和帧速率管理

LIndieGS
 LIndieGS
发布于 2017/05/25 16:05
字数 1695
阅读 393
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

原文链接:https://docs.unity3d.com/Manual/TimeFrameManagement.html

    Update()函数允许你有规律地监视输入和其它事件,并作出正确的行为。例如,你可以移动一个角色当“forward”键被按下时。值得记住的是,当处理基于时间的行为时,比如游戏的帧速率,在Update()函数调用中,既不是连续的,也不是持续一段时间的。

    这样一个例子,考虑持续向前移动移动一个物体的任务,一次一帧。起初,你可能想移动这个物体每一帧以一个固定的距离移动。

using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    public float distancePerFrame;
    
    void Update() {
        transform.Translate(0, 0, distancePerFrame);
    }
}

    可是,给定的帧时间不是恒定不变的,这个物体就会以不规律的速度移动。如果帧时间是10毫秒,那么物体就会以distancePerFrame每秒向前100次。但是,如果帧时间减少到20毫秒(取决于CPU负载),那么就会每秒向前50次,因此移动更少的距离。解决方案是规定在帧时间里移动的大小。你可以从Time.deltaTime的性质中了解更多。

using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    public float distancePerSecond;
    
    void Update() {
        transform.Translate(0, 0, distancePerSecond * Time.deltaTime);
    }
}

    值得注意的是,设置移动,更多的是以distancePerSecond,而不是distancePerFrame。当帧速率改变时,每步移动的大小也会相应的改变,因此,物体的速度也就不会改变。

固定时间步(Fixed Timestep)

    不像主帧的刷新,Unity的物理系统是以固定时间步工作的,这对精确的模拟现实很重要。在物理刷新的一开始,也就是上一个物理刷新结束,Unity设置一个“alarm”,并添加固定时间步到时间里。脚本就会开始计算直到alarm结束。

    你可以从TimeManager中改变固定时间步的大小,你也可以使用Time.FixedDeltaTime的性质从脚本中读取固定时间步。值得注意的是,时间步越小,物理刷新越快,模拟得就更精确,但这会消耗更多的CPU负载。其实,只要你对物理引擎没有更高的要求,你就可能不需要改变默认的时间步。

最大允许时间步

    固定时间步实时地保持物理模拟得准确性,但是它也会导致一些问题。比如在游戏的某个场景使物理模拟得占用过大,同时游戏的帧率也会变得很低。(取决于场景中物体的数量)主帧刷新的过程不得不在规律的物理刷新和如果有许多进程要去做,然后数个物理刷新在一帧中同时发生中设法腾出空间。因此,在一个帧时间中,物体的位置和其他的性质在一帧开始时被冻结,画面能和跟频繁的物理刷新同时出现。

    自然而然的,CPU的自由有限,但是Unity可以选择是你有效地减慢物理时间,使帧处理能跟上。最大允许时间步设置(在Time Manger中)放一个时间量的限制,Unity就会在这段时间里处理物理事件,FixedUpdate在给定的帧刷新中调用。如果一帧的更新时间超过了最大允许时间步,物理引擎就会“停止时间”,使帧的处理更跟上。一旦帧更新结束,物理将会继续,即使从它停止后没有就时间了。这就导致刚体(rigidbodies)不能实时完美运行,但这种减速是轻微的。不管怎样,物理时钟会仍然跟踪它们,即使它们在正常移动。这种物理延迟通常是注意不到的,是一个种接受的与游戏性能的折中。

Time Scale

    对于一些特殊的效果,例如“子弹时间”,有时放慢游戏的速度,便于动画和脚本的反应在降低的帧率下发生。另外,你想完全冻结游戏里的时间,比如在游戏暂停时。Unity有一个Time Scale的属性控制游戏里的时间相对于真实时间的快慢。如果大小设为1.0,那么游戏时间相当于真实时间。如果设为2.0,使游戏时间是真实时间的两倍(动作将会加速)。当设为0.5时,就会将游戏时间速度减半。设为0时会使时间完全停止。值得注意的是,time scale不会真正减慢执行速度但会改变time step,从而改变Update和FixedUpdate函数的Time.deltaTime和Time.fixedDeltaTime。当游戏时间减慢,但deltaTime帧会减少,Update函数会被比平时调用得更频繁。其他的脚本函数不会受time scale的影响,所以在游戏停止时,你可以正常显示GUI。

    Time Manager有一个属性可以让你设置全局time scale,这很方便的从脚本这设值,使用Time.timeScale属性。

using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    void Pause() {
        Time.timeScale = 0;
    }
    
    void Resume() {
        Time.timeScale = 1;
    }
}

捕捉帧率

    一个关于时间管理的特案是你想以视屏的形式记录游戏。因此,保存屏幕画面的任务会花费很多时间,如果你在正常的游戏里企图这样做,游戏的帧率将会大幅下降。这就导致,视屏不能真实反映游戏的情况。

    幸运的是,Unity提供了一个Capture Framerate的属性,它能让你绕过这个问题。当属性值被设为任何一个大于0的数,游戏时间将会减慢,帧刷新会在准确的规则的间隔执行。这些间隔在帧与帧之间等于1/Time.captureFramerate,因此如果你将值设为5,那么刷新就会在一秒钟执行5次。因为对帧率的需求有效地降低,你就有时间在Update函数里保存截屏或执行其他操作。

using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    // Capture frames as a screenshot sequence. Images are
    // stored as PNG files in a folder - these can be combined into
    // a movie using image utility software (eg, QuickTime Pro).
    // The folder to contain our screenshots.
    // If the folder exists we will append numbers to create an empty folder.
    string folder = "ScreenshotFolder";
    int frameRate = 25;
        
    void Start () {
        // Set the playback framerate (real time will not relate to game time after this).
        Time.captureFramerate = frameRate;
        
        // Create the folder
        System.IO.Directory.CreateDirectory(folder);
    }
    
    void Update () {
        // Append filename to folder name (format is '0005 shot.png"')
        string name = string.Format("{0}/{1:D04} shot.png", folder, Time.frameCount );
        
        // Capture the screenshot to the specified file.
        Application.CaptureScreenshot(name);
    }
}

    虽然使用了这种技术的游戏录制功能看起来不错,但游戏可能难以游玩当速度减得很慢时。你可能需要测试一下Time.captureFramerate的值,允许足够的时间来记录,而不会使测试人员的工作过度的复杂。

上一篇: 创建和销毁物体
下一篇: 事件函数
LIndieGS
粉丝 0
博文 9
码字总数 6421
作品 0
程序员
私信 提问
加载中
请先登录后再评论。
DNS 管理系统--NamedManager

NamedManager 是一个基于 Web 的 DNS 管理系统,可用来添加、调整和删除 DNS 的 zones/records 数据,支持 Bind 作为后端的 DNS 服务,支持 IPv4 和 IPv6。...

匿名
2013/01/23
8.7K
0
工作流管理系统--Pegasus WMS

Pegasus (飞马座)工作流管理系统包括一套技术标准工作流程应用程序中执行帮助许多不同的环境中,包括桌面、校园集群、网格、云。它弥补了科学领域和执行环境通过自 动映射到分布式资源的高层工...

匿名
2013/02/24
5.4K
0
密码管理程序--pwgrep

为了管理我的密码,我写了一个小的 bash/awk 脚本用来管理一个密码数据库并使用 GnuPG 进行加密。使用 pwgrep 的好处是: 密码加密 密码版本化,不用担心丢失老密码 Since a versioning sys...

匿名
2013/03/11
1.3K
0
网络设备管理和监控软件--Spiceworks

Spiceworks是一款针对中小型企业的网络设备管理和监控软件。它由广告商提供支持,是一款免费软件。根据Spiceworks公司的介绍,这款软件适合雇员人数在250人以下的中小型企业,其产品功能和特...

匿名
2012/10/22
1W
0
Linux 多屏幕管理软件--XRandR

XRandR是X Rotate and Reflect Extension(改变大小与旋转扩充)的缩写,用来在命令行界面中对linux系统中的 X窗口系统的多屏幕做出一些设定的软件,能更改外接屏幕的大小、分辨率等...

匿名
2012/10/22
3K
0

没有更多内容

加载失败,请刷新页面

加载更多

不畏加班,不念下班,这样的奋斗逼文化你见过吗?

下班回家的时候刷到这样一条帖子: 网友投稿,海淀某互联网公司,都是不996了,要求"不畏加班,不念下班”,鼓励尽量住在公司,从起床工作到睡觉。。。这样的公司你怎么看? 我的天,这还得了...

osc_8qovbqi5
27分钟前
21
0
第2章 渗透测试方法论 一篇就够了

文章目录 第2章 渗透测试方法论 2.1 渗透测试的种类 2.1.1 黑盒测试 2.1.2 白盒测试 2.2 脆弱性评估与渗透测试 2.3 安全测试方法论 2.3.1 开源安全测试方法论(OSSTMM) 2.3.2 信息系统安全评...

osc_494omtst
28分钟前
0
0
用实验证明,二极管PN结中的玻尔兹曼常数

前言 在网文 「An Electronic Mesurement of the Boltzmann's Constant Using I-V Characterisctic of a Silicon 2N2309 Diode」[1] 中介绍了使用三极管2N3094来测量 「Boltzmann Constant」......

whoisliang
28分钟前
22
0
限制条件下计算累加和

Question:求 1+2+…+n ? 要求不能使用乘除法、for、while、if、else、switch、case 等关键字。 ps: 代码无误,但运行则需要自行整理(没错,我就是懒得整理)。 . No.0 三目运算符 class So...

osc_9yulefcq
29分钟前
0
0
Vue.js实训【基础理论(5天)+项目实战(5天)】博客汇总表【详细笔记】

目 录 前言 基础理论(5天) 基础理论-Day01 基础理论-Day02 基础理论-Day03 基础理论-Day04 基础理论-Day05 项目实战 项目实战-Day01 项目实战-Day02 项目实战-Day03 项目实战-Day04、Day05...

osc_l4ynn973
30分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部