2017/10/04 (2017年10月 のアーカイブ)
ChromeでWebGLをぶん回しながらWebAudioで音を出す
今までかなーり古いMacBookAirを使っていて、さすがにパフォーマンス的に問題が出てきたので新しいMacBookProに乗り換えました。基本的にメインマシンはWindowsなのでMacは持ち運び用なんですけどね。小さいのが良いのだけどAirの11インチモデルが無くなってしまって重さはともかくAirの13インチよりProの13インチの方が小さいというのもあるし。
しかしまあ、これで今まで問題だったChromeでWebGLをぶん回しながらWebAudioで音を出す系の奴も快適に...と思ったらどうもそう簡単でもないようで。
今までChrome上で起こっていたシェーダープログラムのコンパイルが走った瞬間に一切合切1秒間ほど固まったりというのは無くなってCPUの性能向上は確実に感じられるのだけど、どういうわけか動作中の何気ない瞬間に「ぷち」とかオーディオデータのアンダーフロー的なノイズが入ったりします。これは今までAirで走らせていた時はなかったんだがなぁ。MacBookProめその程度か。
それでどうしたものやらと弄った結果、結局これは確定ではないけどWebGL/シェーダーにかかる負荷がディスプレイがRetinaになって激増したせいではないかと推察。もともとChromeの設定としてもMacの音関係はWindowsに比べてレイテンシーが小さく、それ故に楽器系には向いているのだけど負荷がかかった時のアンダーフローには弱いのだよね。
となると、もう少し負荷を下げるためにWebGL周りでレゾリューションを調整したりフレームレート落としたり、というのが正攻法かも知れないけど、取りあえずChromeのオーディオバッファを増やすという手段に出てみました。
Chromeの各種設定ができるChrome:flags画面にも載っていないしあまり情報はないのだけど、起動オプションで
--audio-buffer-size=xxx
という奴が使えるようです。まずはターミナルから起動してテスト:
open /Applications/Google\ Chrome.app/ --args --audio-buffer-size=2048
Chromeのアプリは "Google Chrome" なので途中のスペースをバックスラッシュでエスケープする必要があります。--args の後ろが起動するアプリに渡されるオプションになりますのでここに --audio-buffer-size=2048 を渡します。
これで起動したChromeはオーディオバッファサイズが指定の通り大きく設定されますのでノイズが改善されるかどうか確認します。なおこの指定が無い場合のバッファサイズはOSXでは256ですが、Windowsではもともと512のようです。この指定はChrome内部の処理ブロックのサイズに影響を与え、例えばScriptProcessorに渡ってくるデフォルトのバッファサイズはこのサイズの4倍になります。
内部の処理がどう分割されているのかわかっていませんが、44.1kHzで2048サンプルは46msecくらいですのでかなり長めですね。当然ながらバッファサイズが大きくなるとレイテンシーは悪化しますので音にノイズが乗らない範囲でバッファサイズは小さくする必要があります。レイテンシー46msecだとリアルタイム楽器関係はちょっと演奏できません。
これでいけそうなら、毎回ターミナルから起動するのはいまいちなのでアイコンから起動できるようにします。多分ここから先は色々手段があると思いますが、取りあえずAutomatorで。
「シェルスクリプトを実行」をドロップしてコマンドラインを指定します。
これをアプリケーションとして保存して完成。
このままだとアイコンがAutomatorのものになるのでChromeのアイコンにしたければ、両方の「情報をみる」画面の左上のアイコン間でコピペできます。
まあこれでWebGLをぶん回しながらWebAudioで音を出す系アプリでの音切れは回避できたのですが、問題がないわけではないんですよね。バッファを大きくすると当然レイテンシーが大きくなるので操作に対して本当にリアルタイムで反応しないといけないようなものには不向きです。
それから気を付けないといけないのは、オプションを付けていない通常のChromeが動作している状態だと、これで起動してもオーディオバッファが増えた状態になりませんので、必ずChromeを完全に終了させてから起動しないと効果がありません。やっぱりちょっと使い方として厄介な感じはありますが、まあこんな姑息な方法もあるという事で。
Posted by g200kg : 2017/10/04 14:08:01