![印刷](/image/icon_print.gif)
イベント
[CEDEC 2011]Android向けのハイエンドゲームを作るには? 「Tegra技術概要およびTegraゲーム開発について」レポート
![]() |
「Tegra」を強調したタイトルではあったが,NVIDIA製ツールの紹介やTegraに関する注意点はところどころに入るものの,大筋はAndroidでハイエンドゲーム開発を行うときの注意点などを解説するという内容だった。
本講演のポイントとして挙げられるのは,以下の2点。
- NDK(後述)の使用を前提としている
- すでにあるゲームの移植を前提としている
Androidにおける開発ガイドとしては少し珍しい内容といえるだろう。
![]() |
なお,現行製品である「Tegra 2」の次世代SoC「Kal-El」(カルエル,開発コードネーム)は,2011年内に登場する予定。Kal-Elは,搭載されるGPUとCPUがそれぞれTegra 2比で3倍の性能になるほか,他社製のARM系CPUでは多く採用されているNEON命令にも対応し,より使いやすいSoCとなっていくとのことだ。
![]() |
![]() |
![]() |
まず,決めなければならないのは,どのAPIとどのAndroid OSのバージョンをターゲットにするかだ。
一般的なAndroidのプログラムは,基本的にJavaを使って作られているので,CPUを問わず中間コードベースで実行可能だ。Java自体にはノウハウの蓄積もあり,仕様的に見てもそれなりによいプログラミング言語といえるが,仮想マシン上で動作させる環境となっている点が長所であり短所でもある。つまり,最大の問題は,パフォーマンス的な部分なのだ。基本的には中間コードでの実行なので,最先端のハードが投入されているのに,iPhoneなどと比べてAndroidのゲームにもっさり感があったりするのは,Androidを触ったことがある人ならなんとなく分かるだろう。
![]() |
ネイティブコードでプログラムを実行すれば,速度的な問題は一気に解決されることになる。ただし,現状のNDKでは,サポートされているのがARMのみとなっているはずなので,これからAndroidで頑張る姿勢を見せているIntelにとってはちょっと残念なことなのかもしれない(別途バイナリを用意すれば解決できそうだが)。
いずれにしても,今回は「ハイエンドゲーム」をターゲットにしているので,NDKの使用を前提として話が進められている。
続いて決めるべきは,Android OSのどのバージョン以降をターゲットにするかだ。これについては,現在の市場動向やバージョンによってサポートする機能の違いなどがまとめて紹介された。
Android 2.1は,NDKで作ったネイティブコードの実行がサポートされた初めてのバージョンである。ただ,ネイティブコードから使用できない機能も多く,SDカード上にプログラムを置くこともできない。
Andorid 2.2では,描画サーフェスに対し,CPUでの描画ができるようになる。プログラムをSDカードにインストールできるようになったことも大きなメリットといえるだろう。
Android 2.3では,ネイティブコードでできることが非常に拡大し,ほぼネイティブコードだけでアプリケーションを作ることができるようになった(Native Activity)。これまでは,Javaコードを呼び出さなければならなかったプレイヤーによる各種入力操作も直接取得できるほか,ビデオ再生以外のほとんどのことがJavaを使わずに実行できるようになっている。
なお,Android 3.0,Android 3.1,Android 3.2でのネイティブコードの扱いは,Android 2.3とほとんど変わらないそうだ。
![]() |
![]() |
現在の市場を見る限り,ほとんどの製品がAndroid 2.2以降を採用しているので,現状では一般的なAndroidアプリならば,Android 2.2以降をターゲットにして作ればほぼ問題ないだろう。しかし,NDKの活用という意味では,Android 2.2とAndroid 2.3で大きな違いがあるため,今後の市場動向を見越してAndroid 2.3以降をターゲットに開発を進めるのもアリといえそうだ。
サポートするバージョンを増やすことは,市場を広げるという効果があるのだが,制作時に発生する作業量も増えていくので,そのあたりのバランスを取ることも重要になるだろう。
![]() |
![]() |
- 組み込み
- チューニング
- 製品化
それぞれを順番に説明していこう。
●組み込み
![]() |
移植元によっては,レンダリングエンジンを適合させることも重要な要素に成り得る。たとえば,Androidでは「OpenGL ES」が使われているのだが,Android OSのバージョンによってOpenGL ES 1.xをサポートしたものとOpenGL ES 2.0をサポートしたものとの2種類があったりする。もちろん,今後はOpenGL ES 2.0を使うことが望ましい。
なお,デスクトップ用の「OpenGL」に「OpenGL ES 2.0プロファイル」を適用することで,OpenGL ES 2.0とほぼ同じ機能を備えたものが実現できる。デスクトップPCで十分にデバッグしてから実機へと持っていったほうが,より楽に開発できるはずだ。
また,この段階で最終的な製品をどのようなものにするのか,しっかりプランニングしておくとやり直しの作業が発生しにくくなるので,できるだけ初期段階で仕様を詰めておくのが望ましい。
![]() |
![]() |
![]() |
![]() |
●チューニング
![]() |
グラフィックス部分でのパフォーマンス最適化は,NVIDIAが公開している「PerfHUD ES」の活用が推奨されている。これはTegraでしか動作しないが,ハードウェアに依存する代わりに非常に突っ込んだ機能を備えたツールとなっている。
現在は「Parallel Nsight」に取って代わられているが,PC用の「PerfHUD」というツールが公開されていたので,使ったことがある人もいるかもしれない。このPerfHUDのTegra版がPerfHUD ESというわけだ。
![]() |
![]() |
![]() |
ちなみにCPU部分のパフォーマンス最適化に向けた「Quad Damage」というツールが近日リリース予定だそうだ。CPUコアの使用状況はもちろん,キャッシュの状態なども確認できるツールになるという。こういったものが使えるのと使えないのとでは開発効率にもかなり差が出てきそうだ。
![]() |
![]() |
●製品化
![]() |
また,端末を縦向きから横向きにされたときにどうするか,電話がかかってきたらどうするかといったことに対しても,一定の処理が必要になる。
![]() |
![]() |
![]() |
![]() |
![]() |
移植作業の流れは以上のようになるのだが,ゲーム制作においてグラフィックス周りで重要となる描画パフォーマンスを上げるための,最適化Tipsも紹介された。
ゲームのパフォーマンスを上げるための注意事項としては,Draw Callをどの順番で行うかに注意することが必要だという。これは,とくにTegraで問題になる項目とのことで,描画効率を上げるにはZcull機能を有効に使うことが重要となるという。
Zcull機能を有効に使うというのは,Zバッファを使った描画の最適化で,新しく書こうとしているポリゴンより手前にあるポリゴンが,すでに描かれている部分の描画処理をスキップするというものだ。たとえば,手前に大きな物体が見えている場合,その後ろにあるものを全部描画しなくても問題ないので,ここで大幅な負荷削減ができることになる。「手前にあるものから先に描く」場合と「奥にあるものから先に描く」場合とで効率が全然変わってくることは分かるだろう。
![]() |
また,半透明やαブレンドは,この規模のGPUコアにとってかなり重い処理なのでなるべく避けたほうがいい。Draw Callを減らすことがパフォーマンスアップにつながるというのはよく聞く話だが,スマートフォンやタブレットにおいてもこれは有効な手段である。
スキニングについては,CPU処理のほうがGPU処理に比べてパフォーマンスが上がることもあるそうで,現にゲームエンジン「Unity」ではCPUによるスキニングを行っているとのこと。
![]() |
ありがたみがピンとこない人もいるかもしれないが,Android SDKのインストールは,ドキュメントに「書かれているとおりに行うと絶対にうまくいかない」仕様になっていたときがあるので,いろんなものをまとめて簡単にインストールできるのは本当にありがたい(以前が変だっただけだが)。
このTegra Android Development Packは,Tegraという名前が付いてはいるものの,大半はTegra以外でも使用できる開発環境を提供するものであり,NDKでゲーム開発をする人全般を支援するものになっている。プロファイラなど一部のツールについてはTegraでしか動かないものの,これから開発を始めるという人なら,まずこのTegra Android Development Packをインストールするといいだろう。
とくにネイティブコードに対応したデバッグマネージャNVDMなどは,ネイティブコードを使うつもりがあるのなら,必須の環境といっていいだろう。
2011年3月に開催された「GDC 2011」のセッションでは,「NDKのデバッグ環境が『printf』だけではなくなりました」というだけで喝采が起きていたように,ネイティブコードの適用範囲と開発環境が凄い勢いで整備されつつある。
最初にAndroidでネイティブコードを動かすと聞いたときは,単にJNIのようなものかと思っていたのだが,ほぼ完全にネイティブコードで開発できる状況にもなってきている。ことゲームにおいて,この流れは歓迎すべきものといえるだろう。
今後は,Eclipseだけでなく,Visual StudioでのAndroidプログラム開発が可能になるようで(Visual Studioの統合は“Coming Soon”とのこと),ますます魅力的な開発環境になりそうな気配がある。今後のさらなる開発環境整備にも期待できそうだ。
- この記事のURL: