UE4-DeltaTime(时间增量)
UE4-DeltaTime(时间增量)
Time: 2020年10⽉14⽇13:33:52
Author: Yblackd
@
⽬录
单人开发选ue4还是unity1. 结论
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秒。(思考:打游戏时值是什么?)
如果电脑,或者⼿机帧数没有到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. 参考

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。