3

HTML5で単純なオブジェクト指向ゲームエンジン用のアセットローダーを構築しています。現在、アセットローダーを作成する2つの方法(以下に要約)を知っており、2番目のアプローチを好みます。私の質問は、2番目の方法が常にすべてのブラウザで機能することが保証されているかどうかです。

明確にするために:

  • 問題のクラスの名前はAssetLoaderで、
  • すべてのアセットをロードするメソッドはloadAssets()と呼ばれます。
  • メインクラスはゲームです、
  • メインのゲームループはrunGameloop()です。

アプローチ1

ゲーム全体を通して持続するAssetLoaderのインスタンスを作成します。ゲームの開始時にloadAssets()が呼び出されると、プレイ時間中、すべてのアセットのキーと値のペアを保持する辞書が作成されます。

スプライトが画像を必要とする場合、指定された名前(「Archer」など)でAssetLoaderにクエリを実行し、インスタンスはスプライトが使用する適切な画像を返します。

アプローチ2

ゲーム全体で持続しないAssetLoaderのインスタンスを作成します(一度呼び出され、インスタンス変数に割り当てられません)。

インスタンスの責任は、ブラウザにアセットをキャッシュさせる各アセットについてサーバーにクエリを実行することです。よく似ています:

function AssetLoader()
{

    ...

    self.loadAssets = function(runGameloop)
    {
        self.tempImage = new Image();

        $(self.tempImage).load(function()
        {
            self.assetsLoadedSoFar += 1;
            if(self.assetsLoadedSoFar === self.totalAssets)
            {
                self.runGameloop();
            }
        });

        self.tempImage.src = "assets/sprites/archer/archerSpriteSheet.png";
    }

    ...

}


これで、スプライトが画像を必要とするときはいつでも、その画像をブラウザにキャッシュする必要があり、AssetLoaderを経由せずに新しいImage()オブジェクトをロードするだけです。


アプローチ2を好む理由
1.)エンジンに不要な抽象化レイヤーを導入することを避けたいので、アセットをロードするたびにAssetLoaderを通過する必要はありません。
2.)ゲームにたくさんのアセットがある場合、それらすべてをAssetLoaderの単一のインスタンスに同時にロードしたくありません。おそらく誰かが私を修正することができますが、それらのすべてのリソースを一度にロードすることで、ゲームに不必要な負担をかけることはありませんか?


そのため、現在、アプローチ2の動作バージョンがあり、ほとんど満足していますが、知っておく必要があるのは、「ブラウザーは、アプローチ2を使用して特定の画像を常にキャッシュすることが保証されているか」です。それとも私が頼りにできないものですか?自動キャッシュがオフになる可能性のある特定の構成はありますか?(それも可能ですか?)他に良いと思うアプローチはありますか?お時間をいただき、ありがとうございました!

4

1 に答える 1

2

ブラウザのキャッシュに頼ることはできないと思います。自動キャッシュを無効にすることは可能であり、人々がそれを行うことはかなり一般的だと思います。

私は過去に2つの理由でこれを正確に行いました:

  1. 家族が共有するコンピューターのディスク容量が少ない(複数の個別のアカウント)
  2. 開発時に、最新の変更がページの更新時に常に表示されるようにするため

また、Chrome/Firefoxのシークレット/プライベートブラウジングモードではキャッシュが無効になっています。

于 2012-05-04T12:30:49.490 に答える