我是Construct 2的开发者,所以我希望我有足够的资格回答你的问题:)
HTML5 音频确实是一团糟,所以我已经竭尽全力尝试使其在 Construct 2 中变得无懈可击。以下是我所做工作的概要:
使用网络音频 API
HTML5 音频似乎是为流媒体音乐而设计的,因此 HTML5 音频对象是一种重量级对象。像 Space Blaster 那样每秒播放 10 个声音很容易占用浏览器。另一方面,Web Audio API 是一个具有路由、效果和轻量级声音播放的高性能音频引擎。它非常适合游戏。音频缓冲区和音频播放是分开的,因此您可以拥有一个数据缓冲区并有效地同时播放多次,而某些浏览器如果您播放 HTML5 声音几次就会出现故障,每次都重新下载!由于它实际上是为游戏等设计的,因此您可以愉快地播放数吨的声音,而且它仍然会很好地哼唱。它还可以使用 HTML5 音频作为声源,尽管我只将 HTML5 音频用于用户指定为音乐曲目的内容(因为这是您更喜欢流式传输的地方 - 通常 Web 音频 API 中的所有其他内容之前都已完全下载播放)。
Chrome 支持 Web Audio API,iOS 6+ 也支持(尽管在您尝试在触摸事件中播放一些音频之前它会静音),Firefox 正在努力支持,应该很快就会推出到 Android 版 Chrome。因此,在这些平台上,音频会更加可靠。
有关HTML5Rocks 和the proposed spec 的更多信息 - 您现在必须使用规范作为文档,没有其他内容了。
其他浏览器:实现音频回收系统
Web Audio API 尚未在所有地方都得到支持,尤其是 IE,这意味着您仍然需要将 HTML5 音频插入到可能适用于游戏的东西中以实现向后兼容性。这样做的方法是回收音频对象。
Space Blaster 中玩家的激光每秒发射 10 次 - 这还不包括任何其他音效!正如我之前提到的,音频是一种重量级的对象,所以如果你每秒执行 10 次以上new Audio(),你瞧,浏览器最终会死掉,音频开始出现故障。但是,您可以通过回收它们来大大减少创建的音频对象的数量。
基本上,对于每个声音效果,都为您以该声音作为源创建的每个音频对象保留一个缓存。然后,在播放新声音时,在缓存中搜索所有已播放完毕的音效(ended 属性将为真)。如果您找到了,请将其倒回到开头 (currentTime = 0) 和 play()。否则,在缓存中创建一个new Audio() 对象。
由于播放器的激光音效很短,而不是每分钟创建 600 个音频对象,它只会循环循环 3 或 4 个。不幸的是,一些浏览器仍然会下载 4 次(Safari 上次我检查过!)或者在每个声音缓冲区播放时第一次有很高的延迟,但最终浏览器会赶上,因为总是相同的缓冲区被重用。所以基本上声音可能会有点奇怪一会儿,然后就消失了。我们还使用 HTML5 应用缓存,因此下次您播放所有内容时从磁盘加载,因此后续播放应该立即执行良好。
基本上就是这样。在第一次播放 HTML5 音频时它仍然有点狡猾,但之后每次都应该相当可靠,只要浏览器有一个健全的音频实现。尝试克隆音频对象的方法有很多种,但我发现倒带现有音频效果最好。
因为我们强调纯 HTML5,所以根本没有 SoundManager 或任何基于 Flash/插件的后备。
我们还支持 PhoneGap 和 appMobi 为移动设备提供的音频 API,因为移动设备上的 HTML5 音频甚至不值得尝试。这使得我们的音频引擎总共封装了四个音频 API,是的,它看起来确实像一个科学怪人的烂摊子,但它确实有效。
就是这样。我想我们的竞争对手会读到这个,但谁在乎什么时候有 SO 代表呢???!!!1111