残りの部分で、Unity におけるメモリ管理の仕組み、メモリ割り当てに関連するパフォーマンスの問題の診断方法、これらの問題を解決するための設定とその使用方法について解説いたします。
Unity は、アプリケーションのメモリを扱うために、3 つのメモリ管理レイヤーを使用します。
内部的には、Unity はアロケーターと呼ばれる、ネイティブメモリを割り当てるためのさまざまな仕組みを持っています。このブログ記事では、次の 2 つに焦点を当てます。
メモリ管理システムに新しいメモリを要求するとき、まずサイズをチェックします。ある閾値より小さければ、バケットアロケーターにメモリの確保を依頼します。バケットアロケーターが一杯になっても、やはりどこかからメモリを割り当てる必要があります。これらの小さな割り当ては動的ヒープアロケーターから行うことになります。動的ヒープアロケーターにフォールバックすると遅くなり、動的ヒープに小さな割り当てをたくさん追加すると、動的ヒープの断片化が進みます。
2020 年夏、Moon Studios が『Ori and the Will of the Wisp』を Nintendo Switch に移植する作業を行っていた際、Unity がサポートを提供しました。このターゲットプラットフォームのために、どのように協力してプロジェクトを拡大したかについては、このケーススタディで詳しく説明されています。
Moon Studios と Unity Accelerate Solutions(旧 Unity Professional Services)は、コードの一部を協力して分析し、パーティクルシステムを微調整してメモリ使用量を削減する方法を見出しました。「Nintendo Switch で 60fps を狙う場合、シミュレーション、ストリーミング、レンダリング、グラフィックスなど、あらゆる面で最適化する必要があります」と、スタジオ創設者の Gennadiy Korol 氏は語ります。
『Ori and the Will of the Wisps』では、メモリの使用に関して、Nintendo Switch の性能を引き出すためにかなりの労力がつぎ込まれています。Accelerate Solutions チームは、Moon Studios がこれらのレイヤーの性能を最大限引き出せるように、ネイティブメモリの割り当てに焦点を当てました。
Moon Studios チームと協力し、Unity のチームはさまざまなアロケーターからの割り当て数を計測しました。また、それぞれのアロケーターから割り当てられたメモリの量も調べたところ、ゲームプレイを開始する前にバケットアロケーターのいくつかがいっぱいになっていることがわかりました。
バケットアロケーターのサイズを大きくすることで、ゲームをプレイする際に発生する小さな割り当てに余裕を持たせることができました。バケットアロケーターからこれらの小さなブロックを割り当てることで、ゲームのパフォーマンスが大きく向上し、目標としていた 60fps を達成することができました。小さな割り当てが動的ヒープアロケーターから行われないようになり、動的ヒープアロケーターには大きなメモリブロックだけが格納されるようになりました。こうするとアロケーターの断片化も起こりにくくなるので、ゲームをより長くスムーズに動作させることができます。
Moon Studios とのコラボレーションに続き、Accelerate Solutions チームは Optimization チームと連携し、Unity 2021 LTS で利用可能になったメモリアロケーターのカスタマイズ機能を開発しました。
Unity 2021 LTS 以前は、メモリのバランシング設定に Unity ユーザーにはアクセスできませんでしたが、Unity 2021 LTS から、ユーザーもメモリのバランシング設定にアクセスできるようになり、ゲームにとって最高の形でメモリを活用できるようになりました。さまざまなアロケーターが使用するメモリ量を測定し、ゲームに合わせてそのサイズをカスタマイズします。詳細はドキュメントをご覧ください。そして使ってみた際の体験をぜひご共有ください。Unity フォーラムに参加して、プロジェクトのパフォーマンス分析、改善、開発中に直面した課題などを共有してください。
Is this article helpful for you?
Thank you for your feedback!