モバイルゲームのパフォーマンスを最適化する:物理演算、UI、オーディオ設定に関するエキスパートからのヒントを得る

THOMAS KROGH-JACOBSEN / UNITY TECHNOLOGIESSenior Technical Content Marketing Manager
Jul 13, 2021|13 分
モバイルゲームのパフォーマンスを最適化する:物理演算、UI、オーディオ設定に関するエキスパートからのヒントを得る
このウェブページは、お客様の便宜のために機械翻訳されたものです。翻訳されたコンテンツの正確性や信頼性は保証いたしかねます。翻訳されたコンテンツの正確性について疑問をお持ちの場合は、ウェブページの公式な英語版をご覧ください。

Integrated Success チームは、Unity の顧客が抱える複雑な技術的問題をサポートします。シニアソフトウェアエンジニアで構成されるこのチームに、モバイルゲームの最適化に関する知見を聞かせてもらいました。

当社の Unity Studio Productions チームはソースコードを熟知しており、無数に存在する Unity の顧客みんながエンジンを最大限に活用できるようサポートしています。このチームは、クリエイターのプロジェクトに深く入り込み、パフォーマンスを最適化することで、スピード、安定性、効率性を向上させるポイントを見つけ出します。

Unity のエンジニアたちがモバイルゲームの最適化に関する知見のシェアを始めるとすぐに、元々予定していた 1 本のブログ記事に収まりきらないほど素晴らしい情報があることに気づきました。そこで私たちは、彼らの膨大な知識を e ブックとしてまとめ(ダウンロードはこちら)、そこに収録されている 75 以上の実用的なヒントの一部を紹介する一連のブログ記事を作成することにしました。

シリーズ 2 本目となる今回は、UI、物理演算、オーディオ設定でパフォーマンスを向上させる方法を詳しく見ていきます。前回の記事では、プロファイリング、メモリ、コードアーキテクチャについてご紹介しました。まだご覧になっていない方はぜひそちらもご覧ください。また、次回の記事ではアセット、プロジェクト設定、グラフィックスについて取り上げますので、そちらもご期待ください。

ヒント無料の e ブックをダウンロードしてください。

さっそく始めましょう!

物理演算

Unity のビルトインの物理演算エンジン(Nvidia PhysX)は、モバイルで使うには高価なものとなることがあります。しかし、以下のヒントを参考にすれば、1 秒あたりのフレーム数をより多くすることができます。

設定を最適化する

有効ならば、PlayerSettingsPrebake Collision Meshes をチェックします。

プレイヤー設定ボックス内の画像。背景は濃い灰色で、「prebake collision meshs*」というテキストがチェックされ、赤枠で囲まれている。
Prebake Collision Meshes を有効にする。

物理演算設定Project Settings > Physics)を編集し、Layer Collision Matrix を出来るだけ簡素にするようにしてください。

Auto Sync Transforms」を無効にし、「Reuse Collision Callbacks」を有効にします。

グレーの背景のプロジェクト設定ボックスと、「Auto Sync Transforms」および「Layer Collision Matrix」のセクションが赤枠で囲まれている画像。
物理演算のプロジェクト設定を変更することで、パフォーマンスを向上させることができる。
プロファイラーの物理演算モジュールの画像。黒の背景に緑、青、オレンジの 5ms のセクションでアクティビティが表示されている。
プロファイラーの Physics モジュールのパフォーマンスに問題がないか確認する。
コライダーの簡略化

メッシュコライダーは負荷が高い場合があります。複雑なメッシュコライダーを、元の形状を近似するプリミティブのコライダーまたは簡略化されたメッシュコライダーに置き換えましょう。

コライダーの形状には、プリミティブまたは簡略化されたメッシュを使用しよう。
コライダーの形状には、プリミティブまたは簡略化されたメッシュを使用しよう。
物理演算メソッドで Rigidbody を動かす

MovePositionAddForce などのクラスメソッドを使って、Rigidbody オブジェクトを動かします。オブジェクトの Transform コンポーネントを直接変換すると、物理演算でワールドの再計算を行う必要が生じ、複雑なシーンでは計算のコストが高くなります。物理ボディの移動は Update ではなく FixedUpdate で行いましょう。

Fixed Timestep を修正する

プロジェクト設定にある Fixed Timestep のデフォルトは 0.02(50Hz)です。これを目標とするフレームレートに合わせて変更してください(例:30fps なら 0.03)。

ただし、実行時にフレームレートが低下する場合、これは Unity が FixedUpdate をフレームごとに複数回呼び出していることを意味し、物理演算を多用するコンテンツでは CPU パフォーマンスに問題が生じさせる可能性があります。

Maximum Allowed Timestep は、フレームレートが低下した場合に、物理演算や FixedUpdate イベントを使用できる時間を制限するものです。この値を下げると、パフォーマンスのヒッチが発生している間、物理演算とアニメーションの動作が遅くなり、フレームレートへの影響も小さくなります。

