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

  • 相关阅读:
    Java实现各种内部排序算法
    Java实现堆排序(大根堆)
    Java对象的序列化和反序列化
    Java实现链式存储的二叉查找树(递归方法)
    337. House Robber III(包含I和II)
    318. Maximum Product of Word Lengths
    114. Flatten Binary Tree to Linked List
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    96. Unique Binary Search Trees(I 和 II)
  • 原文地址:https://www.cnblogs.com/yblackd/p/13815049.html
Copyright © 2011-2022 走看看