イベント
[CEDEC 2013]性能はまちまちで挙動も大違い。Androidスマートフォン向けグラフィックスエンジン開発に立ちはだかった難関
セッションを担当したのは,ゲームデベロッパであるトライエースの研究開発部に所属する,永野和博氏と大嶋貴史氏,デイビス・エリオット氏である。早速セッションの概要をレポートしよう。
AndroidスマートフォンのGPUは千差万別
ちなみに,開発されたグラフィックスエンジンは,iOS 5.0以上とAndroid 2.3以上に対応しているとのことで,現在利用されているスマートフォンの大部分をカバーする汎用性の高いものだ。
iOSとAndroidを比較して,グラフィックスエンジン開発が難しいのはどちらかといえば,4Gamer読者なら「それはAndroidのほうじゃないか」と想像が付くだろう。iOS端末はApple製のハードウェアしか存在せず種類も少ないが,Android端末は多数のメーカーが手がけており,スペックも性能も千差万別である。大嶋氏も,
現在のスマートフォンで使われているモバイル端末用GPUは,
モバイルGPUは種類が多いだけでなく,世代に応じて実装している機能は違うし,当然性能も違っており,かなり混沌とした状況にあるのが現状だ。
AndroidではGPUだけでなく,iOSに比べて開発環境にも問題になる点があるという。Android用アプリの開発環境である「Eclipse」は,一般的なAndroidアプリの開発に使う「Java」のデバッグなら問題ないのだが,性能を引き出すためにネイティブコードでプログラミングをすると,デバッグ機能の不十分な点が表面化する。
※1 画面に文字列を表示する命令のこと。
C++言語を使って作られた家庭用ゲーム機用グラフィックスエンジンを移植するには,「JNI」(Java Native Interface)を使ったネイティブコードで開発することになるが,Androidの開発環境はそこが不十分というわけだ。
市場に出回っているスマートフォンの性能差が大きいのも問題点だ。大嶋氏は,「ローエンドとハイエンド機の性能差は,軽く10〜15倍ほどもある」という。
さて,性能差があるプラットフォームでは,性能が低い方に合わせてゲームを制作するのがセオリーだが,それでは高性能な端末の能力を引き出せず,グラフィックスの品質を高めるのは難しい。そこでトライエースでは,「可能な限り(高性能な)端末の最大性能を引き出して,良い映像を実現すべき」(大嶋氏)という方針の元に,高性能端末の能力を引き出す方向で開発に取り組んだという。
近い将来,さらに高性能なスマートフォンが登場することは明らかであり,グラフィックスエンジンは高い性能を持つハードを生かしたグラフィックスを表現できるように,開発する必要があると大嶋氏は述べる。そこで重要になるのは,「グラフィックスエンジンのスケーラビリティ」(大嶋氏)を確保することである。
トライエースのグラフィックスエンジンでは,端末の性能に合わせて自動的に照明の数を増減したり,ポストプロセスの設定を変えるといった方法で負荷を調節して,端末の性能に最適な動作をするように設計されたそうだ。
トライエースでは低い性能に合わせる方法は選ばず,高性能スマートフォンの性能を引き出せるグラフィックスエンジンの実装を目指した |
トライエースのグラフィックスエンジンが採用した,スケーラビリティを実現する手法の例。PCゲームでも似たような手法が使われている |
予想以上に困難だったAndroidへの移植
こうした方針を立てて,グラフィックスエンジンの移植に取りかかった大嶋氏らは,まず開発環境が整っていて,端末ごとの差異も少ないiOSに移植したうえで,それをさらにAndroidへと移植するという手順で開発を進めたそうだ。
iOSとAndroidのどちらも,3DグラフィックスAPIには「OpenGL ES 2.0」を採用しているので,「iOSからAndroidへの移植は簡単だろうと当初は考えていた」(大嶋氏)そうだが,楽観的な予想は覆されて,次々と困難に直面したそうだ。
トライエースのグラフィックスエンジンは,画面の更新を垂直同期にあわせて行う仕様なので,正しいリフレッシュレートが分からないのは,頭の痛い問題だったようだ。
OpenGLでは,コンテキストのハンドル(識別符号)を得てレンダリングを制御する。そのため,レンダリングをマルチスレッドで行う場合,各スレッドがこの識別符号を得る必要がある。だが,OpenGLコンテキストが1つしか使えない端末では,レンダリングを複数のスレッドに分けるのは困難だ。
そこでAndroidでは,OpenGLコンテキストが必要になる「シェーダのコンパイル」を,レンダースレッドに移すといった設計変更を実施したという。
レンダースレッドを使う場合と使わない場合の性能を計測した結果を,エリオット氏が披露していたが,これがなかなか興味深い。
シングルコアCPUでは,スレッドの切り替えがオーバーヘッドになるため,レンダースレッドを使うと性能はむしろ低下するはずだ。ところがグラフを見ると,シングルコアCPUを搭載する「Xperia acro SO-02C」で,「レンダースレッド有り」のほうがなぜか性能が高いのだ。
エリオット氏はその理由として,「OpenGL ES 2.0のAPI内では,スレッドを明示的に“ウェイト”状態にしているため,そのCPU時間が使えているからではないか」との推測を披露した。この推測を元に考えると,API内部でスレッドをウェイトにして,CPU時間を他のスレッドに与えると性能が向上するということは,「Open
そのほかにもAndroid端末では,配列を持った構造体をuniform変数で扱う場合,配列のサイズを取得すると機種によって結果が異なるという問題や,フロントバッファをスワップさせたときに,カラーバッファの内容が保持される/されないといった動作が,GPUによって異なるといった問題点があったという。
ポリゴンの描画順を変えるだけで,GPUによっては性能が変わる
永野氏からは,GPU別の最適化についてが解説された。その中でも,オブジェクトの描画順によって,見えないものを描画しないように描画対象から外す処理である「Early Z Culling」が,どう機能するかをGPU別に調べたという話題は興味深かった。
約30fpsで描画できるように調節したシェーダを使い,まず不透明のオブジェクトを手前側(カメラ側)から描いた場合と,奥から描いた場合のフレームレートを比較したのが次のグラフだ。
手前側からポリゴンを重ねて描くと,見えないポリゴンは描画されないのでフレームレートに悪影響はないが,逆に奥側から描くと,最終的に見えないポリゴンも描かなくてはならないので(オーバードローと呼ぶ),フレームレートは下がる。AdrenoやMali,Tegraの結果はそれを反映しているが,PowerVRだけは,奥から描いてもフレームレートが下がっていない。これは「描画順に関わらず,不透明描画時にオーバードローが発生しないというPowerVRの特性」(永野氏)によるものだという。
2つめのグラフは,板に穴を開けたような“パンチスルー”オブジェクトを使った同様のテスト結果だ。「パンチスルーのシェーダは,不透明オブジェクトのシェーダにdiscard命令を追加したもの」(永野氏)を使用したという。discard命令とは,任意のピクセルを描かないようにする命令である。今回は穴の部分でこれを使うことで,パンチスルーオブジェクトを表現したわけだ。
さてその結果であるが,パンチスルーオブジェクトではどのGPUでも,描画順に関係なくオーバードローが発生して,フレームレートが低下している。
とはいえ永野氏によれば,「PowerVRでは,すべてのケースでオーバードローが発生するわけではない。軽いシェーダなら発生しない場合もある」とのこと。なお,PowerVRは1ポリゴンのみの描画でも,わずかにフレームレートが低下しているが,これについて永野氏は,「PowerVRに特有な,discard命令のオーバーヘッドによるもの」と説明していた。
最後には,不透明オブジェクトとパンチスルーオブジェクトを交互に描いた場合の結果が示されたが,これはGPUによって結果が大きく異なっていた。
まず奥から描く場合は,すべてのGPUでオーバードローが発生する。これは先の結果と同じで納得がいく。しかし,手前から「不透明,パンチスルー,不透明」という順で描くと,なぜかAdrenoとTegraでオーバードローが発生している。
さらに,手前から「パンチスルー,不透明,パンチスルー」という逆の順序で描くと,Maliでもオーバードローが発生。PowerVR以外のGPUでは,オーバードローが避けられないという結果となった。
オブジェクトの描画順によって,GPUごとにここまで大きな性能差が出るというのは興味深い。逆に言えば,GPUごとに描画順を変えるだけでも,GPUの性能を引き出せる可能性があるともいえるだろう。
さて,このセッションでは,Androidへグラフィックスエンジンを移植するときの難しさが語られたわけだが,各GPUや機種による興味深い差異が紹介され,参考になった。移植は困難を極めただろうが,こうした問題を突きとめて解決したことで,今後より高性能なモバイルGPUを搭載するAndroid端末が登場してきた時に対応できる柔軟さを,トライエースのグラフィックスエンジンは獲得したのではないだろうか。こういった取り組みがより広く,ノウハウとして広まっていくことにも期待しておきたい。
CEDEC 2013 公式Webサイト
- この記事のURL: