イベント
[GDC 2016]「Unreal Engine 4」を統合型グラフィックス機能で動かせ。ゲームエンジンへの最適化に向けたIntelの取り組みとは
本稿ではそんなIntel主催のセッションから,「In the Trenches: Optimizing UE4 for Intel」(困難な状況の中で:Intelに向けたUE4の最適化)を取り上げてみたい。「Unreal Engine 4」(以下,UE4)をIntel CPUの統合型グラフィックス機能(以下,統合型GPU)に最適化するために乗り越えなければならなかった問題点や,DirectX 12による性能向上を説明するという,興味深い内容だったからだ。
セッションを担当したのは,Intelでグラフィックスソフトウェアエンジニアを務めるJeff Rous氏である。
統合型GPUが抱える3つの弱点を克服せよ
UE4といえば,先進的なグラフィックス表現に対応したゲームエンジンとして名高いが,それだけにUE4を利用するゲームでは,高性能なGPUが必要という印象を持つ人もいるかもしれない。
しかし現在では,ハイエンドGPUを搭載しないプラットフォームでも,UE4を使ったゲームが動作するようになっている。Intelの統合型GPUも同様で,UE4のリリース当初は対応していなかったものの,現在では統合型GPU向けの最適化を施すことで,ゲームを動作させられるようになった。
Rous氏によると,UE4が動作するよう最適化するにあたり,統合型GPUにはいくつかの弱点があったという。第1の問題点がグラフィックスメモリのバス帯域幅だ。
「統合型GPUは,単体GPUのように高速なGDDR5メモリを使うわけではないうえに,CPUと統合型GPUが同じメモリを共用している」とRous氏は述べていたが,ここは4Gamer読者なら周知の事実だろう。
こうした制約があるところにきて,UE4でよく利用される「Deferred Rendering」で使うジオメトリバッファ「GBuffer」が,非常に大きなメモリ帯域幅を必要とするのが問題になったという。
幸いなことに,UE4ではGBufferのデータフォーマットを変更するできるため,これを利用してメモリ帯域幅を抑えることが可能になったそうだ。
2つめの弱点は,膨大かつ複雑なジオメトリを処理しようとすると,パイプラインがストールすることである。具体的には,ジオメトリシェーダが複雑なジオメトリを処理しきれなくなってストールしてしまう一方で,頂点シェーダが遊んでしまう状態になるために,描画がコマ送りになってしまうのだという。
このような状況を作らないためには,「ジオメトリを削減すること」が必要だとRous氏は指摘する。たとえば,Level of Detail(LoD)を使用するとか,視野外の3Dオブジェクトを切り捨てる「オクルージョンカリング」を行うとかいった対策が利用できるそうだ。
3つめの弱点は,シェーダのキャッシュ境界である。Rous氏によれば,「統合型GPUのグラフィックスメモリは,CPUのメインメモリと同じく,キャッシュ境界が64byte単位になっている」と述べる。メインメモリと共用なのだから当たり前といえば当たり前だが,単体GPUとは異なる挙動を示すわけだ。「とくに小さなループ内で細かくデータをロードするのは,キャッシュ境界のペナルティを受けやすい」とRous氏は指摘している。
したがって,キャッシュの64byte境界を意識して動作するシェーダを作ると,処理効率が上がるというわけだ。
DirectX 12で統合型GPUの実効性能は向上
UE4で最も効果を発揮した例として挙げられたのが,DirectX 12の「CreateCommittedResource」APIを使うときに,「D3D12_CLEAR_VALUE」として1bitのカラー値をオプションとして渡すというテクニックだ。「統合型GPUは,1bitのカラーの消去は極めて高速に行える(Rous氏)そうで,実際,UE4のデモである「Elemental」では,最大9%もの高速化ができたという。
もう1つ,DirectX 12で効果的とされたのが,「Root Signature」という仕組みだ。これは何かを簡単に説明すると,シェーダが使う定数をレジスタにバインドするという,DirectX 12で実装された機能なのだが,これを用いることで,シェーダの最適化が行えるようになったという。
DirectX11までは,こうした細かな指定はできなかった。正確には,DirectX側が自動的にやってくれていたので,アプリケーション側で最適化することがそもそもできなかったそうだ。それが,DirectX 12では指定できるようになったので,シェーダの効率を上げられるようになったというわけである。
なお,UE4の統合型GPUへの最適化には,Intelが開発者向けに配布している最適化ツール「Intel Graphics Performance Analyzers」(以下,GPA)や,UE4の「ProfileGPU」コマンド,Microsoftが提供している「Windows Performance Analyzer」などを活用したとのこと。とくに,描画パイプラインの最適化にはGPAを多用したと,Rous氏は振り返っていた。
ASTCの利点を力説するEpic Games
Intel製SoC搭載のAndroidデバイスで動作するUE4は,OpenGL ES 3.1とGoogleの拡張機能「Android Extension Pack」を使って実装されているという。将来的には,これをVulkanにも対応させていくと,Smedberg氏は説明していた。
このAndroid版では,テクスチャ圧縮技術の「ASTC」(Adaptive Scalable Texture Compression)を使っているそうだ。ASTCの詳細は,2012年の西川善司氏によるOpenGL ES 3.0解説記事を参照してほしいが,簡単に言えば超高品位なテクスチャ圧縮技法である。OpenGLやVulkanにも採用されており,Androidデバイス向けSoCの統合型GPUの多くがサポートしている機能だ。
Smedberg氏いわく,「ASTCは高い圧縮率が実現できる一方,圧縮にとんでもない時間がかかるという欠点がある」。だが,Intelが超高速のASTC圧縮ツールを公開しているので,それが非常に役に立っているという。「ボタンを押したら終わってるというほど速い」とSmedberg氏が絶賛するASTC圧縮ツールは,IntelがGitHub上(関連リンク)で公開している。興味のある開発者は,試してみるといいだろう。
やや余談気味だが,Smedberg氏は「ニュースリリースで読んだ人がいるかもしれないが,Intelは今まで,Vulkan対応ドライバソフトはLinux向けしかリリースしていなかった。だけども,昨日(北米時間3月17日),Windows向けのドライバソフトを公開したよ」と述べていた(関連リンク)。こちらも興味がある人は,試してみてはどうだろうか。
講演概要のレポートは以上となる。Rous氏は講演の最後に,「UE4によって,単体GPUを使わなくてもリッチなグラフィックスのゲームが楽しめるようになった」と強調していた。これは開発者にとってだけでなく,ゲーマーにとっても歓迎できる話だろう。今後のIntelの取り組みにも期待したい。
Intelのゲーム開発者向けページ「Game Dev」(英語)
4Gamer GDC 2016関連記事一覧
- 関連タイトル:
Unreal Engine
- 関連タイトル:
DirectX
- この記事のURL: