100日後に完成するゲームシステム 74日目「サウンド機能に深刻な問題発見!!」

2021年5月3日

テクノロジー 特集

eyecatch ブラウザゲーム開発で最も難関が、サウンド周りということに気がついた、弓削田です。 Web Audio APIと、格闘すること、数週間になります。 ゲームに音楽は必須という事で、なんとしても、手堅い方式を採用して、 安定したサウンドプレイを行いたいので、 前回、サウンド音源のメディア素材を使うのを辞めて、独自ライブラリで構築した midi方式で、激軽でらくらく設定の方式を構築したのだが、 ここで大きな問題に直面した! 前回記事「ゲーム音源をMSXサウンド風なMIDI仕様を搭載」 現時点でこの問題は解決しておらず、ネットでこの問題を提示しているサイトが 日本も海外も見つからなかったので、対応策がない状態なので、 今回は問題提議だけしておきます。 ※ソッコーで解決したいと思いますけどね。

問題点について

前回作ったMSX風のMIDIサウンドツールが問題なのではなく、 WebAudioAPIをプレフィックスで扱っているSafariブラウザ(iOSとmacどちらも)が、問題ということが、 今回の調査でわかりました。 前回のツールは、ボタンをクリックしたら、そのイベントで実行する関数で、 HTML5のAidioライブラリ機能(WebAudioAPI)を使って音を出していたんですが、 その時点では全く問題なく、どのブラウザでも同じ動作をしてくれて良かったのですが、 ゲーム内での、何かしらのイベントによって、操作イベントとは別に発生するようなシナリオの場合に、 任意の時間に音を鳴らすという処理が必要なので、 setTimeoutなど、タイミング操作をする関数を使って、音再生を実行してみたところ、 Safariブラウザのみが、次のような症状が発生している事を発見した。
Safariブラウザでは、setTimeoutで、1000ms(+-50)ぐらいの境目で、音が鳴らなくなる。
これ、わかりますかね? 自分のコントロールしているキャラクターをキー操作で歩かせている時に、 ボタンを押しっぱなしにしていて、「てくてく」という音とともに歩いている時に、 裏のプログラムでは、setTimeoutで、移動させながら、そのタイミングで音を鳴らしているんですが、 これが、キーを押して1秒を超えると、音が鳴らなくなるんです。 2,3歩ぐらいあるいたら、音が消えたり、 マップ間の移動音が鳴ったり鳴らなかったりしていたりして、 safariブラウザで操作をしたときだけ、不安定な状態だったので、少し調査をして見つけた事象です。 一番痛かったのは、セリフ表示の時に、「ピピピ・・・」と文字に合わせて音がなる箇所が、最初の10文字ぐらいしか、鳴らないため 非常に違和感が発生してしまいました。 しかも、この事象は、safariだけです! 他のブラウザは、全く問題ありません。

原因の特定(仮説)

おそらくですが、safariのみ、「AudioContext関数」に対応しておらず、「webkitAudioContext」というプレフィックスにて、 擬似的にAudioAPIを使っている状態なんですが、 おそらくコレが原因ではないかと考えられます。 ちなみに、midiサウンドでなく、音源データでも、似たような事象が発生しているので、 この問題はAudioAPI全体の問題であると、理解することができました。 現時点で解決策が見つかっていないんですが、 safariブラウザは、iPhoneのメインブラウザということで、IEなどのように、見捨てるわけには行きません。 Safari以外のブラウザは、現時点のプログラムで全く問題がないのですが、safariの時だけ何かしらの方式を変えてやるというのも考えてもいいのですが、 できれば、共通仕様で構築したいと考えるのが、エンジニアの思考ですよね。 また、その解決策も見つかっていないところから、まずは、safariで問題なく音が鳴らせるという方式を探っていき、そちらに寄せて行こうかな・・・と考えています。 できれば、次回のブログで解決策の報告ができればいいんですが・・・

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