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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM