PC と同様に iOS および Android などのモバイルプラットフォームにはさまざまなレベルのパフォーマンスを持ったデバイスがあります。デバイスによってレンダリング能力の差が 10 倍にもなります。 スケーリングを行う簡単な方法としては
グラフィックスパフォーマンスはフィルレート、ピクセル数、およびジオメトリの複雑さ(頂点カウント)により制約されます。これら 3 つともレンダラーをカリングする方法がみつけられれば削減することができます。オクルージョンカリングがここでは役立つかもしれません。Unity は自動的にビュー Frustum の外にあるオブジェクトをカリングします。
モバイルではフィルレートの制約(フィルレート = 画面ピクセル数 x シェーダー複雑さ x オーバードロー)があり、複雑すぎるシェーダーがもっとも良くある問題です。このため Unity に付属するシェーダーを使用するか自身で設計するときはできるだけシンプルにします。もし可能であればピクセルシェーダーを頂点シェーダーに移行してシンプルにします。
Quality Settings で Texture Quality を下げることでゲームが速くなる場合メモリ帯域幅により制限されている可能性が高いです。テクスチャを圧縮する、ミップマップを使用する、テクスチャサイズを削減する、等々を行います。
LOD (Level of Detail) - によりオブジェクトをシンプルにするか遠ざけるにつれて完全に削除します。
モバイル GPU は生成する熱量、使用する電力、大きさや音の大きさに大きな制限があります。このためデスクトップ部品と比較してモバイル GPU は帯域幅が少なく、ALU パフォーマンスが低く、テクスチャリングパワーが劣ります。GPU のアーキテクチャはできる限り小さい帯域幅で少量の電力を使用するように最適化されてます。
Unity は OpenGL ES 2.0 に最適化されていて、GLSL ES (HLSL と類似) シェーディング言語を使用します。ビルトインシェーダーはほとんど HLSL (Cg とも知られる) で書かれています。これはモバイルプラットフォームでは GLSL ES にクロスコンパイルされます。直接 GLSL を記述することもできますが、GLSL->HLSL の変換ツールが現在ないため OpenGL 関連のプラットフォームが制限されます(例えばモバイルおよび Mac )。HLSL で float/half/fixed 型を使用すると GLSL ES では highp/mediump/lowp 精度表現になります。
よい慣習とすべきことのチェックリストを次に示します:
void Update (){
// メッシュを切り替えます
bufferMesh = on ? meshA : meshB;
on = !on;
bufferMesh.vertices = vertices; // メッシュを変更
meshFilter.sharedMesh = bufferMesh;
}
フィルレートにより制限されているか判断するのは容易です: 画面解像度を下げるとゲームは速くなりますか? もしそうであれば、フィルレートにより制限されています。
次の手法によってシェーダーの複雑さを軽減します:
ゲームが GPU のピクセル処理により制限されてる場合が良くあります。結果的に、特にマルチコアモバイル CPU で、未使用の CPU 処理能力が余ることになります。このため GPU 作業を代わりに CPU に付け替えることが効果的です( Unity はこれをすべて自動的に行います):メッシュスキニング、小さいオブジェクトのバッチング、パーティクルオブジェクトの更新など。
これらはやみくもに行うのではなく、慎重に使用するべきです。ドローコールがネックではない場合、バッチングはカリングの効率を下げるだけでなく、ライトにより影響を受けるオブジェクト数を増やしてしまうので、パフォーマンスに悪影響を与えます。
物理計算は重い CPU 処理を伴います。エディタープロファイラーによりプロファイリングできます。もし CPU 上で物理計算の時間がかかりすぎている場合:
これらはポピュラーなモバイルアーキテクチャです。これは PC/コンソールで両方とも異なるベンダーであり、通常の GPU と異なる GPU アーキテクチャです。
異なるレンダリングのアプローチを検討してゲームをそれにあわせて設計します。ソートには特別に注目します。開発サイクルの早い段階でサポートする最低限のローエンドデバイスを決めます。ゲームを設計するときにプロファイラーを有効にしてテストします。
プラットフォーム固有のテクスチャ圧縮を使用します
PowerVR アーキテクチャ(タイルベースディファード)のみを気にすればよいです。
つまり:
また欠点として:
ダウンロードは OS により提供される非同期 API により実装されているため、OS がいくつのスレッドがダウンロードで作成する必要があるか判断します。複数の同時ダウンロードを起動するとき、デバイスがサポートできる帯域幅の合計および空きメモリ量を頭に入れる必要があります。各々の同時ダウンロードにより一時バッファが割りあてられるため、メモリが不足しないように注意すべきです。
まれにクラッシュした時は、コンソールには何もありません。