2012-04-07 75 views
3

我正在为HTML5中的一个简单的面向对象游戏引擎构建资产加载器。现在我知道了制作资产加载器的两种方法(下面总结),我更喜欢第二种方法。我的问题是,保证所有浏览器始终都能正常工作的第二种方式?制作HTML5 AssetLoader,浏览器是否总是缓存图片?

为清楚:

  • 类的有问题的名字是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去。


为什么我喜欢的方式2
1)我想避免引入抽象的不必要的层到发动机,我不希望要经过AssetLoader每次我要加载的资产。
2.)如果我在游戏中有很多资产,我不希望它们全部同时加载到AssetLoader的单个实例中。也许有人可以纠正我,但不会一次加载所有这些资源不必要地使游戏变得紧张?


所以现在我有方法2 here的工作版本和很大部分喜欢它,但我需要知道的是:“是保证使用方法有两个总是缓存给定的图像浏览器?”还是我不能依赖的东西?是否有某些配置可以关闭自动缓存? (这甚至有可能吗?)。你有没有其他方法你认为更好?非常感谢您的时间!

回答

2

我不认为你可以依靠浏览器缓存。可以禁用自动缓存,我想这对于人们来说是相当普遍的。

我正是这种做,在过去的原因有两个:

由家庭共享一台计算机上
  1. 低的磁盘空间(多个独立账户)
  2. 开发时,为了确保页面刷新时总是可以看到最新更改

此外,Chrome/Firefox的隐身/隐私浏览模式中禁用缓存。

+0

aah谢谢你,增加清晰度,我怀疑同样的事情,但不想只是采取疯狂的猜测,并可能在后来承受后果。 – 2012-05-05 03:54:01