前回の記事 "言語編" の続きです。
前回は開発言語に関連する話題が中心でしたが、今回は新しく追加が検討されている機能を中心に扱います。
例によって、以下の項目が 2012 年中に公開されるかどうかは保証の限りではありません。また、永遠に出てこないかもしれません。その点ご了解の上お読み下さい。
Flash Player の並列処理
Flash Player では、スクリプトの実行も描画処理も、みんなおんなじ 1 つのスレッド上で順番に実行するのが基本的なモデルです。そのため、スクリプトの実行に時間がかかると、画面の更新が遅れたり、場合によっては画面がしばらく固まった状態になることもあります。
この問題を解決するため、時間のかかる処理はメインスレッド外で並列処理できるように Flash Player の改良が行われてきました。例えば I/O 関連では、既に、非同期の読み込みや書き出しに対応した API が提供されています。
最新の Flash Player 11 では、画像のデコード処理も非同期で行えるようになりました。従来は、大きな画像をステージに読み込むタイミングで一瞬アニメーションが止まる、となっていた場面でも、この変更によりスムースに再生できるようになるでしょう。
今後も、XML データや JSON データ (JSON のネイティブサポートは Flash Player 11 から追加された機能です)の非同期の読み込みを実現したいようです。今年 4 月にブラジルで行われた Flash Camp では、ビデオの読み込み処理の非同期化も予告されていました。
また、JIT を非同期に実行することも検討しているそうです。実験的に試してみたところ、大規模な Flex アプリの起動が最大 40% 程速くなったという結果だったという話でした。これも (いつかは) 実装される可能性が高そうです。
スクリプトの並列処理
以上に加えて、ActionScript コードを複数のスレッドで実行する機能がようやく提供される模様です。
マルチスレッドが使えると、フレームレートを下げる要因になっている処理や、長時間スレッドをブロックする可能性のある処理を、メインスレッドの外で実行できます。なにより、UI が固まって反応しなくなるという状況は、ずいぶんと減りそうです。
今のところ、並列処理を実現するには、Pixel Bender を使うとか、複数の SWF に割り振るとか、独自の仕組みを実装するとかしなければなりません。ActionScript にマルチスレッド用の API が提供されれば、ずっと容易かつ効率的に、並列処理が使えるようになることでしょう。
と言いつつ、利用できる CPU コアの数によって、マルチスレッド化の効果に差が出るだろうことには当面注意がいるかもしれません。特に、スマホは、現状殆どの機種が 1 コアなので、当面は (2 年後の買い替えまでは) デスクトップ環境での利用を主に考えるのがよいかもです。
また、スレッド作成やスレッド間の通信により余計な負荷が増えた結果、マルチスレッド化によりかえって遅くなるケースもあるかもしれません。デバッグも難しくなりそうですし、開発者の腕の見せ所が増えそうです。
さて、肝心の API ですが、Web Workers の仕様を参考にしているとのことなので、標準的に使われている仕様と比較的近いものになりそうです。が、データを共有しない、どのスレッドも画面を更新できる、という点が他と比べると少しユニークです。
ざっと聞いた感じでは、Worker というクラスに SWF を読み込むと、その SWF 内のメソッドを非同期に実行できる、という話だったように思います。結果は、同期/非同期どちらでも受け取れるようです。新しいシンタックスの追加は一切無しで使えるとのことでした。
スレッド間でデータを共有しないため、同期とか面倒なことを考えずに済みそうなのは良さそうですが、代わりに、必要になった時点でデータコピーが発生することから、スレッド間のデータ共有のコストはやや高そうです。だから、個々のスレッドが描画データを更新できるように、ということなのかもしれません。
まだ、仕様をつめている段階だが、Stage3D のように速い段階からコミュニティのフィードバックを得られるようにしたいと話してましたので楽しみに待ちましょう。
JDI
JDI は "Just Do It" の略だそうです。Flash Player に対してリクエストの多い項目の中から、エンジニア 1 人で 2 日以内でできそうなことは "とりあえずやっつけよう" というポリシーで、少しずつ機能を追加する運動 (?) を JDI と呼んでいるそうです。
Flash Player 11 で JDI により追加された機能は、
- ビットマップの大きさの制限の撤廃
- MovieClip.isPlaying()
- DisplayObjectContainer.removeChildren()
- Sound.loadPCMFromByteArray()
- Sound.loadCompressedDataFromByteArray() - MP3 用
など、なかなか強力なラインナップです。
JDI の次のターゲットとしては、以下のような機能があげられていました。
まず、Sound がサポートするフォーマット 2 種類の追加、
- AAC/ADTS - ストリーミング用
- AAC/MP4 - iTunes 用
があります。AAC のストリーミング再生と、データをダウンロードしてから再生、の両方に対応できるようにしたいようです。
それから、AR を実現し易くするための機能が検討されていました。
今の Flash Player の機能では、カメラからの入力を表示して、その上で Stage3D を使った 3 次元オブジェクトを表示することができません。Stage3D は表示リストの下に位置するレイヤーのため、カメラからの入力は Stage3D の更に下のレイヤー、すなわち StageVideo に表示できないと駄目なのです。
そのため、
- StageVideo.attachCamera()
という API を追加して、カメラからの映像を StageVideo にも表示できるようと考えてようです。さらに、Stage3D の透過表示を可能にする予定だそうです。下のレイヤー (StageVideo) の映像が隠れてしまっては意味が無いので、これは確かに必要そうです。
また、カメラからの映像が StageVideo で再生された場合、表示オブジェクトから映像データが利用できなくなっては困ることもあるだろうと、
- Camera.drawToBitmapData()
- Camera.copyToByteArray()
というメソッドの追加を考えているそうです。これらは、カメラからの画像を、表示オブジェクトまたはバイト配列として保存して、後で利用できるようにするものです。カメラからの入力は SWF のフレームレートとは関係なく更新されるため、カメラの描画レートに合わせて更新を通知する新しいイベントも導入予定だそうです。
イベント関連では、SWF がバックグラウンドで実行されたときにフレームレートが変わったことを通知するイベントも追加予定だそうです。これも待っている人が多かった機能ではないかと思います。
機能編、さらに続きます。
AfterEffectsとFlashの連携機能が強化されるとうれしい。
キューポイントの操作をもっと簡単、便利になるといいと思います。
Flashに動画を組み込みそれをサクサク動的に制御できるようになると凄くいいですね。
stage videoもありますし、Flash×AEがもっと進めばFlashグッドです。
あとはタイムラインにf4vとか読み込めるようになってくれれば非常にうれしいです。