AdobeエンジニアのTinic Uro氏がブログで書いた記事が一部で話題になっています。
kaourantin.net: Core Animation
Windowsユーザーの自分にはピンと来ないものの、どうやらMacでのFlashPlayerのパフォーマンスが(かなり?)向上するという話の様子。ということで、早速自分なりに意訳してみました。間違ってるところなどあるかもしれませんので、あくまで以下文章についての正確な内容は上記Tinic氏の元記事をご覧下さい。
2010年2月11日(木)
Core Animation
驚くべき事に、この一年でFlash Playerエンジニアリングチームには本当にたくさんの出来事があった。いろんな事を話したいのはやまやまだけど、この記事ではKevin Lynchが最近触れた内容、特にMacのパフォーマンスとCore Animationに関する彼のコメントについて掘り下げてみようと思う。いつもFlashに関する文脈の中でパフォーマンスについての言及があると多くの注目を集めてきたが、技術的な背景はしばしばPRの中(?)に失われてきた。
さて、Flash Player 10.1のCore Animationとはなんぞや?AppleがCore Animationについてまとめた文書があるので、それを見てみよう。
Core Animationとは高いパフォーマンスのcompositing engineと、簡単に使えるアニメーションプログラミングインターフェースとを統合したObjective-Cフレームワークのことである
なんだかFlashにバッチリ合いそうな感じでしょ?まさに、Flash Player 10.1は、このフレームワークの力を借りて、OS X上で動作するSafariや他のブラウザーが抱えているいくつかの技術的な問題に取り組もうとしているんだ。
The drawing model jungle on OS X
Core Animationを目指すより具体的な内容について触れる前に、OS Xで、プラグインがブラウザーウィンドウに描画を行う方法について簡単に見てみよう。Windowsでは一通りしかないのに対し、OS Xでは4通りもある。
- QuickDraw。Operaや旧世代のFirefox, Safariでデフォルトモードとして使用される。
- Quartz 2D(あるいは Core Graphics)。新しいFirefoxとSafariでサポートしている。
- OpenGL。僕の知る限りまだこの方法をサポートしているブラウザーはない。
- Core Animation。現在はOS X + Safari 4の組み合わせでのみ対応。さらに現在のバージョンでは警告が表示される。
これらの描画モデルの違いに加え、デザイナーはFlashコンテンツを埋め込むのに3種類の異なるwmodeを選択することができる。
- Normal
- Opaque
- Transparent
Normalにすると、SWFの上にHTMLをオーバーラップして表示させる事はできなくなる。Opaqueだとそれができるようになり、TransparentにするとSWFが透過となり、その下にあるHTMLが表示されるようになる。これらの内容を考慮にいれた上で、それぞれのケースでどの描画モデルが使用されるのか(そして、Flash Player 10.1のリリース前に我々が変更しなければならない点)について示した、下記のような表を作った。
Flash Player 10.0: Safari 4 Firefox 3 Opera 10 Normal Quartz 2D QuickDraw QuickDraw Opaque Quartz 2D QuickDraw QuickDraw Transparent Quartz 2D QuickDraw QuickDraw
Flash Player 10.1: Safari 4 (*) Firefox 3 Opera 10 Normal Core Animation Quartz 2D QuickDraw Opaque Quartz 2D(**) Quartz 2D QuickDraw Transparent Quartz 2D(**) Quartz 2D QuickDraw (*)Core Animationのサポートが進行中のナイトリービルド版を使用。
(**)SWFがHTMLページのfront mostオブジェクトである時にはCore Animationが使われる。Quartz 2Dについてはどうなる?
Quartz 2Dの基本的な前提については、Appleが次のように述べている:
Quartz 2DはiPhoneアプリケーションの開発と、カーネル外の全てのMac OS Xアプリケーション環境で利用可能な二次元描画エンジンである。Quartz 2Dはディスプレイや印刷デバイスに関係なく、unmatched output fidelityな(出力先の忠実度にマッチしない?)低レベルで軽量な2Dレンダリングを提供する。
Quartz 2Dは、アニメーションとか動画再生のようなマルチメディアアプリケーション向けにデザインされたものではない。それはOpenGL, Core Video, Core Animationの領域だ。SafariがHTMLコンテンツの描画にQuartz 2Dを使うのは、大体のケースではコンテンツが静的であることを考えると非常に合理的と言える。Flashが出てさえこなければみんなうまく行くんだ。例えば、Flash PlayerがQuartz 2D描画モデルを使ってSWFコンテンツを再生する場合、全面的にブラウザーが関与しなければならなくなる。イベントの流れはこんな感じ(Sharkでスタックトレースすることもできます)
- 新しいフレームを表示する場合、Flash PlayerはNPN_InvalidateRectを使ってその領域の更新を要求する。
- ブラウザーはFlash Playerから提供された矩形をそのdirty regionに追加する。
- ブラウザーは描画リスト(HTML DOM)を検索し、dirty regionが含まれるノードを一つ一つ描画していく。
- ブラウザーはFlash Playerインスタンスが含まれるノードを見つけると、まずHTMLの背景を描画する。次にFlash Playerに対して、要求された領域を直ちに描画することを伝えるイベントを投げかける。
- Flash Playerはここでやっとフレームを描画する。
まあ今のところはそこそこ合理的だと思う。じゃあ技術的な問題とは何か?例えばページの背景にCSS gradientを用いたような、非常に込み入ったHTMLページを考えてみよう。そこに秒間30フレームで動作するSWFファイルを追加する。すると、Flash Playerではなく、ブラウザー側で非常に時間がかかるということがわかるだろう。ここでCore Animationが真価を発揮することになる:ステップ3と4が要らなくなるのだ(SWFが最前面に表示された最大の(?)オブジェクトである限り)。
Flash PlayerでのCore Animation
Flash Player 10.1では、この技術的な問題を解決するため、Core Animation描画モデルを実装した。Instead of using a CGImageRef + CGContextDrawImage to get the bits to screen we pass a CAOpenGLLayer to Safari and use an OpenGL texture of type GL_TEXTURE_RECTANGLE_ARB to get our bits to the screen.
Core Animation描画モデルのサポート自体はAppleからもたらされたもので、僕たちは両者にとってこの技術的な成果が完了できるよう、一生懸命取り組んだんだ。その通り!これはまさに、AppleとAdobeのエンジニアが合同で努力したものなんだ。SafariとCore Animationプラグインとのほぼ完全な統合を果たした今、Flash Playerの将来のバージョンでは、Open GLの能力をさらに活かせたらいいなと思っている。そして、それが特別なwmodeとかを設定しなくても済むようにと。I am pretty stoked about it.
2010年2月10日現在、皆さんに公開できるような安定した状態に近づいている。つまり、Flash Player10.1, OS X 10.6とSafariのアップデート版(あるいはナイトリービルドのWebKit)が必要になるだろう。それらが無い場合には何も見えないだろう。
一体どんな違いがあるの?
これがFlash Playerのパフォーマンス問題に関する万能薬だということはない。ただ、ブラウザー上でのより複雑なWEBコンテンツの体験を向上するという、より大きな目的に対する小さなステップだと言える。ここに、Flash Player 10.0 とFlash Player 10.1との比較が可能なテストケースを用意した(Safariでのみ動作)。これはあくまで極端なテストケースであるという事を忘れないようにね。
Flash Player 10.0 + nightly WebKit + OS X 10.6
Flash Player 10.1 + nightly WebKit + OS X 10.6
追伸:Core AnimationがCocoa APIだって気づいたかな?そう、Flash Player 10.1はついに真のCocoa appになったんだ(非CocoaのFirefoxやOperaをサポートするCarbon fallbackもついてるよ)。



コメントはまだありません »
コメントはまだありません。
この投稿へのコメントの RSS フィード。 TrackBack URL
コメントする