プロジェクト設定内の固定時間モジュールのイメージ。背景は灰色でテキストは白。
Fixed Timestep を目標とするフレームレートに合わせて変更し、Maximum Allowed Timestep を下げてパフォーマンス上の不具合を低減する。
Physics デバッガーで視覚化する

問題のあるコライダーや不具合のトラブルシューティングには、Physics Debug ウィンドウ(Window> Analysis> Physics Debugger)を使いましょう。これにより、互いに衝突する可能性のあるゲームオブジェクトが色分けされて表示されます。

オレンジ色のボートの画像。物理演算デバッガーダイアログボックス内にメッシュオーバーレイと青い影がある。
Physics Debug ツールは、物理演算の対象になるオブジェクトがどのように相互作用するかを視覚化する時に役立つ。

詳しくは、Unity ドキュメントの物理演算デバッグの可視化をご覧ください。

ユーザーインターフェイス

Unity UI(UGUI)は、しばしばパフォーマンス問題の原因となります。Canvas コンポーネントは、UI 要素のメッシュを生成・更新し、GPU にドローコールを発行します。その機能の実行コストは高くなることもあるので、UGUI を利用する際には以下のことに注意してください。

キャンバスを分割する

何千もの要素を持つ大きなキャンバスがある場合、1 つの UI 要素を更新するとキャンバス全体が更新されることになり、CPU の使用率が急上昇することがあります。

UGUI の複数のキャンバスをサポートする機能を活用しましょう。更新頻度に応じて UI 要素を分割しましょう。静的な UI 要素のキャンバスは分離して置き、同時に更新される動的な要素は小さなサブキャンバスに配置しておきます。

また、あるキャンバス内のすべての UI 要素が、同じ Z 値、マテリアル、テクスチャを持つようにしましょう。

見えない UI 要素を非表示にする

例えば、キャラクターがダメージを受けたときに表示される体力バーのように、ゲーム中に不定期にしか表示されないUI要素があります。UI 要素が見えなくてもアクティブになっていれば、ドローコールを使用している可能性があります。見えない UI コンポーネントは明示的に無効にし、必要に応じて再度有効にするようにしましょう。

キャンバスが見えないようになればいいのであれば、GameObject ではなく Canvas コンポーネントを無効にしてください。これにより、メッシュや頂点の再ビルドを避けることができます。

GraphicRaycaster を制限し、Raycast Target を無効にする。

画面上でのタッチやクリックなどの入力イベントを処理するには、GraphicRaycaster コンポーネントが必要です。これは単純に画面上の各入力ポイントをループし、それが UI の RectTransform 内にあるかどうかをチェックするものです。

デフォルトの GraphicRaycaster をヒエラルキーの一番上にあるキャンバスから削除します。代わりに、インタラクションが必要な個別の要素 (ボタン、ScrollRect など) にのみ、GraphicRaycaster を追加します。

グレーのグラフィックのレイキャスターダイアログの画像と白い文字
デフォルトで有効になっている Ignore Reversed Graphics を無効にする。

また、すべての UI テキストや画像について、必要なければ Raycast Target を無効にします。UI が多くの要素で構成されている複雑なものであれば、こうした小さな変更の積み重ねが無駄な計算を減らすことにつながります。

グレーの背景に「Raycast Target」というテキストが赤い四角で囲まれている画像ダイアログ。
必要のないところでは Raycast Target を無効にする。
レイアウトグループを避ける

レイアウトグループは非効率に更新されるため、控えめに使用してください。動的なコンテンツを扱わない場合はまったく使わないようにし、プロポーショナルレイアウトを作る際はアンカーを使用するようにしましょう。これをやりたくない場合は、カスタムコードを作成して、UI を設定した後に Layout Group コンポーネントを無効にしてください。

動的な要素にレイアウトグループ(Horizontal、Vertial、Grid)を使用する必要がある場合は、パフォーマンスを向上させるために入れ子にしないようにしてください。

グレーの背景と白いテキストのグリッドレイアウトグループダイアログ
レイアウトグループは、特に入れ子になっている場合、パフォーマンスを低下させる場合がある。
大きなリストビューとグリッドビューを避ける

大きなリストビューやグリッドビューは負荷が高い。大規模なリストビューやグリッドビューを作成する必要がある場合(例:数百のアイテムを含む持ち物画面)、アイテムごとに UI 要素を作成するのではなく、より小さな UI 要素のプールを作ってその中の要素を再利用することを検討してください。このサンプル GitHub プロジェクトでは、実際にそれを行っているところを見ることができます。

多数の要素を重ね合わせない

UI 要素を多数重ねる(例:カードバトルゲームでカードを重ねる)と、オーバードローになります。コードをカスタマイズして、層になった要素を実行時により少数の要素やバッチにマージすることができます。

