zoukankan      html  css  js  c++  java
  • Unity增量时间Time.deltaTime详解

    来源:https://blog.csdn.net/ChinarCSDN/article/details/82914420

    1
    deltaTime —— 增量时间


    deltaTime 官方的解释我就不说了

    官方的解释多数新手都是看不懂的,不然也不会四处搜博文来学习了

    ?想要理解增量时间,我们拿物体的移动这种经典案例来说明

    要让一个物体,每秒移动10米,代码如下


    /// <summary>
    /// 每帧刷新
    /// </summary>
    void Update()
    {
    transform.Translate(0, 0, Time.deltaTime * 10); //物体沿着自身Z轴方向,每秒移动物体10米运动
    }
    1
    2
    3
    4
    5
    6
    7
    2
    Why? —— 为什么乘以增量时间


    那么问题来了,多数新手都懵逼在这里: 为什么要乘以增量时间?

    我们假设游戏运行时,1秒是60帧。—— 那就是说60个画面,刷!刷!刷!执行完,耗时1秒。

    如果电脑,或者手机帧数没有到60帧,时而30帧,时而50帧

    那么就会出现,有时候1秒移动了500米 有时候300米,总之每秒都不一样

    所以牛逼的前辈们就想到了解决办法,从而引入了增量时间的概念

    增量时间是实时变动的,而且每一帧都在变动

    1秒30帧,那增量时间就是 1/30 秒
    1秒60帧,那增量时间就是 1/60 秒
    1秒166帧,那增量时间就是 1/166 秒

    这样的设计理念,就保证了无论帧率是多是少,我们让物体1秒移动10米,最后1秒移动的就一定是10米

    公式:路程=速度*时间


    10米=1秒 * 10米/秒
    10米=(1/60 * 60) *10米/秒
    10米=(1/166 * 166) *10米/秒
    10米=(增量时间 * 1秒总帧数) *10米/秒

    重点:

    Update函数是每帧执行一次,那么经历过一帧耗费的时间就是 增量时间/deltaTime

    1秒内Update执行的次数,就是1秒内执行的总帧数

    所以我们只需要写上 transform.Translate(0, 0, Time.deltaTime * 10)这一个函数

    Update执行了1次,transform.Translate(0, 0, 1/60 * 10)执行一次,物体移动了1/6米

    Update1秒内执行了60次,就是transform.Translate(0, 0, Time.deltaTime * 10)乘以60次
    相当于 =(每帧时间1/60 * 速度 * 60)=10米

    Update1秒内执行了N次,就是transform.Translate(0, 0, Time.deltaTime * 10)乘以N次
    相当于 =(每帧时间1/N * 速度 * N)=10米

    3
    Wrong —— 误区


    而大家都知道 Update 函数的调用,是很快的。在我们假定的情况下,这1秒就会被调用60次

    而此时我们的代码transform.Translate(0, 0, 10)被执行60次

    每执行一次,物体就会移动10米。60*10=600米,这完全违背了我们让物体每秒移动10米的初衷

    公式:路程=速度*时间

    Update执行了1次,transform.Translate(0, 0, 10)执行一次,物体就已经移动了10米

    Update1秒内执行了60次,就是transform.Translate(0, 0,10)乘以60次
    相当于 =(10 * 60)=600米

    Update1秒内执行了N次,就是transform.Translate(0, 0, 10)乘以N次
    相当于 =(10 * N)=10N米
    ————————————————
    版权声明:本文为CSDN博主「Chinarcsdn」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/ChinarCSDN/article/details/82914420

  • 相关阅读:
    css常见小问题(个人的积累总结)
    YQBlogs1.2的解读与使用VS2012&LocalDB版本(跟进贴)
    asp.net mvc 用自定义的RazorViewEngine实现主题的自由切换遇到的问题!
    求解?命令行下操作LocalDb的诸多问题
    CentOS7下docker安装
    IIS 应用程序池设置,避免IIS假死
    .NET 将数据输出到WORD、EXCEL、TXT、HTM
    iframe高度动态自适应
    .net利用SQLBulkCopy进行数据库之间的大批量数据传递
    Datatable.Select()用法简介
  • 原文地址:https://www.cnblogs.com/LiTZen/p/12212759.html
Copyright © 2011-2022 走看看