PC と同様に iOS および Android などのモバイルプラットフォームにはさまざまなレベルのパフォーマンスを持ったデバイスがあります。デバイスによってレンダリング能力の差が 10 倍にもなります。 スケーリングを行う簡単な方法としては
グラフィックスパフォーマンスはフィルレート、ピクセル数、ジオメトリの複雑さ(頂点カウント)により制約されます。これらのレンダラーをカリングする方法を見つけることができれば、これらすべてを削減することができます。Unity は自動的に視錐台の外にあるオブジェクトをカリングするため、オクルージョンカリングがここでは役立つかもしれません。
モバイルではフィルレートの制約(フィルレート = 画面ピクセル数 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 が判断します。複数の同時ダウンロードを起動するとき、デバイスがサポートできる帯域幅の合計および空きメモリ量を考慮する必要があります。各同時ダウンロードにより一時バッファが割りあてられるため、メモリが不足しないように注意します。
ランダムなクラッシュの場合は、コンソールには何も表示されない場合があります。