複数の解像度とアスペクト比を使う

現在、モバイルデバイスの解像度や画面サイズはデバイスによって異なっているため、各デバイスで最高の体験を提供するために、代替バージョンの UI を作成します。

デバイスシミュレーター を使用して、サポートされているさまざまなデバイスで UI をプレビューすることができます。また、XCodeAndroid Studio でもバーチャルデバイスを作成することができます。

グレーのダイアログボックスの背景とスマートフォン上の競艇ゲームのシミュレーションが表示されたデバイスシミュレーターの画像。
デバイスシミュレーターを使って、さまざまな画面フォーマットのプレビューを行う。
フルスクリーン UI を使うときは、他のものをすべて非表示にする

一時停止画面やスタート画面で、シーンのそれ以外の部分がすべて隠れてしまう場合は、3D シーンをレンダリングしているカメラを無効にしてください。同様に、一番上のキャンバスの後ろに隠れている背景のキャンバス要素も無効にします。

60fps で更新する必要はないはずなので、フルスクリーン UI を表示している間は、Application.targetFrameRate を下げることも検討してください。

ワールド空間とカメラ空間のキャンバスにカメラを割り当てる

Event や Render Camera フィールドを空白にしておくと、Unity はそこに Camera.main を強制的に割り当てます。これは描画コストを不必要に増大させます。

キャンバスの RenderModeScreen Space - Overlay を使えば、カメラは必要なくなります。これを使うことも検討してください。

背景がグレーアウトされ、テキストが白い「Camera space canvases」ダイアログの画像。
Render Mode に World Space を指定する場合は、必ず Event Camera に何か値を入れる。
オーディオ

オーディオは通常、パフォーマンスのボトルネックにはなりませんが、メモリを節約するために最適化することは可能です。

グレーの背景に白いテキスト、下部にオレンジ色のボイスモジュレーターが表示された Inspector ダイアログボックス
オーディオクリップの読み込み設定を最適化する。
可能な場合は、オリジナルの非圧縮 WAV ファイルをソースアセットとして使用する

圧縮されたフォーマット(MP3 や Vorbis など)を使うと、Unity はそれを一旦展開し、ビルド時に再圧縮します。この結果、品質を低下させる部分が 2 つできることになり、最終的な品質が低下します。

クリップを圧縮し、圧縮ビットレートを下げる

圧縮することで、クリップのサイズとメモリ使用量を削減できます。

  • ほとんどのサウンドには Vorbis を使用します(ループさせないサウンドには MP3)。
  • 頻繁に使われる短い音(足音、銃声など)には、ADPCM を使用してください。これは非圧縮の PCM に比べてファイルサイズを小さくしつつ、再生時のデコードも速いのが特徴です。

モバイル機器での効果音は、最大でも 22,050Hz とします。これより低い値に設定しても、最終的な品質への影響はほとんどありませんが、これはご自身の耳で聴いて判断してください。

適切な Load Type の選択

設定はクリップサイズによって異なります。

  • 小さいクリップ(200 KB 未満)はロード時に解凍するこれは、サウンドを raw 16 ビット PCM オーディオデータに展開し CPU コストとメモリを消費するため、短いサウンドのみに使うべきものです。
  • 中程度のクリップ(200 KB 以上) メモリ内で圧縮されたままにしてください。
  • 大容量ファイル(BGM)は「Streaming」に設定する必要があります。こうしないと、アセット全体が一度にメモリに読み込まれます。
ミュートされた AudioSource をメモリからアンロードする

ミュートボタンを実装するときは、単純に音量を 0 に設定するのではなく、AudioSource コンポーネントを破棄してメモリからアンロードすることもできます。ただし、プレイヤーがこのオンとオフを頻繁に切り替える必要がない場合に限ります。

モバイルゲームのパフォーマンス向上のヒントのリスト全体をダウンロードする

次のブログ記事では、グラフィックスとアセットについて掘り下げていきます。今すぐチームからのヒントとコツをすべて乗せたリスト全体を見てみたい方は、こちらのページから完全版の e ブックをダウンロードしてご覧ください。

赤い背景にドラゴンが登場するアドベンチャーゲームのグラフィックと、太字の白い文字で「Optimize your mobile game performance」と書かれている e ブックカバーの画像。

E ブックをダウンロード

Integrated Support サービスについてもっと知りたい、あるいはチームにエンジニアと直接やりとりする窓口や、専門家のアドバイスやプロジェクトのベストプラクティスガイダンスを提供したいとお考えの方は、こちらのページでご案内している Unity のサクセスプランをご検討ください。

今後もパフォーマンス向上のためのヒントをお届けしていきますので、ぜひご期待ください。

私たちは皆さんの Unity アプリケーションに最大限のパフォーマンスを発揮させるお手伝いをしたいと考えています。他にも取り上げてほしい最適化に関わるトピックがありましたら、コメントセクションでお知らせください。