Unity FPSが重いときに見るべき所|軽量化・最適化の基本

FPS・TPS・シューティングゲームの作り方

Unity FPSが重い。
でも、「どこを最適化すればいいのか分からない」そんな風に感じていませんか。

実は、Unity FPSの軽量化には、見るべきポイントがあります。
適切な最適化により、パフォーマンスを大幅に向上させることができるでしょう。

この記事では、Unity FPSが重いときに見るべき所を、軽量化・最適化の基本とともに詳しく解説します。

この記事でわかること

  • Unity FPSのパフォーマンス問題の特定方法(所要30分)
  • 軽量化・最適化の基本的なテクニック(所要1時間)
  • よくあるパフォーマンスボトルネックと対策(所要1時間)
  • Unity FPS最適化でよくある失敗5選と解決方法
  • 実用的な最適化作業完成までの4ステップ(合計4時間)
ゲーム開発講師
ゲーム開発講師

最初はProfilerで問題箇所を特定して、優先順位をつけて最適化していくのがコツです。一度に全部を最適化しようとしないことが重要です。

ゲーム制作をゼロから学びたいあなたへ
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
ゲームを「遊ぶ側」から「作る側」へ

あなたのオリジナルゲーム、今年こそ完成させませんか?

RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。

Unity入門の森|永久会員チケット

永久会員チケット|Unity入門の森

全講座ラインナップを見てみる

実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。

Unity FPSのパフォーマンス問題とは?基礎知識から理解する

Unity FPSのパフォーマンス問題とは?基礎知識と用語解説

Unity FPSのパフォーマンス問題とは、ゲームが重くなり、フレームレートが低下する問題のことです。
60FPSを目指すFPSゲームでは、30FPSを下回ると明らかに重く感じられます。
適切な最適化により、パフォーマンスを向上させることができるでしょう。

Unity FPSのパフォーマンス問題には、CPU負荷GPU負荷メモリ使用量が関係します。

CPU負荷は主にスクリプト処理と物理演算に影響し、GPU負荷は描画処理に影響します。

メモリ使用量が増えると、ガベージコレクションが頻繁に発生し、フレームレートが不安定になる可能性があります。

問題箇所を特定し、優先順位をつけて最適化することが重要です。

Profilerを使って、具体的な問題箇所を特定できます。

パフォーマンス指標の目安

FPSゲームでは、60FPSを維持することが理想です。

フレームレートが30FPSを下回ると、操作感が明らかに悪くなります。

Profilerで確認すべき主な指標は以下の通りです。

パフォーマンス指標の目安

  • Frame Time:16.67ms以下が理想(60FPS達成)
  • DrawCall:100以下を目指す(150以下なら許容範囲)
  • Batch:DrawCallと同様に100以下を目指す
  • SetPass Calls:50以下が理想
  • Tris:100万ポリゴン以下を目指す(モバイルなら50万以下)
  • Memory:使用量が急激に増えていないか確認

これらの指標を定期的に確認することで、パフォーマンス問題を早期に発見できます。

特に、DrawCallが200を超えている場合は、すぐに最適化を検討すべきでしょう。

Unity FPSのパフォーマンス問題に影響する要素

Unity FPSのパフォーマンス問題に影響する要素

  • 描画処理:オブジェクトの描画数とポリゴン数(所要時間:確認30分)
  • 物理演算:ColliderとRigidbodyの数(所要時間:確認30分)
  • スクリプト処理:Update関数の処理量(所要時間:確認1時間)
  • メモリ使用量:オブジェクトの生成と削除(所要時間:確認30分)

描画処理は、GPU負荷に直結します。

画面内に表示されているオブジェクトの数が多すぎると、DrawCallが増加し、パフォーマンスが低下します。

物理演算は、CPU負荷に影響します。

ColliderやRigidbodyの数が多いと、物理演算の計算コストが高くなります。

スクリプト処理は、Update関数で毎フレーム実行される処理が問題になりがちです。

Update関数内で重い処理を実行していると、CPU負荷が高くなります。

メモリ使用量は、オブジェクトの頻繁な生成と削除により増加します。

メモリが増えると、ガベージコレクションが発生し、フレームレートが一時的に低下します。

ゲーム制作をゼロから学びたいあなたへ
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる

軽量化・最適化の基本的なテクニック

軽量化・最適化の基本的なテクニック

軽量化・最適化の基本的なテクニックを解説します。
適切なテクニックにより、パフォーマンスを向上させられます。

オブジェクトプーリングの活用

弾や敵などのオブジェクトを頻繁に生成・削除する場合、オブジェクトプーリングを使います。

オブジェクトを再利用することで、メモリ割り当てのオーバーヘッドを減らせます。

頻繁に生成・削除されるオブジェクトには、オブジェクトプーリングを活用しましょう。

オブジェクトプーリングを実装する際は、プールのサイズを適切に設定することが重要です。

プールが小さすぎると、追加のオブジェクトを生成する必要があり、効果が薄れます。

一方、プールが大きすぎると、メモリを無駄に消費します。

目安として、同時に存在する最大数の1.5倍程度のサイズをプールに確保するのが良いでしょう。

描画処理の最適化

描画処理の最適化では、描画されるオブジェクトの数を減らします。

画面外のオブジェクトを非表示にしたり、LOD(Level of Detail)を使ったりすることで、描画負荷を軽減できます。

また、バッチングを活用することで、描画コールを減らせます。

Static Batchingは、動かないオブジェクトに対して適用できます。

同じマテリアルを使用しているオブジェクトを自動的にバッチングし、DrawCallを削減します。

Dynamic Batchingは、動くオブジェクトに対して適用できますが、条件が厳しいため、使用する際は注意が必要です。

目安として、300ポリゴン以下、かつ同じマテリアルを使用しているオブジェクトが対象になります。

SRP Batcherを使うと、より効率的なバッチングが可能になります。

メモリ管理の最適化

メモリ管理では、不要なオブジェクトの生成を避けることが重要です。

文字列の連結(+演算子)を頻繁に行うと、一時的な文字列オブジェクトが大量に生成されます。

StringBuilderを使うことで、メモリの無駄な生成を防げます。

また、foreachループは、配列やListに対して使用するとボックス化が発生する可能性があります。

forループを使うことで、ボックス化を避けられます。

LINQクエリも、メモリを消費する可能性があるため、頻繁に使用する場合は注意が必要です。

ゲーム制作をゼロから学びたいあなたへ
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる

よくあるパフォーマンスボトルネックと対策

よくあるパフォーマンスボトルネックと対策

よくあるパフォーマンスボトルネックと対策を解説します。
これらの対策により、パフォーマンスを向上させられます。

Update関数の最適化

Update関数で重い処理を実行している場合、パフォーマンスが低下します。

必要な場合のみ実行するように条件分岐を追加したり、処理頻度を下げたりすることで最適化できます。

Update関数内の処理を最小限にすることで、CPU負荷を減らせます。

Update関数内で重い処理を実行する場合は、コルーチンやInvokeRepeatingを使うことを検討しましょう。

コルーチンを使うことで、処理を複数のフレームに分散させられます。

InvokeRepeatingを使うことで、一定間隔で処理を実行できます。

目安として、Update関数内の処理は1フレームで0.1ms以下を目指すのが理想です。

0.5msを超える場合は、最適化を検討すべきでしょう。

物理演算の最適化

物理演算もパフォーマンスに影響します。

必要のないColliderを削除したり、Rigidbodyの数を減らしたりすることで最適化できます。

また、物理演算の更新頻度を下げることも有効です。

Fixed Timestepを調整することで、物理演算の更新頻度を変更できます。

デフォルトは0.02秒(50Hz)ですが、0.033秒(30Hz)に変更することで、負荷を軽減できます。

ただし、物理演算の精度が下がるため、調整には注意が必要です。

