Проблемы с HTML5 <Audio>

    Когда на конференции Google I/O показали Angry Birds на HTML5, в потоке радости мало кто обратил внимание, что игра на самом деле требует наличия Flash. Спрашивается, почему? Ведь игра написана на Google Web Toolkit (GWT) и для обработки звука использует библиотеку GWT-voices.

    Появились размышления, что таким образом разработчик постарался блокировать игру для пользователей iOS (они покупают её за деньги в App Store). Из лагеря Microsoft высказались в том смысле, что Google умышленно оптимизировал игру под свой «глючный» и «нестандартный» Chrome, тогда как IE гораздо лучше поддерживает <Audio> и не экспериментирует с функциями, которые ещё не утверждены.

    На самом деле причины немного другие, и главная из них в том, что HTML5 <Audio> пока что не подходит для использования в играх или профессиональных аудиоприложениях.

    Разработчик Рей Кромвелл, который год назад портировал Quake2 на HTML5 (GwtQuake), называет два главных недостатка HTML5 <Audio>

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

    Во-вторых, HTML5 не обеспечивает необходимого контроля над таймингом, а ведь он очень важен для восприятия — человеческое ухо реагирует на задержку звука даже в несколько миллисекунд. Здесь же практически невозможно запустить аудио в ту миллисекунду, когда это требуется. На практике в разработке игр считается нормальной задержка не более 7 мс. Однако, в HTML5 вы можете назначать звуки только командами setInterval или setTimeout, и это слишком ненадёжно: точный тайминг не гарантируется, могут быть задержки до 16 мс, а при интенсивном использовании этих команд браузер начинает тормозить. Если вы переключаетесь на другую вкладку, то браузер может сильно замедлить скрипт, чтобы снизить нагрузку на CPU, ведь здесь нет функции «requestSoundEvent», аналогичной requestAnimationFrame.

    Вот почему мы с нетерпением ждём Web Audio API, чтобы снять значительную часть нагрузки с центрального процессора и обеспечить приемлемый тайминг. И скоро дождёмся. Вот соответствующий фрагмент видео с презентации Google I/O.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 17

      +6
      Поддерживаю. HTML5 пока совершенно не подходит для игр. Кроме вышеназыванных проблем есть ещё проблемы с вменяемым клонированием аудио-элемента. И да, главная проблема в том, что практически невозможно запустить аудио именно в ту миллисекунду, когда это требуется.
        +2
        >HTML5 пока совершенно не подходит для игр.
        только потому, что в нем плохо со звуком?
          +1
          опечатка, *HTML5 audio
          0
          www.pirateslovedaisies.com отлично работает в IE9, звуки выстрелов синхронизированы, то есть «запускаются именно в ту миллисекунду, когда это требуется»
            0
            Там свои хитрости. Часто они не подходят.
            0
            Подскажите, выявили ли вы ещё какие-либо «особенности» при реализации игр на html5?
              0
              Аудио — это единственное, что у меня вызвало отвращение.
              Остальное — более-менее приемлимо.
                0
                А есть ли возможность узнать момент, когда аудиофайл загрузился? Работал с видео, так и не нашел надежного кросбраузерного способа определить этот момент.
                  0
                  более вменяемого, чем универсального «canplaythrough» я не нашёл(( да, onload не хватает.
                  var audio = document.createElement("audio");
                  audio.src = "audio/sample.mp3";
                  audio.addEventListener("canplaythrough", function () {
                      alert('The file is loaded and ready to play!');
                  }, false);
                  
                    +1
                    По моим наблюдениям, для видео он работает не всегда так, как описано в стандарте. В фаерфоксе, кажется, событие срабатывает при готовности нескольких секунд после текущей позиции.

                    Еще меня удивило, что для картинок и аудио есть конструкторы new Image() и new Audio(), а для видео такого нет.
                0
                >> Подскажите, выявили ли вы ещё какие-либо «особенности» при реализации игр на html5?
                Есть еще трабла — нет контроля над позицией мыши, например, для управления камерой в виде от первого лица, даже если скрыть сам курсор мыши, при ее выходе за границы браузера или подходе к краю экрана (фулскрин), события о ее перемещениях перестанут отсылаться.
              +3
              Почему же тогда Doodle God нормально использует без всяких флешей? И микширование у них есть.
              • UFO just landed and posted this here
                  +1
                  Мужики, посоветуйте модуль для проигрывания семплов для игрушки.
                  Интересует что-то вроде $().play['jump']; для проигрывания звука прыжка, или что-то типа того.
                  Кто чем пользуется?
                  Спасибо.
                    0
                    LibCanvas =))
                    libcanvas.getAudio('jump').play()
                    
                    0
                    Про использование тега аудио
                      0
                      Спасибо, но лепит контролы, а они не нужны.

                    Only users with full accounts can post comments. Log in, please.