html - Scirra是如何在Construct 2中获得如此完美的HTML5音频的?

标签 html audio html5-audio construct-2

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安卓因此,在这些平台上,音频将更加可靠。

有关HTML5Rocksthe 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/

相关文章:

javascript - 如何使用 javascript 从 DIV 中获取选定的文本(适用于 IE7-8)?

html - 如何重新创建导航动画

c# - 如何在 C# 中播放 MP3 流

java - Android 音频流的 UDP 或 TCP

html5-audio - HTML5 音频 : createMediaElementSource breaks audio output

javascript - jQuery - mousemove 在元素之外不起作用

html - FontAwesome unicode 似乎不起作用?

javascript - 在 php 中获取 javascript 变量

JavaFX IllegalArgumentException

onclick - 单击图像时播放 MP3