スマートフォン向けゲームでは幅広い端末でプレイされることが想定されます。一律で同じ描画設定にすると、低スペック端末ではクラッシュ、処理落ち、発熱の原因となってしまうケースがあります。逆に高スペック端末では端末の性能を活かしてより良い品質にすることができる可能性があります。そこで、端末に応じた適切な描画設定に切り替える仕組みを紹介します。
低・中・高のようなプリセット形式と、ユーザーが直接値を操作できる形式の2つがゲームではよくある手法かと思います。
プリセット単位で切り替えたい場合の手法です。ユーザーにプリセットを選ばせる場合や、端末での自動判定でもこの手法を用います。
ProjectSettingsのQualityから、Add Quality Level を押下し、プリセット分追加します。その後、各プリセットに沿ったRenderPipelineAssetをアタッチします。必要に応じて、Qualityのその他の項目(Rendering, Textures等)を設定することも可能です。
コード上で、QualitySettings.SetQualityLevel を呼び出すことにより、任意のQualityLevelに切り替えることができます。
ユーザーにパラメータを操作させる場合は、こちらの手法になります。以下のようなコードで、パラメータを直接操作することができます。
var urpAsset = (UniversalRenderPipelineAsset)GraphicsSettings.currentRenderPipeline; // 解像度の変更 urpAsset.renderScale = value; // 影のカスケードの枚数の変更 urpAsset.shadowCascadeCount = value; // その他、影の解像度であったり、追加ライトの個数等
端末によって、プリセットを推奨、自動で設定したいケースもあるかと思います。その場合は、 SystemInfo型が便利です。
特に、deviceModel、graphicsDeviceName、systemMemorySizeで見ると識別しやすい値を取得することができます。以下は返ってくる値の例です。
表3.1: 端末毎のSystemInfoの返ってくる値の例
| 機種 | deviceModel | graphicsDeviceName | systemMemorySize |
|---|---|---|---|
| iPhone 13 | iPhone14,5 | Apple A15 GPU | 約3800 |
| iPad Pro 11-inch (第3世代) | iPad13,4 | Apple M1 GPU | 約7800 |
| Galaxy S23 | samsung SM-S911B | Adreno (TM) 740 | 約7500 |
| Pixel 8 | Google Pixel 8 | Mali-G715 | 約7400 |
iOSはdeviceModelとgraphicsDeviceNameの命名規則が一貫しているのと、基本的に同じ系列内であれば A もしくは M の後の数字が大きいほどスペックが高いです。ですので、組み合わせることで一定程度切り分けられます。
Androidは、各機種によって返ってくる値がまばらですので、iOSのように一概に比較することは難しいです。ですので、
等で切り分けるのが良いです。
自作のRendererFeature等を作成した際にも、描画設定を切り替えられるAPIを準備しておくと便利です。例えば、
等の対応が挙げられます。