2013年9月28日土曜日

Androidでゲーム開発する際のTips

チームEGG 曽川です。

こちらのAndroid Developers Blogの翻訳です。
Using the Hardware Scaler for Performance and Efficiency
要はスケーラを1080pxにするとパフォーマンス等で恩恵があるという話です。


パフォーマンス向上と効率化のために、ハードウェアスケーラを使用する

パフォーマンスを要する3Dゲームを開発する場合に、美しいグラフィック、高いフレームレート、よりよいレスポンスをする方法を探すことでしょう。また、バッテリーの節約やもプレイ中にデバイスが熱くなるのも避けたいでしょう。この分野全てにおいての最適化を支援するために、現在ほぼすべてのAndroidデバイスで利用可能なハードウェアスケーラの活用を検討してください。

どのように動作し、なぜ使用するのか

最近のほぼすべてのAndroidデバイスは、ハードウェアビデオスケーラを含むCPUとGPUのチップセットを使用しています。Androidは上位ベルでの統合を提供しており、Javaやネイティブコード(C++)からAndroid 標準APIを介してアプリがスケーラを利用できます。ハードウェアスケーラを利用するには、システムが利用するデフォルトのグラフィックバッファ(デバイスのフルスクリーン解像度にサイズ調整されています)ではなく、固定のグラフィックバッファを使用するだけです。

固定サイズのバッファにレンダリングする場合、デバイスのハードウェアはアスペクト比の調整も含めて、デバイスの画面解像度に合うように拡大や縮小を行います。通常、効率的にレンダリングさせるために、デバイスのフルスクリーンよりも小さい固定サイズのバッファを作成します。(特に、現在の高解像度の画面において)

ハードウェアスケーラを使用するとより効率が良くなる理由はいくつかあります。
1つ目は、ハードウェアスケーラは非常に高速で、マルチタップと表示の乱れを減らすアルゴリズムを通して、素晴らしい表示結果を生成することができます。2つ目は、アプリが小さなバッファにレンダリングされているため、GPUでの演算負荷が減り性能が向上します。3つ目は、少ない演算処理によりGPUは低温で動作し、バッテリーの使用が少なくなります。最後は、使用したいレンダリングバッファのサイズを選択でき、実際の画面解像度にかかわらず全てのデバイスで同じとなります。

フィルレートの最適化

モバイル用のGPUにおいて、ピクセルフィルレートはパフォーマンスを要するゲームアプリのボトルネックとなる主な原因の1つです。最近の携帯端末やタブレットはかなり高い画面解像度を提供し、2Dや3Dのグラフィックをレンダリングすると、大幅にフレームレートが下がります。GPUは最大のフィルレートを埋めるために非常に多くのピクセルを打つため、フレームレートが低下します。

Androidで使用される一般的なチップセットにおける
レンダリングされる解像度別のGPUの消費電力
(データはQualcommが提供)
これらのボトルネックを回避するためには、ゲームが各フレームで描画するピクセルの数を減らす必要があります。これを達成するためにZプリパスの最適化のような方法がありますが、簡単で効果的な方法はハードウェアスケーラを使用することです。

サイズが2560x1600のようなフルサイズのバッファを描画するのではなく、ゲームでは小さなバッファ(例えば1280x720や1920x1080)にすることで、ハードウェアスケーラは追加のコストがなく、できるかぎり少ない画質低下で表示を拡大します。

消費電力と発熱を少なくする

パフォーマンスを要するゲームは多くのバッテリーを消費し、かなり発熱する傾向があります。ゲームの消費電力と発熱に関することはユーザにとって重要であり、開発者にとっても重要な検討事項です。

図に示すように、GPUでの消費電力はレンダリングする解像度が高くなると大幅に増加します。多くの場合、GPUに負荷をかけることはデバイスのバッテリ寿命を減らすことになります。

また、CPU/GPUのレンダリング負荷が増加するにつれて、持っていることが不快になるほど発熱します。発熱するにつれてCPU/GPUを冷やすために、処理速度を調整するように設計されているので、ゲームを処理する順番を抑えることができます。

消費電力と発熱の両方を最小限に抑えるために、ハードウェアスケーラは非常に便利です。小さいバッファにレンダリングするため、GPUは少ない電力でレンダリングし発熱を少なくします。

Android APIからハードウェアスケーラへのアクセス

Androidは、標準のAPIからハードウェアスケーラに簡単にアクセスできます。(JavaコードやAndroidNDKを介したネイティブ(C++)コード)

これには固定サイズのバッファを作成し、レンダリングするためのAPIを使用するだけです。デバイスの実際の画面サイズを考慮する必要はないですが、元の縦横比を保持したい場合には画面とバッファのアスペクト比を一致させるか、バッファのレンダリング領域に画面を合わせます。

Javaコードからは、APIレベル1で導入されたSurfaceViewを通じてスケーラーにアクセスします。ここで、1280x720の解像度で固定サイズのバッファを作成する方法は次のとおりです。

ネイティブコードからスケーラを使用したい場合は、Android 2.3(APIレベル9)で導入されたNativeActivityクラスを介して行います。ここで、NativeActivityを使って1280x720の固定バッファを作成する方法は以下のとおりです。

バッファサイズを指定することで、ハードウェアスケーラが有効にされ、指定されたウィンドウへのレンダリングが対象となります。


グラフィックバッファの選択

固定サイズのグラフィックスバッファを使用する場合、パフォーマンスや処理性能向上と、対象デバイス間での画質バランスにおいてサイズを選択することが重要です。

ハードウェアスケーラを使用するほとんどの高性能3Dゲームは、レンダリングの推奨サイズは1080pxです。図に示すように、1080pxは画質、フレームレート、消費電力において最適な大きさです。もちろん720pxで十分な場合は、良い操作性のためにこの値を使用してください。


さらに

アプリでハードウェアスケーラを使用したい場合は、AndroidフレームワークでレンダリングしているかネイティブAPIでレンダリングしているかに応じて、SurfaceViewNativeActivityのドキュメントを参照してください。

バードウェアスケーラを使用したサンプルコードは近日公開です!

2013年9月15日日曜日

「3秒サムライ」リリースしました。

チームEGG曽川です。

このたびチームEGG初のUnityアプリ「3秒サムライ」をリリースしました。

瞬発力のゲームで、「!」マークが表示されたらタップするというシンプルなゲームです。
ただし、戦えるのは「3秒」。
そのなかでどれだけ敵を倒せるか、姫を助けられるかのゲームです。
こちらからダウンロードできます。
https://play.google.com/store/apps/details?id=com.egg.sansamu&hl=ja
また、3秒サムライの曲はボカロPのmathru氏に作成していただきました。
mathruねっと

技術的な話

このゲームは「Google Play Game Services」や「In-app Billing Version3」のような新しい機能も含んでいます。
Google Play Game Servicesに関してはこちらで講演いたしますので、興味ある方はぜひご参加ください。
http://atnd.org/events/42496