Manuals
Manuals




This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English

リソース管理

非常に小さなゲームを制作する場合、対象プラットフォームの制限(メモリ占有量、バンドル(bundle)のサイズ、処理能力、バッテリー消費)が問題になることは一度もないかもしれません。しかし、より大きなゲームを制作する場合、特に携帯デバイスでは、メモリ消費量が最大の制約の1つになる可能性が高いです。経験豊富なチームは、プラットフォームの制約に合わせて、リソース(resource)の使用量の上限を慎重に定めます。Defold には、メモリとバンドルサイズの管理に役立つさまざまな機能があります。このマニュアルでは、これらの機能の概要を説明します。

静的なリソースツリー

Defold でゲームをビルドするときは、リソースツリー(resource tree)を静的に宣言します。ゲームのすべての部分は、起動時に読み込まれるブートストラップコレクション(bootstrap collection、通常は「main.collection」)を起点とするツリーに結び付けられます。リソースツリーはすべての参照をたどり、それらの参照に関連するすべてのリソースを含みます。

  • ゲームオブジェクト(game object)とコンポーネント(component)のデータ(アトラス、サウンドなど)。
  • ファクトリー(factory)コンポーネントのプロトタイプ(prototype)。対象はゲームオブジェクトとコレクション(collection)です。
  • コレクションプロキシ(collection proxy)コンポーネントの参照先(コレクション)。
  • game.project で宣言したカスタムリソース(custom resource)

リソースツリー

Defold には、バンドルリソース(bundle resource)という概念もあります。バンドルリソースはアプリケーションバンドルに含まれますが、リソースツリーには含まれません。バンドルリソースには、プラットフォーム固有の補助ファイルから、ファイルシステムから読み込んでゲームで使用する外部ファイル(たとえば FMOD のサウンドバンク)まで、あらゆるファイルを使用できます。

ゲームの バンドルを作成する ときは、リソースツリー内のものだけが含まれます。ツリー内で参照されていないものはすべて除外されます。バンドルに含めるものと除外するものを手動で選択する必要はありません。

ゲームを 実行する と、エンジンはツリーの起点であるブートストラップから、次のリソースをメモリに読み込みます。

  • 参照されているすべてのコレクションとその内容。
  • ゲームオブジェクトとコンポーネントのデータ。
  • ファクトリーコンポーネントのプロトタイプ(ゲームオブジェクトとコレクション)。

ただし、次の種類の参照先リソースは、実行時にエンジンによって自動的に読み込まれません。

  • コレクションプロキシを介して参照されるゲームワールド(game world)のコレクション。ゲームワールドは比較的大きいため、コードから手動で読み込みとアンロードを開始する必要があります。詳細はコレクションプロキシのマニュアルを参照してください。
  • game.projectCustom Resources 設定で追加したファイル。これらのファイルは、sys.load_resource() 関数を使用して手動で読み込みます。

Defold の標準的なリソースのバンドル作成と読み込みの動作を変更すると、リソースをメモリに読み込む方法とタイミングを細かく制御できます。

リソースの読み込み

ファクトリーのリソースの動的な読み込み

ファクトリーコンポーネントが参照するリソースは、通常、そのコンポーネントの読み込み時にメモリに読み込まれます。これにより、ランタイムにファクトリーが存在するとすぐに、それらのリソースをゲーム内に生成できる状態になります。この標準動作を変更してファクトリーのリソースの読み込みを遅らせるには、ファクトリーの Load Dynamically チェックボックスをオンにするだけです。

動的な読み込み

このチェックボックスをオンにすると、参照先のリソースは引き続きゲームのバンドルに含まれますが、エンジンはファクトリーのリソースを自動的には読み込みません。代わりに、次の2つの方法を使用できます。

  1. オブジェクトを生成したいときに、factory.create() または collectionfactory.create() を呼び出します。これにより、リソースが同期的に読み込まれてから、新しいインスタンスが生成されます。
  2. factory.load() または collectionfactory.load() を呼び出して、リソースを非同期的に読み込みます。リソースが生成可能な状態になると、コールバックが呼び出されます。

この仕組みの詳細は、ファクトリーのマニュアルコレクションファクトリー(collection factory)のマニュアルを参照してください。

動的に読み込んだリソースのアンロード

Defold は、すべてのリソースの参照カウントを保持しています。あるリソースのカウントがゼロになった場合、そのリソースを参照しているものがなくなったことを意味します。そのリソースはメモリから自動的にアンロードされます。たとえば、ファクトリーで生成したすべてのオブジェクトを削除し、さらにファクトリーコンポーネントを持つオブジェクトも削除すると、それまでファクトリーが参照していたリソースがメモリからアンロードされます。

Load Dynamically をオンにしたファクトリーでは、factory.unload() または collectionfactory.unload() 関数を呼び出せます。この呼び出しにより、ファクトリーコンポーネントからそのリソースへの参照が削除されます。そのリソースをほかに参照しているものがなければ(たとえば、生成したすべてのオブジェクトを削除していれば)、リソースはメモリからアンロードされます。

バンドルからのリソースの除外

コレクションプロキシでは、コンポーネントが参照するすべてのリソースを、バンドル作成の対象から除外できます。これは、バンドルサイズを最小限に抑える必要がある場合に役立ちます。たとえば、HTML5 としてウェブ上でゲームを実行する場合、ブラウザーはゲームを実行する前にバンドル全体をダウンロードします。

除外

コレクションプロキシの Exclude をオンにすると、参照先のリソースがゲームのバンドルから除外されます。代わりに、除外したコレクションを選択したクラウドストレージに保存できます。この機能の仕組みは、Live Update のマニュアルで説明しています。