PC と同様に iOS および Android などのモバイルプラットフォームにはさまざまなレベルのパフォーマンスを持ったデバイスがあります。デバイスによってレンダリング能力の差が 10 倍にもなります。 スケーリングを行う簡単な方法としては
グラフィックスパフォーマンスはフィルレート、ピクセル数、ジオメトリの複雑さ(頂点カウント)により制約されます。これらのレンダラーをカリングする方法を見つけることができれば、これらすべてを削減することができます。Unity は自動的に視錐台の外にあるオブジェクトをカリングするため、オクルージョンカリングがここでは役立つかもしれません。
モバイルではフィルレートの制約(フィルレート = 画面ピクセル数 x シェーダーの複雑さ x オーバードロー)があり、複雑すぎるシェーダーがもっとも良くある問題です。このため Unity に付属するシェーダーを使用します。自身で設計するときは、できるだけシンプルにします。もし可能であれば、ピクセルシェーダーを頂点シェーダーに移行してシンプルにします。
Quality 設定の 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 が判断します。複数の同時ダウンロードを起動するとき、デバイスがサポートできる帯域幅の合計および空きメモリ量を考慮する必要があります。各同時ダウンロードにより一時バッファが割りあてられるため、メモリが不足しないように注意します。
ランダムなクラッシュの場合は、コンソールには何も表示されない場合があります。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.