74

プリンより滑らか。スムーズなアニメーションの作り方

Embed Size (px)

Citation preview

アニメーションによってこのような素晴らしい作品が作れます。

もっと真面目な使い方もある、らしいです。 例えば、この図は分かりにくいでしょう。

アニメーションを使うとだいぶ分かりやすくなります。

Hans Rosling氏のTED Talkは非常に面白いです。 多量のデータを把握するため、アニメーションが大変役に立ちます。

簡単に言えば、アニメーションというものは時間を通して、情報を伝えることです。

ユーザーインターフェースにも、アニメーションによって 情報を伝えることができます。

OSXのGenie効果によって、最小化されたウィンドウはどこに行っちゃったかとすぐ分かります。

Firefoxにもアニメーションが同様に使われています。

しかし、アニメーションがカクカクしてしまうとユーザーがイライラするし、

伝えたい情報が失われます。

ウェブアプリを作る際、どうやってパフォーマンスを保証しますか?

何よりも、ブラウザーがその背後に何をやっているかという理解が必要です。

滑らかなアニメーションができるように、マークアップからユーザーの目までの間にブラウザーが行っている過程を最適化しに行きましょう。

URLを開くと、コンテンツをが読み込まれ、 DOMツリー(コンテンツツリー)が建てられます。

しかし、この過程がアニメーションに与える影響が低いですので次のスタイル仕組みに進みましょう。

レイアウト・描画するために、DOMツリーにスタイルを適用して、レンダーツリーを建てます。

スタイル決定という過程によってレンダーツリーを作ります。しかし、フレーム(CSS box)の高さ、配置

などはまだ決まっていません。

レイアウトという過程によると フレームの配置などを計算します。コンテンツによってこの過程は重

いです。

どれほど重いかとタイムラインによって計ることができます。

Chrome

IE

Firefoxではリフロー(レイアウト)がコンソールで表示されています。

例えば、margin-leftのアニメーションだと毎回リフローが行われています。

この同じテストケースを他のブラウザーで見ると、異なることがありますが、transformならどのブラウザーでもリフローしません。ということは、

transformを使うとアニメーションがもっと滑らかになるでしょう。

この2つの過程が重いですので、 ブラウザーができるだけスタイルの

処理を避けます。 必要なときまで待ちます。

しかし、APIによってはスタイルの処理をさせます。

このコードによると、プリンごとにスタイルを変えて、 そしてリフローをさせます。

指定されたスタイルを使うとリフローはさせません。

レンダーツリーが建てられたら、描画ができます。

だいたい描画が一番重い過程です。

描画を軽くすることは良いですが、 コンテンツによっては完全に描画をスキップすることも可能です。

レーヤーはフォトショップなどのレーヤーみたいです。 ブラウザーが画像数枚を1回描画して、最後に全部を合成します。

合成するのにGPUが得意ですのでよくGPUにやってもらいます。 合成しながら幾何変換、透明度などを変えることができますので

再描画する必要はありません。

ブラウザーが自動的にレーヤーを作ってくれます。

スクリプトのアニメーションでも、ブラウザーによって自動的にレーヤー化されます。

アニメーションが始まるまでプリンがレーヤー化されません。

しかし、場合によってアニメーションが始まったら、レーヤー化するのはもう遅いです。

端末またコンテンツによってはレーヤー化するのに時間がかかります。

このような場合にアニメーションがカクカクしないため、最近のブラウザー(例:Firefox 37以降)がアニメーションの開始時間を調整しますが、まだアニメーションの反応が遅いと見えます。できればレーヤー化を前もってやってほしいです。

will-changeを使うとあらかじめレーヤー化をするように ブラウザーにお願いすることができます。

レーヤーを使ってもブラウザーが忙しくなるとアニメーションがカクカクしてしまうことまだあります。

なぜかというと、 アニメーションが主要スレッドで動いていますので、

他の過程が忙しくなるとアニメーションする 余裕がなくなります。

しかし、レーヤーはだいたいコンポジターという別のスレッドで合成されていますので、コンポジタースレッドでアニメーションができるとしたら、主要スレッドが忙しくなっても

アニメーションが滑らかに進みます。

スクリプトのアニメーションなら、ブラウザーがそのアニメーションの効果を把握していませんので、コンポジターに渡せません。

しかし、Web Animations APIを使うとコンポジターのアニメーションを作ることができます。

現在、FirefoxでもWeb Animations APIが実装中です。 CSS Animations又CSS Transitionsをスクリプトから調整することができます。

Web Animations APIに基いて、最近アニメーションの開発ツールができました。

FirefoxでのWeb Animations API実装の進展。

ここまで学んだブラウザーについての知識を活かして、 どの端末上でも、どのブラウザー上でも、滑らかに動くアニメーションが作れます。