远蚘: 2018幎10月䜕幎か経っおから芋おも内容倧䞈倫そうでした。

この蚘事はFrontrend Advent Calendar 2013の6日目の蚘事です。昚日は谷さんでWeb Components/Polymerを軜く觊っおみるでした。これ今埌数幎で倧流行りしそうに思うので、未読なら是非

さお、最近はHTML5だCSS 3だFlashやめおJS制埡でアニメヌションだヌっおんで盛り䞊がっおるわけですが呚回遅れ、いざアニメヌションを実装しおみおも、なかなかスムヌズに動いおくれなかったりしたすね。

どうやったらスムヌズに動くかっおのを解説したいず思いたす。

なおこの蟺りの情報は、抂ね斎藀さんを䞭心ずしたFrontrend絡みの方々に教えお頂きたした。感謝感謝。

先に結論

抂念的なの

  • GPU合成レむダヌを適切に䜿うず早い
    • いわゆるハヌドりェアアクセラレヌション
  • 䜕がCPUで、䜕がGPUで描画されるか知っおおくべき

実際的なの

  • transformやopacityはむケおる
    • 他のアニメヌションはコスト高いっぜい、特に色
  • 合成レむダヌの内容を倉曎しない
  • パラパラアニメは党コマ読み蟌み可芖性の制埡で
  • アニメの「コマ」が少なければ少ないほどハヌドりェアアクセラレヌションの効果が出る

ぬるぬるアニメ、ざらざらアニメ

たずは実䟋からご芧頂きたしょう。

四皮類の方法で、巊から右ぞ移動させおいたす。

  • transform:translateX()を䜿ったCSSアニメヌション
  • transform:translateX()を䜿ったJSアニメヌション
  • leftを䜿ったCSSアニメヌション
  • leftを䜿ったJSアニメヌション

最初のが䞀番綺麗で、他はなんかちょっずひっかかる感じがありたせんか。これは、Flashの代わりにずCSSでアニメヌションしたのにガクガクになっおしたう珟象の顕著な䟋です。

ず蚀い぀぀、手元の環境だずIE 11は党郚綺麗に動いおしたった  。Chromeが䞀番顕著でした。 

では、䜕が明暗を分けたのでしょうか。

JS vs CSS

JS制埡ずCSS制埡であれば、CSS制埡の方が高速です。HTML5やCSS 3を゚ミュレヌトするJSがいたいち䜎速なのはご存知でしょう。

现かい数倀を蚭定する堎合はJSが必須ずなりたす。しかしその堎合でも出来るだけCSS偎ぞ凊理を眮き、出来るだけJSからは「動かす」のではなく「CSSでの動きを切り替える」ようにするずより高速に動く事でしょう。

この話題はこれくらいにしたす。

CPU vs GPU

transformのtranslateX()ずleftはいずれもCSSで、芁玠を巊右に動かすずいう同じような機胜を持っおいたす。

ですが実はtransformはGPU、leftはCPUにより描画凊理が行われたす。

CPU

そもそもGPUお䜕ずいう人もいるず思うので、ざっず説明したす。

たずこっちは有名コンピュヌタヌの頭脳。

CPU: Central Prosessing Unit、぀たり䞭倮挔算凊理装眮です。コンピュヌタヌのあらゆる動きの䞭栞ずなりたす。「コンピュヌタヌの五倧芁玠」なんおのもあるのですが、その筆頭です。

ちなみになんずかヘルツ (Hz) で匷さが枬れたすが、違う皮類のCPUはHzの数倀だけ芋おも枬れたせん。孊校の詊隓で合蚈点が同じでも、囜語が埗意な人も数孊で点を皌ぐ人もいたすよね。

CPUは、䟋えお蚀うなら「あなた」です。そう、立掟な脳みそを持っおいお、色々なお仕事をする事が出来る「あなた」です。

画面の描き換えも基本的に「あなた」の仕事です。

「CPUです。䜕でもやりたす。」

GPU

CPUのニセモノ、ではありたせん。

GPU: Graphcs Prosessing Unit、描画挔算凊理装眮ずでも呌びたしょうか。画像の凊理が埗意です。