Colliderの種類も、パフォーマンスに影響します。

BoxColliderとSphereColliderは最も軽く、MeshColliderは重いです。

可能な限り、BoxColliderやSphereColliderを使うことをおすすめします。

Convex MeshColliderは、Non-Convex MeshColliderよりも軽いため、必要に応じて使用を検討しましょう。

AI処理の最適化

敵AIの処理も、パフォーマンスに影響します。

NavMeshの計算は重いため、毎フレーム更新するのではなく、一定間隔で更新することをおすすめします。

目安として、0.5秒〜1秒間隔で更新するのが良いでしょう。

また、画面外の敵のAI処理を停止することで、パフォーマンスを向上させられます。

カメラの視界外にある敵は、必要最小限の処理のみ実行するようにしましょう。

ゲーム制作をゼロから学びたいあなたへ
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる

Unity FPS最適化でよくある失敗5選と解決方法

Unity FPS最適化でよくある失敗5選と解決方法

Unity FPS最適化で、初心者が陥りやすい失敗があります。
ここでは、5つのよくある失敗と解決方法を紹介します。

失敗1:問題箇所を特定せずに最適化する

よくある失敗

  • 問題箇所を特定せずに最適化しようとする
  • Profilerを使わずに推測で最適化する
  • 優先順位をつけずに最適化する

推測で最適化すると、効果のない箇所に時間を費やすことになります。

Profilerを使って、実際に問題になっている箇所を特定することが重要です。

CPU UsageやGPU Usageのグラフを確認し、負荷が高い箇所を見つけましょう。

Deep Profileを有効にすると、より詳細な情報を確認できます。

正しいアプローチ

  • Profilerで問題箇所を特定する
  • 優先順位をつけて最適化する
  • 最適化の効果を測定する

失敗2:一度に全部を最適化しようとする

一度に全部を最適化しようとすると、時間がかかりすぎたり、かえってパフォーマンスが悪化したりする可能性があります。

最適化は、優先順位をつけて、段階的に進めることが重要です。

解決方法

  • 優先順位をつけて、重要な箇所から最適化する
  • 最適化の効果を測定しながら進める
  • 段階的に最適化していく

失敗3:DrawCallを減らそうとしてマテリアルを統合しすぎる

DrawCallを減らすために、無理にマテリアルを統合すると、メモリ使用量が増加する可能性があります。

また、マテリアルを統合すると、個別の調整が難しくなります。

適切なバランスを見つけることが重要です。

目安として、マテリアルは10個以下を目指すのが良いでしょう。

ただし、機能性を損なわない範囲で調整することが大切です。

失敗4:LODを設定せずに高ポリゴンモデルを使用する

高ポリゴンモデルをそのまま使用すると、遠くから見ても同じポリゴン数を描画することになり、無駄です。

LODを設定することで、距離に応じてポリゴン数を減らせます。

LOD0(近距離)は元のモデル、LOD1(中距離)はポリゴン数を50%に、LOD2(遠距離)は25%にするのが一般的です。

LODを設定することで、DrawCallを削減し、パフォーマンスを向上させられます。

失敗5:ガベージコレクションを考慮しない

頻繁にオブジェクトを生成・削除すると、ガベージコレクションが発生し、フレームレートが一時的に低下します。

オブジェクトプーリングを使うことで、ガベージコレクションの発生を減らせます。

また、文字列の連結を頻繁に行うと、一時的な文字列オブジェクトが生成され、ガベージコレクションが発生します。

StringBuilderを使うことで、メモリの無駄な生成を防げます。

ゲーム制作をゼロから学びたいあなたへ
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる

実用的な最適化作業完成までの4ステップ

実用的な最適化作業完成までの4ステップ

