2011-12-22 3 views
3

Я разрабатываю HTML5-игру для Facebook. У меня есть следующий HTML-код:Воспроизведение нескольких звуков в Chrome

<audio style="visibility: hidden;" controls="controls" id="sound-0"> 
    <source src="sound/sound_new.ogg" type="audio/ogg"/> 
    <source src="sound/sound_new.mp3" type="audio/mp3"/> 
</audio> 
<audio style="visibility: hidden;" controls="controls" id="sound-1"> 
    <source src="sound/sound_new.ogg" type="audio/ogg"/> 
    <source src="sound/sound_new.mp3" type="audio/mp3"/> 
</audio> 
<audio style="visibility: hidden;" controls="controls" id="sound-2"> 
    <source src="sound/sound_new.ogg" type="audio/ogg"/> 
    <source src="sound/sound_new.mp3" type="audio/mp3"/> 
</audio> 
<audio style="visibility: hidden;" controls="controls" id="sound-3"> 
    <source src="sound/sound_new.ogg" type="audio/ogg"/> 
    <source src="sound/sound_new.mp3" type="audio/mp3"/> 
</audio> 
<audio style="visibility: hidden;" controls="controls" id="sound-4"> 
    <source src="sound/sound_new.ogg" type="audio/ogg"/> 
    <source src="sound/sound_new.mp3" type="audio/mp3"/> 
</audio> 
<audio style="visibility: hidden;" controls="controls" id="sound-5"> 
    <source src="sound/sound_new.ogg" type="audio/ogg"/> 
    <source src="sound/sound_new.mp3" type="audio/mp3"/> 
</audio> 

И следующий Javascript, начинающаяся звуки:

if (this.hitFlag > 6) this.hitFlag = 1; 
var soundElem = document.getElementById('sound-' + (this.soundFlag % 6) + '0'); 
soundElem.play(); 

Каждый щелчок мыши вызывает звуковое событие. Проблема с Chrome, где после дюжины щелчков звуки исчезают или начинают играть с довольно большой задержкой (дюжину секунд). Но нет никакой проблемы при игре в FF или Opera.

+1

Звучит как ошибка в Chrome ... – home

+1

Хром зафиксировал много ошибок в латентности

ответ

2

Это определенно ошибка, но я думаю, что это связано с фактическим элементом, а не с частью воспроизведения звука. Вы можете легко обойти это, предварительно загрузив свой звук, создав новый звуковой объект для каждого воспроизведения звука, а затем, наконец, проверив звуковые объекты на каждом тике, чтобы определить, закончились ли они или нет, чтобы вы могли очистить память.

Предварительная загрузка, конечно, что-то вроде:

var _mySnd = new Audio('my/snd/file/is/here.mp3'); 

инстанцировании, как:

var _sndCollection = []; 
var n = _sndCollection.length; 

_sndCollection[n] = new Audio(); 
_sndCollection[n].src = _mySnd.src; 
_sndCollection[n].play(); 

И проверка очистки будет:

for (var i = 0; i < _sndCollection.length; i++) 
{ 
    if (_sndCollection[i].currentTime >= _sndCollection[i].duration) 
    { 
     _sndCollection.splice(i, 1); 
     i--; 
    } 
} 

я использую что-то вроде этого в моем собственном игровом движке HTML5, и он отлично работает до сих пор.

+0

Спасибо @ceprovence Я попробую ваш код сразу после Рождества! Счастливое Рождество вам! –

+0

Это (или что-то в этом роде), похоже, работает, но разве он не помещает вас в один тип файла, например .mp3 в вашем примере кода? Тег

+0

Последующие действия: использование вашей системы Я получаю звуковые задержки, как будто предварительная загрузка _mySnd не распространяется на _sndCollection [n]. – Dragonfly

Смежные вопросы