zoukankan      html  css  js  c++  java
  • UE4-DeltaTime(时间增量)

    • UE4-DeltaTime(时间增量)
    • Time: 2020年10月14日13:33:52
    • Author: Yblackd

    @


    1. 结论

    • Update(Unity) Tick(UE4)执行了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米

    2. deltaTime - 增量时间

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

    • Unity

          /// <summary>
          /// 每帧刷新
          /// </summary>
          void Update()
          {
              transform.Translate(0, 0, Time.deltaTime * 10); //物体沿着自身Z轴方向,每秒移动物体10米运动
          }
      
    • UE4

      {
      	Super::Tick(DeltaTime);
      	FVector NewLocation = GetActorLocation(); // 获取Actor当前位置向量
      	float DeltaHeight = FMath::Sin(RunningTime + DeltaTime) - FMath::Sin(RunningTime); // 计算正弦增量
      	NewLocation.Z += DeltaHeight * 20.0f;  // Actor位置向量Z轴 加 增量*基数  (个人暂时这么理解,有大佬理解,本人虚心接受教学)
      	RunningTime += DeltaTime;  // 记录游戏运行时间
      	SetActorLocation(NewLocation);  // 更新Actor位置向量Z轴值
          // 调试查看 DeltaTime 和 RunningTime 值
          UE_LOG(LogTemp, Warning, TEXT("DeltaTime: %f"), DeltaTime);
      	UE_LOG(LogTemp, Warning, TEXT("RunningTime: %f"), RunningTime);
      }
      
      /*
      	控制角色的移动(具体高度),以便随时间推移通过正弦波控制移动量。 也就是说,在时间0,它开始向上移动相对较快,然后放慢向上移动,直到它停止向上移动,然后开始向下移动,向下加速,最终减速并再次向上移动。 它继续周期性地以这种方式上下移动。  
      	所以,这个函数的工作原理是,它被周期性地调用,然后这个调用和最后一个时间之间的时间变化是DeltaTime。 最后一次被称为RunningTime。 所以计算一下新的位置:  
      */
      

    3. 为什么乘以 时间增量

    我们假设游戏运行时,1秒是60帧。—— 那就是说60个画面,刷!刷!刷!执行完,耗时1秒。(思考:打游戏时FPS值是什么?)


    如果电脑,或者手机帧数没有到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米

    4. 注意误区

    而大家都知道 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米

    5. 参考

    参考链接:https://blog.csdn.net/ChinarCSDN/article/details/82914420

  • 相关阅读:
    Cycle Sort
    使用finalize/dispose 模式提高GC性能(翻译)
    支持在控件标签间包含子控件 WebControl
    MongoDB 使用GridFS保存文件
    MongoDB学习笔记
    跨域名单点登录 part 1 设计蓝图(翻译)
    UserControl 用户自定义控件
    为什么90%的IT人员都不适合做老大?
    什么情况下你会毫不犹豫地辞职?
    Supervisor安装、配置、开启启动
  • 原文地址:https://www.cnblogs.com/yblackd/p/13815049.html
Copyright © 2011-2022 走看看