checkout this space shooter demo。
HTML5音频在Chrome 18和Firefox 10上是完美的。播放声音没有滞后,每个样本都能完美播放。上一次我尝试使用HTML5音频和JavaScript播放声音时,我无法播放多次声音。
Scirra正在做什么魔术来使它如此完美?
最佳答案
我是Construct 2的开发人员,所以我希望我有足够的能力回答您的问题:)
HTML5音频确实是一团糟,所以我花了很长的时间来尝试使其在Construct 2中成为防弹产品。这是我所做工作的概述:
使用Web音频API
HTML5音频似乎是为流音乐而设计的,因此HTML5音频对象属于重量级对象。像Space Blaster一样,每秒播放10个声音可以轻松捕获浏览器。另一方面,Web Audio API是具有路由,效果和轻量声音回放的高性能音频引擎。非常适合游戏。音频缓冲区和音频播放是分开的,因此您可以拥有一个数据缓冲区并同时高效地播放多次,而某些浏览器如果多次播放HTML5声音,则会出现很多错误,因此每次都会重新下载!由于它实际上是为游戏等设计的,因此您可以快乐地播放数吨的声音,而且声音仍然会很好地嗡嗡作响。它也可以使用HTML5音频作为声音源,尽管我仅将HTML5音频用于用户指定为音乐曲目的内容(因为这是您希望进行流处理的位置-通常,Web Audio API中的所有其他内容在下载之前就已全部下载完毕)播放)。
Chrome支持Web Audio API,并且已将其添加到iOS 6+中(尽管在您尝试在触摸事件中播放一些音频之前将其静音),Firefox正在支持该功能,并且应该很快会在Chrome for安卓因此,在这些平台上,音频将更加可靠。
有关HTML5Rocks和the proposed spec的更多信息-您现在必须使用该规范作为文档,这里没有太多其他信息了。
其他浏览器:实现音频回收系统
尚未在所有地方都支持Web Audio API,尤其是IE,这意味着您仍然需要将HTML5音频压缩到可能对游戏有用的东西,以实现向后兼容。执行此操作的方法是回收音频对象。
太空霸王中玩家的激光每秒发射10次-这还不包括任何其他音效!正如我之前提到的,音频是一种重量级的对象,因此,如果每秒执行new Audio()
10次以上,瞧瞧,浏览器最终会死机,音频开始出现故障。但是,您可以通过回收来大大减少创建的音频对象的数量。
基本上,对于每种声音效果,请保留以该声音作为来源创建的每个Audio对象的缓存。然后,在播放新声音时,在缓存中搜索已完成播放的声音效果(ended
属性为true)。如果找到一个,则将其倒带到开头(currentTime = 0
),然后再次将其还原为play()
。否则,在缓存中创建一个new Audio()
对象。
由于播放器的激光音效很短,因此它不会每分钟创建600个音频对象,而是只会循环3个或4个。不幸的是,某些浏览器仍然会下载4次(我最后一次检查了Safari!),或者在第一次播放每个声音缓冲区时都有较高的延迟,但是由于总是重复使用相同的缓冲区,最终浏览器赶上了。因此,声音可能会有些奇怪,然后消失。我们还使用HTML5应用程序缓存,因此下次您播放磁盘上的所有内容时,后续播放应立即表现良好。
基本上就是这样。在使用HTML5音频进行首次播放时仍然有些疑惑,但是在此之后的每次浏览都应该相当可靠,只要浏览器具有健全的音频实现。有很多方法可以克隆Audio对象,但是我发现倒带现有Audio效果最好。
由于我们将纯HTML5视为重点,因此根本没有SoundManager或任何基于Flash /插件的回退。
我们还支持PhoneGap和appMobi为移动设备提供的音频API,因为移动设备上的HTML5音频甚至都不值得尝试。这总共使我们的音频引擎包装了四个音频API,是的,它的确看起来像是一个科学怪人,但它确实有效。
而已。我想我们的竞争对手会读这篇文章,但是谁会在乎何时有SO代表??? !!! 1111
关于html - Scirra是如何在Construct 2中获得如此完美的HTML5音频的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9553415/