GPUを䟋えるなら「倖泚さん」で、画像映像の凊理の専門家です。「あなた」が様々な描画凊理を自前でやるよりも高速です。が、仕事のたびに䟝頌したり成果物を受け取ったりする手間が増えたす。

「GPUです。グラフィクスのお仕事ください。」

マルチコアCPUおたけ

぀いでなんですが、CPUがたくさんある状態ずいうのは、「あなた」が仲間ず䞀緒に仕事をしおいる状態です。

仕事の速床は䞊がりたすが、やはり仲間内でやり取りが発生したう。コアが二倍になったからずいっお速床が二倍になるずは限らないのは、そういうわけです。

「チヌム『クアッド・コア』です。」

で、CPUずGPU

「あなた」ず「倖泚さん」の関係です。既に述べたしたが、画像映像のお仕事を専門家に任せる事で高速化を図る事が出来たすが、ちゃんず管理しないずいけたせん。

「あなた」たるCPUが仕事の䞭心で、画像系のものを切り出しお「倖泚さん」たるGPUにお願いしたす。

「この画像を䜿っお画面䜜っおください」

アニメヌションを行っおいる最䞭も、CPUは様々な雑務も平行しおこなしおいたす。マりスやキヌボヌドの入力を受付たり、ネットワヌク越しにファむルを受信したり、たたバックグラりンドでメモリを管理し最適化し、ハヌドディスクにアクセスしたす。アニメヌションだけが仕事ではないのです。

CPUで出来る仕事は人間でも出来る

この感芚を倧切にしお欲しいんですが、computerなんおものは所詮蚈算機です。凊理速床が超高速ではありたすが、やっおる内容は人間にだっお出来たす。機噚のUIがあればね

コンピュヌタヌの「重い凊理」ずいうのは、人間がやっおも「蟛い仕事」になるわけです。よっお、コンピュヌタヌの凊理の内容を想像する事で、高速化のヒントを埗られる堎合が倚々ありたす。

CPUのお仕事

ずいうわけでございたしおですね、はい、はい。

CPUやGPUがどういう「お仕事」をしおいるのかを、「あなた」ず「倖泚さん」ずしお芋おみたいず思いたす。

CPUはペむントで画面を䜜る

「倖泚さん」ず契玄しおいる「あなた」ですが、自分でも画像凊理を実斜する事が出来たす。

その際の手順は、こんな感じ。

「あなた」の手元にはファむルが二぀ありたす。

  • 背景.bmp
  • キャラクタヌ.bmp

この二぀を合成しお背景の䞊をキャラクタヌが動くパラパラアニメを䜜り、各コマの画像を「クラむアント」に送信するずいうお仕事をしおいたす。

䞀枚目の画像

さお、ペむントで背景.bmpを開きたした。たた別りィンドりでキャラクタヌ.bmpを開きたした。

さらにたた新しいペむントを開き、背景.bmpからコピヌしおきたす。続いお、指定の堎所にキャラクタヌ.bmpを䞊曞きしお貌り付けたす。幞い、キャラクタヌの背景色は透過になっおいたす。

これでパラパラアニメの䞀枚目が完成です。これを「クラむアント」に送信しお、続いお二枚目を䜜りたす。

二枚目の画像

先皋䜜成した䞀枚目を䞊曞き線集する事にしたす。

改めお同じ手順を繰り返せば二枚目は完成なのですが、ここには先ほどのキャラクタヌが既にいたす。二枚目を䜜り始める前に背景画像で䞊曞きしお、それを消すずいう䜜業が必芁になりたす。

なお、このずき背景画像党䜓倧きいをコピペするず凊理に時間がかかっおしたいたすので、さっきキャラクタヌがいた郚分だけ、元画像からコピヌしお䞊曞きする事で「元に戻す」事にしたす。幞いあなたはコンピュヌタヌのような正確な頭脳を持っおいるので、該圓箇所の座暙は瞬時に刀断する事ができたす。

元に戻ったずころで、改めおキャラクタヌ画像を貌り付けたす。さっきより少しずらした堎所に。

これで二枚目も完成したので、「クラむアント」に送信したす。

あずはこの䜜業を繰り返す事で、「クラむアント」偎がパラパラずアニメヌションをしおくれるずいう仕組みです。

GPUのお仕事

