渋谷ほととぎす通信

新しいこと、枯れたこと問わず大庭が興味を持ったものを調査、生活の効率を求める完全趣味の技術ブログ。基礎を大事にしています。

Task.Delayの待機時間をUnityEditor上で計測をしたら少しずれる件


Task.Delayの待機時間が本当に数値通りかを以下のサンプルコードで確認しました。

async void Start()
{
    var t = Time.time;
    var st = Time.realtimeSinceStartup;
    
    await Task.Delay(5000);
    
    // ゲーム時間
    Debug.Log($"Time.time :{Time.time - t}");

    // リアルタイムの時間
    Debug.Log($"RealtimeSinceStartup : {Time.realtimeSinceStartup - st}");
}

期待する結果は、5秒きっかり経過することです。

結果

f:id:esakun:20191028224740p:plain

このようにTime.timeは0.5秒早く、Time.realtimeSinceStartupは約5秒経過をマークしました。 事実ベースではTask.Delayで5秒待機するとゲーム時間は0.5秒ほど早く完了するようです。
※理由が知りたい

待機時間を長くしてみる

Task.Delay(10000);として10秒待機してみます。このときズレは大きくなるのか、一定なのか。

大きくズレていく

f:id:esakun:20191028231510p:plain

約1.5秒ズレました。
この結果から待機時間が長ければ長いほど指定した時間より早い時間で待機時間は終了してしまうことがわかりました。

念のためにコルーチンで確認

IEnumerator Start()
{
    var t = Time.time;
    var st = Time.realtimeSinceStartup;
    yield return new WaitForSeconds(5f);
    Debug.Log($"Time.time :{Time.time - t}");
    Debug.Log($"RealtimeSinceStartup : {Time.realtimeSinceStartup - st}");
}

f:id:esakun:20191028225212p:plain

コルーチンは、ほぼほぼ時間通り待機してくれました。

最後に

特にオチはありませんが、Task.Delayを使用する際は、低負荷でも少しずれる、待機時間が長ければ長いほどズレは大きくなるということを頭に入れておくと良いのかなと思いました。

環境

  • Unity2019.1.10f1

※本記事の計測はUnityEditor上で行いました