先月の2月13日(日本時間14日)に新しいCreateJSがリリースされました(CreateJS Blog「CreateJS: Updates to Libraries」参照)。いずれのライブラリもバージョンが0.1上がっています。SoundJSは0.4.0となり、サウンドインスタンスの占めるメモリの扱いが大きく改善されました。簡単にその解説をしましょう。なお、各ライブラリのおもな変更については、すでに「CreateJSのつぎのリリース候補バージョン(release candidates)が公開」でご紹介しました。
SoundJS 0.4.0でまず大きく変わったのが、ライブラリの中心となるクラスの名前です。ライブラリ名はそのまま変わらないものの、クラス名はSoundJSからSoundに改められました。サウンドを再生するには、いずれも静的メソッドplay()
に、サウンドの識別子を引数に渡して呼出します。戻り値も同じSoundInstanceオブジェクトです。
ところが、ここからのサウンドの扱いが違います。一時停止や再開は、旧バージョンではやはり静的メソッドで行いました。そして、それぞれのサウンドに与えた識別子(名前)をメソッドの引数に渡します。つまり、静的メソッドで基本的にサウンドを操作し、どのサウンドを扱うかは名前で切り分けるということです。
SoundInstanceオブジェクトの参照なしに呼べる静的メソッドなら、複数のサウンドがあっても扱いは簡単です。けれどそれは逆に、すべてのSoundInstanceオブジェクトの参照を、SoundJSクラスがもちつづけていることを意味します。実際、SoundJS.getInstanceById()
メソッドに識別子[*1]を渡せば、いつでもSoundInstanceオブジェクトの参照は得られました。とくに問題だったのは、すでにSoundJSクラスがもっているSoundInstanceオブジェクトが要らなくなっても、メモリから消す手立てがなかったことです[*2]。
新しいSoundクラスには、getInstanceById()に当たるメソッドはありません。一時停止や再開は、SoundInstanceオブジェクトを参照して、それぞれSoundInstance.pause()
とSoundInstance.resume()
メソッドで行うようになりました[*3]。つまり、操作するサウンドのSoundInstanceオブジェクトは、コードの中で参照を保たなければなりません。逆に、再生し終えたサウンドのオブジェクトは、参照がなければメモリから消されるということです[*4]。
操作するオブジェクトの参照は保ち、要らなくなったら参照を外すということは、ある程度プログラミングに慣れたユーザーなら心がけていることです。そうすることで、使われないオブジェクトがメモリに居座らなくなったというのは、多くの支持を受けるでしょう。
[*1] サウンドの識別子ではなく、SoundInstanceオブジェクトに備わるSoundInstance.uniqueId
プロパティの値です(「SoundJSでSoundInstanceオブジェクトを指定して再生する」参照)。
[*2] SoundInstanceオブジェクトが消せないことは、かつてCreateJS Support「How to play the finished sound again?」で議論されました(前出「SoundJSでSoundInstanceオブジェクトを指定して再生する」の「確認されている問題」参照)。
[*3] 古いSoundJSライブラリが使われているスクリプトを、新たなSoundクラスでどのように書替えればよいのかについては、「SoundJSに備わる予定のSoundクラスで外部サウンドファイルを再生する」をお読みください。
[*4] 再生し終えたサウンドのオブジェクトはメモリから消すことが、新たなSoundJS 0.4.0のおもな改善のひとつとされました(「Will SoundInstance of SoundJS 0.4.0 be garbage-collected?」参照)。