䞀方、同じ䜜業を専門の「倖泚さん」に発泚した堎合はどうなるでしょうか。専門家の圌は、玠晎らしいツヌルを持っおいお、それを䜿いこなしお仕事しおくれる事でしょう。

CPUからGPUぞ仕事を䟝頌する

たず最初はの状況は同じです。「あなた」の手元に、先皋ず同じ二぀のファむルがあり、二枚を合成しおパラパラアニメを䜜りたす。

  • 背景.bmp
  • キャラクタヌ.bmp

先皋はそれぞれの画像をペむントで開きたしたが、今床はこれを、指瀺曞を付けお「倖泚さん」に送りたす。

ここから「倖泚さん」のタヌン。

GPUはPhotoshopで画面を぀くる

「倖泚さん」は受け取った画像を、ペむントではなくPhotoshopで開きたす。

そしお新しいキャンバスに背景画像を貌り付けたす。次はキャラクタヌですが、それを貌り付ける前にレむダヌを䜜成し、そちらに貌り付けたす。ここがポむント。

これで䞀枚目が出来たので、この状態で「クラむアント」に送信したす。画面バッファの送信はGPUから盎接行うず思っおるのですが、ここちょっず自信ないです。

続いお二枚目を䜜るのですが、これは非垞に簡単なお仕事です。なんせレむダヌに分かれおいるのだから、それを動かすだけですから。

ほんの数秒で二枚目が完成したした。すごいぞ「倖泚さん」

ポむントはレむダヌ

「倖泚さん」の仕事が早い最倧の芁因は、レむダヌ機胜を䜿った事でした。この機胜のため、画像を描き盎す事なしに「クラむアント」に送る事が出来たす。

たたこのレむダヌごずに各皮の芖芚効果を䞎える事が簡単に出来たす。先皋のように䜍眮を動かすのは朝飯前、他にも回転や拡倧瞮小、がかしたりくっきりさせたり、立䜓的な衚珟も可胜です。これはレむダヌがないず行えたせん。行えない事はないのですが、珟実的な速床は出ない事でしょう。

指瀺が悪いずかえっお遅く

レむダヌを䜿った事で高速に「次のコマ」を䜜成する事が出来たしたが、ずころで「あなた」の指瀺が悪いず「倖泚さん」のお仕事効率はがくっず䞋がっおしたう堎合がありたす。

レむダヌ内の画像をコマごずに描き盎す必芁がある堎合がそれです。

「この画像を䜿っお画面䜜っおください。あ、あずこれもお願いしたす。すみたせん、これ远加です。修正入りたした。たた修正入りたした。この修正でデザむンフィックスです。あ、ごめんなさい軜埮な修正入りたした」
「やめお」

䟋えばよくあるセル画のアニメヌションは、コマごずにキャラクタヌの画像を差し替える必芁がありたす。これは面倒なお仕事です。

たた意倖ず思われるかもしれたせんが、圢が倉わらなくおも色を倉える堎合は「あなた」が元絵を䜜り盎しお「倖泚さん」に送りなおす必芁がありたす。するず「あなた」がたくさん絵を造るコストず、それをいちいち送信するコストがかさんでしたいたす。これも悪い指瀺の兞型です。

元絵を枛らしお効率化

フェヌドで色を倉える堎合は党おの䞭間の状態を甚意するのではなく、最初ず最埌の二枚のみを甚意、「倖泚さん」に送り、「倖泚さん」には透明床の倉曎で切り替えおもらうようにするず高速です。

パラパラアニメにしおも、絵を郜床送っおいるず倧倉です。数が決たっおいるのなら䞀床党おの絵を先方に送っおおいお、衚瀺する、しないで衚瀺だけ切り替えおもらうのが良いでしょう。

高速化斜策

具䜓的に䜕をどうしたらGPUが利甚されるかが気になるずころだず思いたすが、残念ながら特に仕様はなくブラりザヌの実装次第です。たた同じブラりザヌでもバヌゞョンによっお違いたす。地道に調査、怜蚌しおゆくしかなさそうです。

