- 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