制作HTML5 AssetLoader,浏览器是否总是缓存图像?

时间:2012-04-07 06:06:06

标签: html5 caching assets

我正在为HTML5中的简单面向对象的游戏引擎构建资源加载器。现在我知道有两种方法来制作资产加载器(总结如下),我更喜欢第二种方法。我的问题是,第二种方式是否保证始终适用于所有浏览器?

为清楚起见:

  • 相关课程的名称是AssetLoader,
  • 加载所有资产的方法称为loadAssets(),
  • 主要类是Game,
  • 主游戏循环是runGameloop()。

方法1

创建一个AssetLoader实例,该实例将在整个游戏中持续存在。当在游戏开始时调用loadAssets()时,它将创建一个字典,用于在游戏时间内保存所有资产的键/值对。

当一个精灵需要一个图像时,它会查询具有给定名称的AssetLoader(例如“Archer”),并且该实例将返回适当的图像供该精灵使用。

方法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";
    }

    ...

}


现在每当精灵需要一个图像时,该图像现在应该被缓存在浏览器中,它只是使用一个新的Image()对象加载它而不通过AssetLoader。


为什么我更喜欢方法2
1.)我想避免向引擎引入不必要的抽象层,我不想每次想要加载资产时都要通过AssetLoader。
2.)如果我在游戏中有很多资产,我不希望它们全部同时加载到AssetLoader的单个实例中。也许有人可以纠正我,但不会一次性加载所有这些资源会对游戏产生不必要的压力吗?


所以现在我有一个方法2 here的工作版本,我很满意它,但我需要知道的是:“浏览器是否保证始终使用方法二缓存给定图像?”< / strong>还是我不能依赖的东西?是否存在可能关闭自动缓存的某些配置? (这甚至可能吗?)。你有其他任何你认为更好的方法吗?非常感谢您的时间!

1 个答案:

答案 0 :(得分:2)

我认为你不能依赖浏览器缓存。可以禁用自动缓存,我想人们这样做是相当普遍的。

我过去做过这个有两个原因:

  1. 家庭共享的计算机上的磁盘空间不足(多个独立帐户)
  2. 开发时,为确保在页面刷新时始终可见最新更改
  3. 此外,在Chrome / Firefox的隐身/隐私浏览模式下禁用了缓存。