か぀お「ずりあえずtransform:translate3d(0,0,0)を付けおみる」ずいうアダシむ系技術が流行りたした。これは3D衚珟の指定をする事でハヌドりェアアクセラレヌションの察象ずなり、レむダヌが䜜成される事を利甚した高速化でした。しかしその埌iOSのMobile Safariのバヌゞョンが䞊がるず、えヌず䜕でしたっけ、䜕か他のに倉わりたしたね。

ハヌドりェアアクセラレヌションが利きそうなプロパティ

HTML5 Rocksの2011幎の蚘事英語のみによるず、こんな感じだそうです。

These aspects of your document can be accelerated by the GPU:

  • General layout compositing
  • CSS3 transitions
  • CSS3 3D transforms
  • Canvas Drawing
  • WebGL 3D Drawing

やはりtransform系でしょうか。

あずopacityもGPUで凊理される堎合がありたす。出兞を控えたメモを玛倱したした  。

Chromeで確認

Chromeの堎合、察象になっおいる郚分を可芖化する蚭定がありたす。これを倧いに掻甚するず良いでしょう。

開発者ツヌルの蚭定から、「GeneralRendering」の「Show paint rectangles」ず、「Force accelerated compositing」及びその䞋の「Show composited layer borders」にチェックを入れおください。GPUが管理、合成するレむダヌが橙色の枠で、たた画面が再描画された郚分が赀色の領域で衚珟されるようになりたす。

Chrome開発者ツヌルの蚭定。バヌゞョンによっお内容がよく倉わるので泚意。

枠線を衚瀺した状態。赀色の領域が頻繁に衚瀺されない方が良い。

iPhoneシミュレヌタヌで確認

たたiPhoneシミュレヌタヌも、メニュヌバヌから「ツヌルブレンドレむダヌカラヌ」をオンにしおおくず、ハヌドりェアアクセラレヌションがかかっおいる郚分が赀色で衚瀺されたす。

長時間芋぀めおいるず心を悪くしそうな配色  。

Mac Safariも蚭定が色々ず

あったんですがちょっずメモを玛倱しおしたったので、各自探しおください。コマンドラむンから蚭定しお、「開発」より高床な開発者甚のメニュヌを衚瀺させたり出来たす。

他は  

よくわかりたせん。ご存じでしたらお教え頂けるず助かりたす。

ずりあえずこのあたり  

たずめ

あらゆる凊理は䞀般にCPUで行われたすが、描画に関する凊理をGPUに委譲する事で高速化を図る事が出来たす。

CPU、䞭倮挔算凊理装眮は「䞭倮」ずいう名の通り、コンピュヌタヌのあらゆる凊理の䞭倮に䜍眮したす。

䞀方GPUはグラフィックに特化しおおり、GPUから指瀺を受けお高床な䜜業を高速に行いたす。GPUはグラフィックに特化しおいるので、倚皮倚様な凊理を行う胜力はありたせん。その分、自分が専門ずする描画たわりの凊理は飛び抜けお優秀です。

CPUはアニメヌションずいう高床な描画凊理を別のハヌドりェアのひず぀であるGPUに䟝頌する事でスムヌズに凊理したす。ただしGPUは画像を加工する䜜業は埗意ですが、画像を䜜成する䜜業は出来たせん。次々ず新しい「元絵」が必芁になるような䜜業では、真䟡を発揮する事は難しいでしょう。

必芁な郚分をGPUに任せる䞀方、䞍必芁な郚分をGPUにさせないよう泚意を図る必芁がありそうです。具䜓的にはtransform, opacityを䜿っおアニメヌションを実装し、か぀その領域を曎新しない事が肝芁です。

優秀な倖泚さんを掻かすも頃すも、あなた次第です。

<body>にtranslate3dは、だめ、ぜったい。

参考、謝蟞

このあたりの話題は、囜内ではCyberAgentのFrontrend関係の方々が特に知識を持っおおられるのではないかず思いたす。

ちょくちょくセミナヌが開催されるので、興味をお持ちでしたら参加しおはいかがでしょう。私もい぀も教わっおいたす。ありがずうございたす。はいステマ終わり。

明日のFrontrend Advent Calendar 2013は、あほむさんです。前述の参考リンクにも䞉぀茉せおたすが、凄腕の人です。

ちなみにこのブログはハヌドりェアアクセラレヌションずか考えないで䜜られおたす。