オススメ機能
Twitter
お気に入り
記事履歴
ランキング
お気に入りタイトル/ワード

タイトル/ワード名(記事数)

最近記事を読んだタイトル/ワード

タイトル/ワード名(記事数)

LINEで4Gamerアカウントを登録
[GDC 2016]「Unreal Engine 4」を統合型グラフィックス機能で動かせ。ゲームエンジンへの最適化に向けたIntelの取り組みとは
特集記事一覧
注目のレビュー
注目のムービー

メディアパートナー

印刷2016/03/19 00:00

イベント

[GDC 2016]「Unreal Engine 4」を統合型グラフィックス機能で動かせ。ゲームエンジンへの最適化に向けたIntelの取り組みとは

Jeff Rous氏(Graphics Software Engineer,Intel)
 Intelはここ数年,Game Developers Conferenceで多数のセッションを主催して,ゲーム開発者向けに,Intel CPU向けのさまざまな最適化テクニックを説明している。GDC 2016でも同様で,セッションやイベントを通じての情報提供に取り組んでいる状況だ。
 本稿ではそんな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のデータフォーマットを変更するできるため,これを利用してメモリ帯域幅を抑えることが可能になったそうだ。

メモリ帯域幅の制約は統合型GPUの弱点である。UE4では,メモリを大量に食うGBufferのデータフォーマットを変更することで対処した
Unreal Engine

 2つめの弱点は,膨大かつ複雑なジオメトリを処理しようとすると,パイプラインがストールすることである。具体的には,ジオメトリシェーダが複雑なジオメトリを処理しきれなくなってストールしてしまう一方で,頂点シェーダが遊んでしまう状態になるために,描画がコマ送りになってしまうのだという。
 このような状況を作らないためには,「ジオメトリを削減すること」が必要だとRous氏は指摘する。たとえば,Level of Detail(LoD)を使用するとか,視野外の3Dオブジェクトを切り捨てる「オクルージョンカリング」を行うとかいった対策が利用できるそうだ。

統合型GPUは膨大なジオメトリを処理しようとすると,パイプラインがストールしてしまうことがあるという。LoDやオクルージョンカリングの使用で対応できるとのこと
Unreal Engine

 3つめの弱点は,シェーダのキャッシュ境界である。Rous氏によれば,「統合型GPUのグラフィックスメモリは,CPUのメインメモリと同じく,キャッシュ境界が64byte単位になっている」と述べる。メインメモリと共用なのだから当たり前といえば当たり前だが,単体GPUとは異なる挙動を示すわけだ。「とくに小さなループ内で細かくデータをロードするのは,キャッシュ境界のペナルティを受けやすい」とRous氏は指摘している。
 したがって,キャッシュの64byte境界を意識して動作するシェーダを作ると,処理効率が上がるというわけだ。

グラフィックスメモリのキャッシュ境界は,メインメモリと同じく64byte。性能を上げるには,このキャッシュ境界をまたがないようにシェーダコードを書く必要がある
Unreal Engine


DirectX 12で統合型GPUの実効性能は向上


UE4のデモとしては初期に登場したElementalの1シーン
Unreal Engine
 いろいろと弱点を抱える統合型GPUではあるが,明るい話題もある。それは,DirectX 12による恩恵が大きいことだと,Rous氏は述べる。
 UE4で最も効果を発揮した例として挙げられたのが,DirectX 12の「CreateCommittedResource」APIを使うときに,「D3D12_CLEAR_VALUE」として1bitのカラー値をオプションとして渡すというテクニックだ。「統合型GPUは,1bitのカラーの消去は極めて高速に行える(Rous氏)そうで,実際,UE4のデモである「Elemental」では,最大9%もの高速化ができたという。

CreateCommittedResourceを使うとき,D3D12_CLEAR_VALUEとして1bitのカラー値を指定すると極めて効果的だそうだ。なお,スライド中にはD3D12_CLEAR_COLORと書かれているが,ここはD3D12_CLEAR_VALUEの間違いと思われる
Unreal Engine

 もう1つ,DirectX 12で効果的とされたのが,「Root Signature」という仕組みだ。これは何かを簡単に説明すると,シェーダが使う定数をレジスタにバインドするという,DirectX 12で実装された機能なのだが,これを用いることで,シェーダの最適化が行えるようになったという。
 DirectX11までは,こうした細かな指定はできなかった。正確には,DirectX側が自動的にやってくれていたので,アプリケーション側で最適化することがそもそもできなかったそうだ。それが,DirectX 12では指定できるようになったので,シェーダの効率を上げられるようになったというわけである。

Root Signatureによって,DirectX 12ではシェーダをより効率的に使えるようになっている。これも統合型GPUでは効果的なのだという
Unreal Engine

 なお,UE4の統合型GPUへの最適化には,Intelが開発者向けに配布している最適化ツール「Intel Graphics Performance Analyzers」(以下,GPA)や,UE4の「ProfileGPU」コマンド,Microsoftが提供している「Windows Performance Analyzer」などを活用したとのこと。とくに,描画パイプラインの最適化にはGPAを多用したと,Rous氏は振り返っていた。

UE4の最適には,GPAなどの最適化ツールを利用した
Unreal Engine


ASTCの利点を力説するEpic Games


Niklas Smedberg氏(Senior Developer Relations Engineer,Epic Games)。別のセッションに登壇したときと,なぜか肩書きが異なる。複数の肩書きを持つ人らしい
 さて,セッション後半には,UE4の開発元であるEpic Gamesから,上級エンジニアのNiklas Smedberg氏がゲストとして登壇。Intel製SoC(System-on-a-Chip)搭載のAndroidタブレット――具体的には,Acerの「Predator 8」と,Lenovoの「YOGA Tab 3」――にUE4を対応させた話や,それに関連した小ネタを披露した。

 Intel製SoC搭載のAndroidデバイスで動作するUE4は,OpenGL ES 3.1とGoogleの拡張機能「Android Extension Pack」を使って実装されているという。将来的には,これをVulkanにも対応させていくと,Smedberg氏は説明していた。

Intel製SoC搭載するAndroidタブレット向けに,OpenGL ES 3.1とAndroid Extension Packを使ってUE4を移植した
Unreal Engine

 このAndroid版では,テクスチャ圧縮技術の「ASTC」(Adaptive Scalable Texture Compression)を使っているそうだ。ASTCの詳細は,2012年の西川善司氏によるOpenGL ES 3.0解説記事を参照してほしいが,簡単に言えば超高品位なテクスチャ圧縮技法である。OpenGLやVulkanにも採用されており,Androidデバイス向けSoCの統合型GPUの多くがサポートしている機能だ。

UE4ではASTCを用いている
Unreal Engine

ASTCの効果を示したスライド。写真左側が元データで,中央が従来の手法「ETC 1」で圧縮したテクスチャ,右側がASTCを使用したものだ。ASTCは明らかに品質が高く,そのうえ圧縮率も高い
Unreal Engine

 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:
4Gamer.net最新情報
プラットフォーム別新着記事
総合新着記事
企画記事
トピックス
スペシャルコンテンツ
注目記事ランキング
集計:04月22日〜04月23日