最適化作業完成までの4ステップ
  • STEP1
    問題箇所の特定(所要1時間)

    Profilerを使って、パフォーマンス問題の箇所を特定する。
    CPU UsageやGPU Usageのグラフを確認し、負荷が高い箇所を見つける。
    Deep Profileを有効にすると、より詳細な情報を確認できる。
    学べること:Profilerの使い方、パフォーマンス測定
    成果物:問題箇所が特定された状態
  • STEP2
    優先順位の決定(所要30分)

    問題箇所に優先順位をつけて、最適化の順序を決める。
    CPU負荷が高い箇所を最優先にし、次にGPU負荷が高い箇所を最適化する。
    メモリ使用量の問題は、最後に取り組む。
    学べること:優先順位付け、最適化計画
    成果物:最適化の優先順位が決まった状態
  • STEP3
    最適化の実施(所要2時間)

    優先順位に従って、最適化を実施する。
    オブジェクトプーリング、描画処理の最適化、物理演算の最適化などを実施する。
    最適化の効果を定期的に測定しながら進める。
    学べること:最適化テクニック、パフォーマンス改善
    成果物:最適化が実施された状態
  • STEP4
    効果の測定(所要30分)

    最適化の効果を測定し、必要に応じて追加の最適化を行う。
    Profilerを使って、最適化前後のパフォーマンスを比較する。
    目標のフレームレート(60FPS)を達成できているか確認する。
    学べること:パフォーマンス測定、効果検証
    成果物:実用的な最適化が完成した状態

合計4時間で、実用的な最適化作業が完成します。

ただし、プロジェクトの規模によっては、さらに時間がかかる可能性があります。

焦らず、段階的に進めることが大切です。

最適化チェックリスト

最適化を実施する際は、以下のチェックリストを参考にしてください。

最適化チェックリスト

  • DrawCall:100以下になっているか
  • Frame Time:16.67ms以下(60FPS)を達成できているか
  • Update関数:重い処理がないか確認したか
  • オブジェクトプーリング:頻繁に生成・削除されるオブジェクトに適用したか
  • LOD:高ポリゴンモデルに設定したか
  • 物理演算:不要なColliderを削除したか
  • メモリ:ガベージコレクションが頻繁に発生していないか
ゲーム制作をゼロから学びたいあなたへ
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
ゲームを「遊ぶ側」から「作る側」へ

あなたのオリジナルゲーム、今年こそ完成させませんか?

RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。

Unity入門の森|永久会員チケット

永久会員チケット|Unity入門の森

全講座ラインナップを見てみる

実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。

まとめ

Unity FPSが重いときに見るべき所まとめ

Unity FPSが重い場合は、問題箇所を特定してから最適化することが重要です。

Profilerを使って、実際に問題になっている箇所を特定し、優先順位をつけて最適化を進めましょう。

適切な最適化により、パフォーマンスを大幅に向上させることができるでしょう。

ただし、最適化は段階的に進めることが大切です。

一度に全部を最適化しようとせず、重要な箇所から順に取り組んでいきましょう。

記事の要点まとめ

  • パフォーマンス問題:CPU負荷、GPU負荷、メモリ使用量
  • パフォーマンス指標:Frame Time 16.67ms以下、DrawCall 100以下など
  • 最適化テクニック:オブジェクトプーリング、描画処理の最適化、メモリ管理
  • ボトルネック対策:Update関数、物理演算、AI処理の最適化
  • よくある失敗5選:問題箇所の特定不足、一度に全部最適化、DrawCallの削減しすぎなど
  • 実用的な最適化:4ステップで完成(合計4時間)

今日から始める3ステップ

  1. STEP1:Profilerで問題箇所を特定する(所要1時間)
  2. STEP2:優先順位を決めて最適化する(所要30分)
  3. STEP3:最適化を実施する(所要2時間)

あなたのペースで、少しずつ進めていけば大丈夫です。

最適化は、一朝一夕にはできませんが、段階的に進めることで、必ずパフォーマンスを向上させられます。

焦らず、着実に取り組んでいきましょう。

ゲーム制作をゼロから学びたいあなたへ
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる

コメント

タイトルとURLをコピーしました