Version: 2022.2
言語: 日本語
Memory in Unity WebGL
Interaction with browser scripting

WebGLのキャッシュ動作

Unity WebGL では、Cache API を使用して .data ファイルや AssetBundle にキャッシュされたアセットデータをブラウザーキャッシュ内に保存できます。最大ファイルサイズ、キャッシュ全体の最大サイズ、削除基準などのブラウザーキャッシュのストレージ制限は、使用しているブラウザーとプラットフォームに依存します。詳細については、ブラウザーのストレージ制限と削除基準 を参照してください。

データキャッシング

Data Caching にアクセスするには、Publishing Settings (File > Build Settings > Player Settings > WebGL > Publishing Settings) を開きます。これにより、ブラウザーはメインデータファイルを IndexedDB データベースにキャッシュすることができます。

ブラウザーのデフォルトの HTTP キャッシュを使用しても、ブラウザーが特定のレスポンスをキャッシュすることを保証するものではありません。これは、ブラウザーの HTTP キャッシュの容量が限られており、大きすぎるファイルをキャッシュできない可能性があるためです。

ロードの速度を向上させるために、IndexedDB ではブラウザーの制限を超えるファイルをキャッシュすることができます。より多くのファイルをキャッシュすると、ダウンロードしたコンテンツが次回のビルド実行時にユーザーのマシンで利用可能になる可能性が高まります。

データキャッシングは、HTTP 応答用に IndexedDB キャッシュの .data ファイルのみをキャッシュします。AssetBundle をキャッシュするには、データキャッシュを有効にして、 unityInstance.Module.cacheControl() をオーバーライドする必要があります。\ nこれを行うには、Module.cacheControl(url) が要求された AssetBundleURL に対して must-revalidate を返すことを確認してください。例えば、createUnityInstance() が返す Promise のフルフィルメントコールバックで unityInstance.Module.cacheControl() 関数をオーバーライドできます。 createUnityInstance() の詳細については、WebGL アプリケーションのデプロイ を参照してください。

WebGL キャッシュ動作のカスタマイズ

デフォルトでは、WebGL キャッシュはアセットデータファイル .data と AssetBundle ファイル .bundle を保存し、キャッシュからロードする前にそれらを再検証します。この動作は、UnityLoader 設定を変更する新しい WebGL テンプレート を加えることで変更できます。

以下の例では、index.html ファイル内の UnityLoader 設定にカスタムの cacheControl 関数を加える例を示しています。

var config = {
   // ...
# if USE_DATA_CACHING
   cacheControl: function (url) {
     // Caching enabled for .data and .bundle files.
     // Revalidate if file is up to date before loading from cache
     if (url.match(/\\.data/) || url.match(/\\.bundle/)) {
         return "must-revalidate";
     }

     // Caching enabled for .mp4 and .custom files
     // Load file from cache without revalidation.
     if (url.match(/\\.mp4/) || url.match(/\\.custom/)) {
         return "immutable";
     }
 
     // Disable explicit caching for all other files.
     // Note: the default browser cache may cache them anyway.
     return "no-store";
   },
# endif
   // ...
}

cacheControl 関数は、リクエストの url をパラメーターとして受け取り、以下のいずれかを返します。

  • must-revalidate - この関数が must-revalidate を返す場合、キャッシュは有効な状態に戻り、ファイルはキャッシュからロードされる前に再検証されます。

  • immutable - この関数が immutable を返す場合、キャッシュが有効になり、再検証なしでキャッシュからファイルがロードされます。

  • no-store - この関数が no-store を返す場合、キャッシュは無効になります。

ブラウザーは、.html、.js、.css、.json、.jpg、.png などの特定のファイルタイプを自動的に保存 (キャッシュ) します。そのため、WebGL キャッシュに明示的に保存する必要はありません。WebGL キャッシュの典型的な候補は、サイズの大きなファイルやカスタムファイル形式を使用するファイルなどです。

Memory in Unity WebGL
Interaction with browser scripting