Unity を検索

Unity 2021 LTS でメモリの使い方をカスタマイズする

2022年4月20日 カテゴリ: Engine & platform | 6 分 で読めます
In-editor game footage with a giant frog
In-editor game footage with a giant frog
シェア

大規模なプロジェクトに取り組むゲームスタジオのために、Unity を改善することも私たちの優先事項の 1 つです。この取り組みの一環として、Unity 2021 LTS では、メモリの割り当て方法をカスタマイズすることができるようになりました。

残りの部分で、Unity におけるメモリ管理の仕組み、メモリ割り当てに関連するパフォーマンスの問題の診断方法、これらの問題を解決するための設定とその使用方法について解説いたします。

メモリアロケーターのカスタマイズとは何か

Unity は、アプリケーションのメモリを扱うために、3 つのメモリ管理レイヤーを使用します。

  • マネージドメモリ
  • C# アンマネージドメモリ
  • ネイティブメモリ

内部的には、Unity はアロケーターと呼ばれる、ネイティブメモリを割り当てるためのさまざまな仕組みを持っています。このブログ記事では、次の 2 つに焦点を当てます。

  • バケットアロケーター:同様のサイズの小さなアロケーションをメモリの共有ブロックにグループ化する。一般に非常に高速で広く利用されていますが、ハードコーディングされているため、サイズに限界があります。
  • 動的ヒープアロケーター:これは、Unity のネイティブメモリ割り当ての大部分に対応するための汎用のアロケーターです。ただし、さまざまなケースを扱うため、バケットアロケーターよりも低速です。

メモリ管理システムに新しいメモリを要求するとき、まずサイズをチェックします。ある閾値より小さければ、バケットアロケーターにメモリの確保を依頼します。バケットアロケーターが一杯になっても、やはりどこかからメモリを割り当てる必要があります。これらの小さな割り当ては動的ヒープアロケーターから行うことになります。動的ヒープアロケーターにフォールバックすると遅くなり、動的ヒープに小さな割り当てをたくさん追加すると、動的ヒープの断片化が進みます。

メモリのカスタマイズが Nintendo Switch での『Ori』の出荷にどう貢献したか

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 フォーラムに参加して、プロジェクトのパフォーマンス分析、改善、開発中に直面した課題などを共有してください。

2022年4月20日 カテゴリ: Engine & platform | 6 分 で読めます
関連する投稿