Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

UE4のスレッドの流れと Input Latency改善の仕組み

5,984 views

Published on

UE4は4.19からInput Latencyの改善を行える設定が加わりました。
https://docs.unrealengine.com/ja/Platforms/LowLatencyFrameSyncing/index.html

その設定が実際どのようなことをしているのか質問されることが多かったため、今回簡単にですがドキュメトにまとめてみました。各スレッドの並列動作を理解する必要があり事前説明がちょいと長いのですが、ご参考になれば幸いです。

(Epic Games Japan Support Manager 篠山範明)

Published in: Engineering
  • Writing a good research paper isn't easy and it's the fruit of hard work. For help you can check writing expert. Check out, please ⇒ www.HelpWriting.net ⇐ I think they are the best
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

UE4のスレッドの流れと Input Latency改善の仕組み

  1. 1. UE4のスレッドの流れと Input Latency改善の仕組み Epic Games Japan / Support Manager Nori Shinoyama (篠山範明)
  2. 2. INPUT LATENCY ● UE4のDefault動作は、並列性を最大限活かす様につくられています しかしその副作用として、逆にLatencyが長くなる可能性があります ● 30fpsのゲームで特に顕著に ○ 30fpsのゲームでは130ms以上のLatency ○ 60fpsでは軽減されるも、格闘ゲームなど入力がシビアなゲームでは依然問題に ● 4.19からInput Latencyの改善が入りました。 ○ DefaultではOffです。Onにすることで新たな制約が生まれます ○ 対応しているプラットフォームとしていないプラットフォームがあります、 各プラットフォームのドキュメントを参考にしてください
  3. 3. Input Latencyの話をする前に。。。 どのThreadがどの様に毎フレーム走っているのかをおさらいします
  4. 4. INPUT LATENCY 免責事項 これから各スレッドの動きと同期について説明していきますが、 厳密には各プラットフォームによって動きが違う可能性があります 例えば。。。 RHI Threadがあるかないか フリップ命令を発行するのがCPUかGPUか などなど 各プラットフォームでの動作の詳細を確認したい場合、 必ずそのプラットフォームが出しているCPU Profilerを参照してください
  5. 5. Third Person TemplateでInput LatencyのWorst Caseを見てみます
  6. 6. GAME Render RHI GPU VSync Profilerで見る各スレッドの処理タイムラインの例 超スーパーウルトラ簡略図
  7. 7. GAME Render RHI GPU VSync このGameThreadが画面に描画されるのはいつ?
  8. 8. 最初に誤った例を説明します
  9. 9. GAME Render RHI GPU VSync ※誤った例です Game ThreadからRender Threadに行き...?
  10. 10. GAME Render RHI GPU VSync ※誤った例です Game ThreadからRender Threadに行き...? Render ThreadはUE4の中間グラフィクスコマンドである RHI(Render Hardware Interface)コマンドを発行
  11. 11. GAME Render RHI GPU VSync ※誤った例です RHI Thread (及びWorker Threads)が RHIをGPU Native言語に変換
  12. 12. GAME Render RHI GPU VSync ※誤った例です 積まれたコマンドをGPUは描画して。。。 次のVsyncを待って。。。
  13. 13. GAME Render RHI GPU VSync ※誤った例です このフレームで画面に表示! …ではありません!
  14. 14. 正しくはこんな感じです
  15. 15. GAME Render RHI GPU VSync とあるプラットフォームでの UE4のDefault動作 このフレームで表示されます
  16. 16. GAME Render RHI GPU VSync とあるプラットフォームでの UE4のDefault動作 このフレームで表示されます これがLatencyが長いと言われる理由
  17. 17. GAME Render RHI GPU VSync この空白は? この空白は? DisplayへのFlipが1フレーム遅い?とあるプラットフォームでの UE4のDefault動作
  18. 18. 各空白の原因を知るために 各スレッドの役割と動きをおさらいしていきます
  19. 19. Render Thread
  20. 20. GAME Render RHI GPU VSync この空白は?
  21. 21. Default動作でのRender Threadの動き Render Threadの動作を大きく2つに分けてみると。。。 1. Init Views 画面に映るオブジェクト、ShadowMapに描画されるオブジェクトの選別 2. RHI Commandの発行 RHI Commandは、GPUのNativeCommandに変換するために RHI Thread(及びWorker Threads)らに送られる RHI Threadが前フレームの処理を終えるまで、RHI Commandを送れない
  22. 22. GAME Render RHI GPU VSync Init Views RHI Commands Generation
  23. 23. GAME Render RHI GPU VSync Init Views RHI Commands Generation 前フレームのRHI Threadが終わるまでRHI Commnadsを発行できない, なので待っている
  24. 24. RHI Thread
  25. 25. GAME Render RHI GPU VSync この空白は? とあるプラットフォームでの UE4のDefault動作
  26. 26. RHI Threadの役割 RHI Threadの役割 1. RenderThreadから送られてくるRHIをGPU Commandに変換する 2. GPU CommandをGPUに送る(Submitする) 3. Flip命令をGPUに送る (Flip命令: ディスプレイに現在描画したフレームバッファを表示させる命令)
  27. 27. GAME Render RHI GPU VSync とあるプラットフォームでの UE4のDefault動作 RHIのGPUコマンドへの変換 作成したコマンドをGPUに送る Flip命令も送る
  28. 28. GAME Render RHI GPU VSync RHIのGPUコマンドへの変換 とあるプラットフォームでの UE4のDefault動作 作成したコマンドをGPUに送る Flip命令も送る GPUにコマンドを発行したくて待っている
  29. 29. GAME Render RHI GPU VSync とあるプラットフォームでの UE4のDefault動作 GPUは前のフレームのCommandを処理中 RHIはその間GPUに今のフレームのCommandを送らない
  30. 30. GPU & Flip
  31. 31. GAME Render RHI GPU VSync DisplayへのFlipが1フレーム遅い?とあるプラットフォームでの UE4のDefault動作
  32. 32. GPU GPUの処理負荷だけ見てみると。。。
  33. 33. GPU この様な単位で1フレーム毎に描画しているように見えますが。。。 実際は違います
  34. 34. GPU 本当はこのように描画されています この空白なに??
  35. 35. GPU 拡大して見ていきます
  36. 36. GPU Temp Buffer Frame Buffer A Frame Buffer B Back Buffer Display Temp Buffer に描画中 (その後Bにコピー予定) Aには既に前フレームの 描画結果が書き込み済み Displayへの表示待ち
  37. 37. GPU Temp Buffer Frame Buffer A Frame Buffer B Back Buffer Display Dsiplayに表示されているのでコピーできない… 待つ
  38. 38. GPU Temp Buffer Frame Buffer A Frame Buffer B Back Buffer Display Flip!! VSync!!! Frame Buffer A Frame Buffer B
  39. 39. GPU Temp Buffer Frame Buffer A Frame Buffer B Back Buffer Display Frame Buffer A Frame Buffer B ここでコピー & Slate描画
  40. 40. GPU Temp Buffer Frame Buffer A Frame Buffer B Back Buffer Display Frame Buffer A Frame Buffer B BはFlipまで次のVSyncを待ち… 次のフレームの描画がTemp Bufferに行われる
  41. 41. GPU Frame Buffer A Frame Buffer B VSync!!! Flip!! Frame Buffer A Frame Buffer B ようやく、Frame Buffer Bの結果が画面に表示される Back Buffer Display
  42. 42. GAME Render RHI GPU VSync これが、DisplayへのFlipが遅い理由ですとあるプラットフォームでの UE4のDefault動作
  43. 43. GAME Render RHI GPU VSync 長々と説明しましたが、これが1フレームの一連の処理の流れです
  44. 44. Render/RHI/GPUの動作を見ながら、 各スレッドが待つ理由を確認していきました
  45. 45. UE4のスレッド間の流れ まとめ UE4はどのスレッドも”行けるところまでなるべく早く動こう”とする 並列性が確保できるがその副作用として、 RenderはRHIを RHIはGPUを GPUはFlipを と待ち、レイテンシーが増加する傾向にある このレイテンシーを改善するための設定が4.19からできました。
  46. 46. Input Latency Setting
  47. 47. CVars for Input Latency Improvement ● r.GTSyncType ○ Determines how the game thread syncs with the render thread, RHI thread and GPU ○ 0: Sync the game thread with the render thread (default) ○ 1: Sync the game thread with the RHI thread ○ 2: Sync the game thread with the GPU swap chain flip ● rhi.SyncInterval ○ Determines the frequency of VSyncs in supported RHIs. ○ 0 - Unlocked ○ 1 - 60 Hz (16.66 ms) ○ 2 - 30 Hz (33.33 ms) ● rhi.SyncSlackMS ○ Increases input latency by this many milliseconds, to help performance (trade-off tunable). Gamethread will be kicked off this many milliseconds before the vsync ○ Default: 10ms
  48. 48. 公式ドキュメントが用意されているので、詳しくはそちらを参照してください https://docs.unrealengine.com/ja/Platforms/LowLatencyFrameSyncing/index.html
  49. 49. Input Latency 調整のコンセプト このInput Latencyの設定によって、 全ての起点であるGame Threadの開始を明示的に遅れらます 結果として、そうすることで各スレッドの待ち時間を減らしレイテンシーの低減を図ります Input Latency改善のための基本設定はこの3つになるかと思います ● rhi.SyncInterval 1/2 (何フレームのゲームを想定しているか?: 1:60fps, 2:30fps) ● r.GTSyncType 2 (Game Threadの開始をVSyncを待つ) ● rhi.SyncSlackMS 0 (Game Threadの開始をVsyncより何ms早くさせるかのオフセット)
  50. 50. Input Lateny改善の前後を比較してみます
  51. 51. GAME Render RHI GPU VSync Input Latency改善前の動作 可能な限り最速で動こうとする Game Thread
  52. 52. Render RHI GPU VSync Input Latency改善後の動作 GTSyncType=2 GAME VSyncGame Threadの開始位置を このVSyncが来るまで待つようにする rhi.SyncSlackMSのoffset (default 10ms)
  53. 53. Render RHI GPU VSync Input Latency改善後の動作 GTSyncType=2 GAME VSync Game Threadの開始が遅いため、 各スレッドの待ちがなくなり レイテンシーが高速になる
  54. 54. VSync Input Latency改善の副作用 GTSyncType=2 VSync しかし、このLatencyの改善には副作用があります Latencyの改善により、同一フレームの各スレッドが並列で走ります そのため各スレッドの依存関係が生じ、 各スレッドでの処理負荷が想定フレームに 収まっていても処理落ちしてしまうかもしれません 使用する際は各プラットフォームのプロファイラなどを用いて、 各種スレッドの依存関係と処理負荷を確認するようにしてください
  55. 55. まとめ UE4.19でのInput Latencyの改善 1. 使うと新たな制約が出て処理負荷をよりシビアにおさえないといけない。 2. r.GTSyncTypeで動的変更可能なので、カットシーンなどではオフにできる。 3. rhi.SyncSlackMSでGameThreadの開始位置を変更可能。 デフォルトではVSyncの10ms前からGameThreadがスタートする
  56. 56. ありがとうございました!

×