誰ãããææ°ã®ãã©ãŠã¶ãŒãããŒãžã®äžéšãGPUã§æç»ã§ããããšãæ¢ã«ç¥ã£ãŠãããšæããŸãã ããã¯ç¹ã«ã¢ãã¡ãŒã·ã§ã³ã§é¡èã§ãã ããšãã°ãCSS transform
ããããã£ã䜿çšããŠäœæãããã¢ãã¡ãŒã·ã§ã³ã¯ã top/left
ã䜿çšããŠäœæãããã¢ãã¡ãŒã·ã§ã³ãããã¯ããã«çŸããæ»ããã«èŠããŸãã ãã ãããGPUã§ã¢ãã¡ãŒã·ã§ã³ãæ£ããäœæããæ¹æ³ããšãã質åã«ã¯ãéåžžããuse transform: translateZ(0)
ãŸãã¯will-change: transform
ããªã©ã®ããã«çããããŸãã ãããã®ããããã£ã¯æ¢ã«zoom: 1
ãããªãã®ã«ãªã£ãŠããŸãzoom: 1
IE6ã®å Žåã¯ïŒãã©ãŠã¶ãŒã®éçºè
ãåŒã³åºãããšã奜ãã®ã§ãGPUãŸãã¯ã³ã³ããžã·ã§ã³ ïŒåæïŒã§ã¢ãã¡ãŒã·ã§ã³çšã®ã¬ã€ã€ãŒãæºåããããã«IE6ã®å ŽåïŒ
ãã ããåçŽãªãã¢ã§çŸããã¹ã ãŒãºã«æ©èœããã¢ãã¡ãŒã·ã§ã³ã¯ã宿ãããµã€ãã§çªç¶ã¹ããŒããŠã³ãå§ããããŸããŸãªèŠèŠçãªã¢ãŒãã£ãã¡ã¯ããåŒãèµ·ãããããããã«æªãããšã«ãã©ãŠã¶ãã¯ã©ãã·ã¥ãããããŸãã ãªããããèµ·ãã£ãŠããã®ã§ããïŒ ããã«å¯ŸåŠããæ¹æ³ã¯ïŒ ãã®èšäºãçè§£ããŠã¿ãŸãããã
1ã€ã®å€§ããªå
責äºé
GPUã³ã³ããžã·ã§ã³ã®è©³çŽ°ãæ€èšããåã«ãç§ãèšãããæãéèŠãªããšã¯ã ããã¯ãã¹ãŠ1ã€ã®å·šå€§ãªããã¯ã§ãã W3C仿§ïŒå°ãªããšãçŸæç¹ã§ã¯ïŒã«ã¯ãGPUã³ã³ããžã·ã§ã³ããã»ã¹ã®èª¬æãèŠçŽ ãå¥ã®ã¬ã€ã€ãŒã«æç€ºçã«è»¢éããæ¹æ³ããŸãã¯ã³ã³ããžã·ã§ã³ã¢ãŒãèªäœãããããŸããã ããã¯ãããã€ãã®äžè¬çãªã¿ã¹ã¯ãã¹ããŒãã¢ããããããã®åãªãæ¹æ³ã§ããããã¹ãŠã®ãã©ãŠã¶ãŒéçºè
ãç¬èªã®æ¹æ³ã§å®è¡ããŸãã ãã®èšäºã§èªããã¹ãŠã¯å
¬åŒã®èª¬æã§ã¯ãããŸããããããã€ãã®ãã©ãŠã¶ãŒãµãã·ã¹ãã ã®æäœã«é¢ããåžžèãšç¥èã«é·ããå®éšãšèгå¯ã®çµæã§ãã äœããçå®ã§ã¯ãªããããããŸããããäœãã¯æéãšãšãã«å€åããŸã-ç§ã¯ããªãã«èŠåããŸããïŒ
äœæ²ã®ä»çµã¿
GPUã¢ãã¡ãŒã·ã§ã³çšã®ããŒãžãé©åã«æºåããã«ã¯ãã€ã³ã¿ãŒããããŸãã¯ãã®èšäºã«ãããã³ãã«åŸãã ãã§ãªãããã©ãŠã¶ãŒå
ã§ã®åäœãçè§£ããããšãéåžžã«éèŠã§ãã
position: absolute
ãšç°ãªãz-index
ã§ããèŠçŽ A
ãšB
ãæã€ããŒãžããããšãz-index
ã ãã©ãŠã¶ã¯ããŒãžå
šäœãCPUã«æç»ããçµæã®ç»åãGPUã«éä¿¡ããããããç»é¢ã«å°éããŸãã
<style> #a, #b { position: absolute; } #a { left: 30px; top: 30px; z-index: 2; } #b { z-index: 1; } </style> <div id="#a">A</div> <div id="#b">B</div>

CSS Animationsã䜿çšããŠãCSS left
ããããã£ãä»ããŠèŠçŽ A
ã®åããã¢ãã¡ãŒã·ã§ã³åããããšã«ããŸããã
<style> #a, #b { position: absolute; } #a { left: 10px; top: 10px; z-index: 2; animation: move 1s linear; } #b { left: 50px; top: 50px; z-index: 1; } @keyframes move { from { left: 30px; } to { left: 100px; } } </style> <div id="#a">A</div> <div id="#b">B</div>

ãã®å Žåãã¢ãã¡ãŒã·ã§ã³ã®åãã¬ãŒã ã«å¯ŸããŠãCPUåŽã®ãã©ãŠã¶ãŒã¯èŠçŽ ã®ãžãªã¡ããªãåã«ãŠã³ãïŒãªãããŒïŒããããŒãžã®çŸåšã®ç¶æ
ã§æ°ããã€ã¡ãŒãžãæç»ïŒãªãã€ã³ãïŒããGPUã«éä¿¡ããåŸãç»é¢ã«è¡šç€ºãããŸãã åæç»ã¯ããªãé«äŸ¡ãªæäœã§ããããšãããã£ãŠããŸãããææ°ã®ãã©ãŠã¶ã¯ãã¹ãŠãç»åå
šäœã§ã¯ãªãã倿Žãããéšåã®ã¿ãåæç»ããã®ã«ååã¹ããŒãã§ãã ãããŠã圌ãã¯ãããååã«éãããŸãããã¢ãã¡ãŒã·ã§ã³ã¯ãŸã æ»ããããæ¬ ããŠããŸãã
ã¢ãã¡ãŒã·ã§ã³ã®åã¹ãããã®ããŒãžå
šäœã®éšåçã§ã¯ãããããžãªã¡ããªã®åèšç®ãšåæç»ïŒç¹ã«å€§èŠæš¡ã§è€éãªãµã€ãã§ã¯ãéåžžã«æéããããæäœã®ããã«èŠããŸãã èŠçŽ A
ãšèŠçŽ A
ãªãããŒãžèªäœã®2ã€ã®ç»åãäžåºŠæç»ããŠããããããã®ç»åãçžå¯Ÿçã«ç§»åããã ãã®æ¹ãã¯ããã«å¹ççã§ãã ã€ãŸãããã£ãã·ã¥ãããèŠçŽ ã®ç»åã®æ§æãäœæããå¿
èŠããããŸãã ãããŠãããã¯ãŸãã«GPUãæãããåŠçããã¿ã¹ã¯ã§ãã ããã«ã圌ã¯ãµããã¯ã»ã«ç²ŸåºŠã§ãããè¡ãæ¹æ³ãç¥ã£ãŠãããéåžžã«æ»ãããªã¢ãã¡ãŒã·ã§ã³ãæäŸããŸãã
ã³ã³ããžã·ã§ã³ã§æé©åãé©çšããã«ã¯ããã©ãŠã¶ã¯ã¢ãã¡ãŒã·ã§ã³åãããCSSããããã£ã確èªããå¿
èŠããããŸãã
- ææžã®æµãã«åœ±é¿ãäžããããšã¯ãããŸããã
- ææžã®æµãã«æ±ºããŠäŸåããªãã
- èŠçŽ èªäœãåæç»ããå¿
èŠã¯ãããŸããã
暪ããèŠããšã top
position: absolute/fixed
ãšleft
ããããã£ã¯position: absolute/fixed
ãšäžç·ã«å€çèŠå ã«äŸåããŠããªãããã«èŠãããããããŸããããããã§ã¯ãããŸããã ããšãã°ã left
ããããã£ã¯ã .offsetParent
ã®ãµã€ãºã«äŸåããããŒã»ã³ãåäœã®å€ãšãç°å¢ã«äŸåããem
ã vh
ãªã©ã®åäœãåãããšãã§ããŸãã ãããã£ãŠã説æã«é©åããã®ã¯ã transform
ãšopacity
CSSããããã£ã§ãã
ã¢ãã¡ãŒã·ã§ã³ãäœãçŽããŸãããïŒ left
代ããã«ã transform
ãã¢ãã¡ãŒã·ã§ã³åãtransform
ïŒ
<style> #a, #b { position: absolute; } #a { left: 10px; top: 10px; z-index: 2; animation: move 1s linear; } #b { left: 50px; top: 50px; z-index: 1; } @keyframes move { from { transform: translateX(0); } to { transform: translateX(70px); } } </style> <div id="#a">A</div> <div id="#b">B</div>
ã³ãŒãã«æ³šæããŠãã ããã ã¢ãã¡ãŒã·ã§ã³å
šäœã宣èšçã«èª¬æããŸããïŒéå§ãçµäºãç¶ç¶æéãªã©ã ããã«ããããã©ãŠã¶ã¯ãã¢ãã¡ãŒã·ã§ã³ãéå§ãããåã§ããèŠçŽ ã®ã©ã®CSSããããã£ã倿Žãããããæ£ç¢ºã«æ±ºå®ã§ããŸãã ãããã®ããããã£ã®äžã«ãªãããŒ/ãªãã€ã³ãã«åœ±é¿ãããã®ããªãããšã確èªãããšããã©ãŠã¶ã¯ã³ã³ããžã·ã§ã³ã§æé©åãé©çšã§ããŸãã2ã€ã®ç»åãæç»ããŠGPUã«è»¢éããŸãã

ãã®ãããªæé©åã®å©ç¹ïŒ
- ãµããã¯ã»ã«ã¹ã ãŒãžã³ã°ã䜿çšããéåžžã«ã¹ã ãŒãºãªã¢ãã¡ãŒã·ã§ã³ïŒçŸåšããã®ãããªã¿ã¹ã¯çšã«ç¹å¥ã«æé©åãããã°ã©ãã£ãã¯ããã»ããµã«åãçµãã§ããŸãã
- ã¢ãã¡ãŒã·ã§ã³ã¯CPUã«äŸåããŸããããã®æç¹ã§éåžžã«éäžçãªèšç®ãå®è¡ããŠããGPUã§å®å
šã«å®è¡ããããããã¢ãã¡ãŒã·ã§ã³ã¯åŒãç¶ãã¹ã ãŒãºã§ãã
ãã¹ãŠãã·ã³ãã«ã§æç¢ºãªããã«æããŸãããã©ã®ãããªåé¡ãçºçããå¯èœæ§ããããŸããïŒ ãã®ãããªæé©åãå®éã«è¡ãããšãèŠãŠã¿ãŸãããã
ããã¯äžéšã®äººã«ãšã£ãŠã¯å瀺ãããããŸããããGPUã¯å¥ã®ã³ã³ãã¥ãŒã¿ãŒã§ãã ã¯ãããã¹ãŠã®ææ°ããã€ã¹ã®äžå¯æ¬ ãªéšåã¯ãå®éã«ã¯ãç¬èªã®ããã»ããµãã¡ã¢ãªãããã³æ
å ±åŠçæ¹æ³ãåããç¬ç«ãããµãã·ã¹ãã ã§ãã ãŸãããã©ãŠã¶ã¯ãä»ã®ããã°ã©ã ãã²ãŒã ãšåæ§ã«ãå¥ã®ããã€ã¹ãšåæ§ã«GPUãšéä¿¡ããå¿
èŠããããŸãã
ãããããããçè§£ããã«ã¯ãAJAXãèŠããŠãããŠãã ããã ããšãã°ããŠãŒã¶ãŒãæ¿èªãã©ãŒã ã«å
¥åããããŒã¿ã«åŸã£ãŠãŠãŒã¶ãŒãç»é²ããå¿
èŠããããŸãã ãµãŒããŒã¯ãã©ãŠã¶ã®ã¡ã¢ãªã«ã¢ã¯ã»ã¹ã§ããªãããããªã¢ãŒããµãŒããŒã«ããããã®ãã£ãŒã«ããšãã®å€æ°ããããŒã¿ãååŸããŠããŒã¿ããŒã¹ã«ä¿åããããšäŒããããšã¯ã§ããŸããã 代ããã«ãããŒãžããå¿
èŠãªããŒã¿ãåçŽãªããŒã¿åœ¢åŒïŒJSONãªã©ïŒã§ããçš®ã®ãã€ããŒãã«åéãããµãŒããŒã«éä¿¡ããŸãã
åãããšãäœæ²äžã«ãèµ·ãããŸãã GPUã¯å®éã«ã¯ãªã¢ãŒããµãŒããŒã§ãããããCPUåŽã®ãã©ãŠã¶ãŒã¯æåã«ç¹å¥ãªãã€ããŒããæºåããŠãããããã€ã¹ã«éä¿¡ããå¿
èŠããããŸãã ã¯ããGPUã¯CPUã«éåžžã«è¿ãã§ãããAJAXãä»ããŠå¿çãéåä¿¡ããã®ã«2ç§ãããããšãå€ãå ŽåãGPUã«ããŒã¿ã転éããããã®äœåãª3-5ããªç§ãã¢ãã¡ãŒã·ã§ã³ã®åè³ªã«æ·±å»ãªåœ±é¿ãäžããå¯èœæ§ããããŸãã
GPUã®ãã€ããŒãã¯äœã§ããïŒ ååãšããŠããããã¯ã¬ã€ã€ãŒã®ç»åãšãã¬ã€ã€ãŒã®ãµã€ãºãçžäºã®çžå¯Ÿçãªäœçœ®ãã¢ãã¡ãŒã·ã§ã³ã®æç€ºãªã©ã決å®ãã远å ã®æç€ºã§ãã è² è·ãäœæããŠGPUã«è»¢éããããã»ã¹ã¯æ¬¡ã®ããã«ãªããŸã
- åè€åã¬ã€ã€ãŒãåå¥ã®ç»åã«ã¬ã³ããªã³ã°ããŸãã
- ã¬ã€ã€ãŒäžã®ããŒã¿ã®æºåïŒå Žæããµã€ãºãéæåºŠãªã©ïŒã
- ã¢ãã¡ãŒã·ã§ã³çšã®ã·ã§ãŒããŒã®æºåïŒCSSãã©ã³ãžã·ã§ã³ãŸãã¯ã¢ãã¡ãŒã·ã§ã³ã䜿çšããŠããå ŽåïŒã
- GPUã«ããŒã¿ãéä¿¡ããŸãã
ãããã£ãŠãmagic transform: translateZ(0)
ãŸãã¯will-change: transform
èŠçŽ ã«è¿œå ãããã³will-change: transform
ããã»ã¹å
šäœãéå§ãããŸãã åæç»ã¯ãªãœãŒã¹ã倧éã«æ¶è²»ããã¿ã¹ã¯ã§ããããšã¯æ¢ã«ç¥ã£ãŠããŸãã ãã ãããã®å Žåã¯ããã«æªãããšã§ããå€ãã®å Žåããã©ãŠã¶ã¯ã€ã³ã¯ãªã¡ã³ã¿ã«åãã€ã³ããé©çšã§ããã倿Žãããéšåã®ã¿ãåæç»ã§ããŸããã 圌ã¯ãæ°ããã¬ã€ã€ãŒã«ãã£ãŠé ãããããŒããåæç»ããå¿
èŠããããŸãã

æé»ã®æ§æ
èŠçŽ A
ãšB
äŸã«æ»ããŸãããB
以åã¯ãããŒãžäžã®ä»ã®ãã¹ãŠã®èŠçŽ ã®äžã«ããèŠçŽ A
ãã¢ãã¡ãŒã·ã§ã³åããŸããã ãã®çµæã2ã€ã®ã¬ã€ã€ãŒã®ã³ã³ããžã·ã§ã³ãåŸãããŸããA
ã®ã¬ã€ã€ãŒãšB
ã¬ã€ã€ãŒãšããŒãžã®èæ¯ã§ãã
ã¿ã¹ã¯ã倿ŽããŸãããïŒèŠçŽ B
ãã¢ãã¡ãŒã·ã§ã³åããŸã...

...ãããŠè«ççãªåé¡ããããŸãã èŠçŽ B
ã¯å¥ã®è€åã¬ã€ã€ãŒäžã«ããå¿
èŠãããããŠãŒã¶ãŒã«è¡šç€ºãããç»åã®æçµçãªæ§æã¯GPUäžã«ãããŸãã ãã ãããŸã£ããè§ŠããªãèŠçŽ A
ãèŠèŠçã«èŠçŽ B
äžã«ããå¿
èŠããããŸãB
One Big DisclaimerãæãåºããŠãã ãããCSSã«ã¯GPUã³ã³ããžã·ã§ã³çšã®ç¹å¥ãªã¢ãŒãã¯ãªããç¹å®ã®åé¡ã解決ããããã®æé©åã«ãããŸããã z-index
æå®ãããé åºã§èŠçŽ A
ãšB
æ£ç¢ºã«ååŸããå¿
èŠãããz-index
ã ãã®å Žåããã©ãŠã¶ã¯äœããã¹ãã§ããïŒ
ããã§ãïŒèŠçŽ A
ãå¥ã®è€åã¬ã€ã€ãŒã«è»¢éããŸãïŒ ãããã£ãŠãå¥ã®éãåãã€ã³ãã远å ããŸãã

ããã¯æé»çã³ã³ããžã·ã§ã³ãšåŒã°ããŸããã³ã³ããžãããšã¬ã¡ã³ãããäžã®z-index
1ã€ä»¥äžã®éã³ã³ããžãããšã¬ã¡ã³ããã³ã³ããžããã«ãªããŸããã€ãŸããåå¥ã®ã€ã¡ãŒãžã«æç»ãããGPUã«éä¿¡ãããŸãã
æé»ã®ã³ã³ããžã·ã§ã³ã¯ãæã£ãŠãããããã¯ããã«é »ç¹ã«çºçããŸãããã©ãŠã¶ã¯ãå€ãã®çç±ã§è€åã¬ã€ã€ãŒã«èŠçŽ ããããããŸãã
- 3D倿ïŒ
translate3d
ã translateZ
ãªã© - èŠçŽ
<video>
ã <canvas>
ã <iframe>
ã Element.animate()
ãElement.animate()
ã¢ãã¡ãŒã·ã§ã³ãtransform
ããã³opacity
ãŸãã- CSSãã©ã³ãžã·ã§ã³ãšã¢ãã¡ãŒã·ã§ã³ã䜿çšããŠãã¢ãã¡ãŒã·ã§ã³ã倿ããã³
opacity
ãŸãã position: fixed
ãwill-change
ãŸããfilter
詳现ã«ã€ããŠã¯ãChromiumãããžã§ã¯ãã®CompositingReasons.hãã¡ã€ã«ãåç
§ããŠãã ããã
äžèŠãããšãGPUã¢ãã¡ãŒã·ã§ã³ã®äž»ãªåé¡ã¯ãäºæ³å€ã®å€§éã®åæç»ã§ããããã«æãããããããŸããã ããããããã¯ããã§ã¯ãããŸããã æå€§ã®åé¡ã¯...
ã¡ã¢ãªæ¶è²»
ãŸããGPUã¯å¥ã®ã³ã³ãã¥ãŒã¿ãŒã§ããããšãæãåºããŠãã ããã ã¬ã³ããªã³ã°ãããã¬ã€ã€ãŒç»åã¯ãGPUã«è»¢éããã ãã§ãªããGPUã«ä¿åããå¿
èŠããããããçŸããã¢ãã¡ãŒã·ã§ã³åã§ããŸãã
1ã€ã®ã¬ã€ã€ãŒã®ç»åã®ééã¯ã©ããããã§ããïŒ äŸãèŠãŠã¿ãŸãããã åè²#ff0000
ã§å¡ãã€ã¶ããããµã€ãº320Ã240ã®éåžžã®é·æ¹åœ¢ã®ãµã€ãºãæšæž¬ããŠã¿ãŠãã ããã

éåžžãWebéçºè
ã¯æ¬¡ã®ããã«èããŸãããããã¯åè²ã®ç»åã§ã... PNGã§ä¿åãããµã€ãºã確èªããŸãã1ãããã€ãæªæºã§ããå¿
èŠããããŸããã ãããŠã圌ãã¯æ£ããã§ãããïŒãã®ç»åã¯æ¬åœã«PNGã§ããã104ãã€ãã®éãã§ãã
ãããåé¡ã¯ãPNGïŒJPEGãGIFãªã©ïŒãããŒã¿ãä¿åããã³éä¿¡ããããã®åœ¢åŒã§ããããšã§ãã ãã®ãããªç»åãç»é¢ã«æç»ããã«ã¯ãã³ã³ãã¥ãŒã¿ãŒããããè§£åãã ãã¯ã»ã«ã®é
åãšããŠæç€ºããå¿
èŠããããŸãã ãããã£ãŠãã³ã³ãã¥ãŒã¿ãŒã®ã¡ã¢ãªå
ã®ã€ã¡ãŒãžã¯ã 320Ã240Ã3 = 230,400ãã€ããå æããŸã ã ã€ãŸããç»åã®å¹
ã«é«ããæããŠããã¯ã»ã«æ°ãååŸããŸãã æ¬¡ã«ãåãã¯ã»ã«ã®è²ã3ãã€ãïŒRGBïŒã§èšè¿°ãããããããã¯ã»ã«æ°ã«3ãæããŸãã ç»åãåéæã®å ŽåãéæåºŠå€ïŒRGBAïŒãèšè¿°ããããã«320Ã240Ã4 = 307,200ãã€ãã®å¥ã®ãã€ããå¿
èŠãªã®ã§ã4ãæããŸã ã
ãã©ãŠã¶ãŒã¯åžžã« RGBAã€ã¡ãŒãžã§è€åã¬ã€ã€ãŒãã¬ã³ããªã³ã°ããŸããæããã«ãã¬ã³ããªã³ã°ãããDOMèŠçŽ ã«éæãªé åããããã©ãããèªåçã«å€æããã®ã«ååã§å¹æçãªæ¹æ³ã¯ãããŸããã
å
žåçãªäŸãèããŠã¿ãŸãããïŒãµã€ãºã800Ã600ã®åç10æã®ã«ã«ãŒã»ã«ã ã«ã«ãŒã»ã«å
ã®ç»åãã¹ã ãŒãºã«å€æŽããããšã«ããã®ã§ã will-change: transform
åçããšã«äºåã«will-change: transform
ãæå®ããJSã䜿çšããŠããã©ãã°ã¢ã³ããããããªã©ã®ãŠãŒã¶ãŒã¢ã¯ã·ã§ã³ãžã®é·ç§»ãã¢ãã¡ãŒã·ã§ã³åããŸããã ãã®ãããªããŒãžãåçŽã«è¡šç€ºããããã«å¿
èŠãªè¿œå ã¡ã¢ãªã®éãèšç®ããŠã¿ãŸãããïŒ800Ã600Ã4Ã10â19 MB ã
1ããŒãžããã1ã€ã®ã³ã³ãããŒã«ãæç»ããã«ã¯ã19 MBã®è¿œå ã¡ã¢ãªãå¿
èŠã§ããã ãŸããå€ãã®ã¢ãã¡ãŒã·ã§ã³ã³ã³ãããŒã«ãèŠå·®å¹æãç¶²èç»åããã®ä»ã®èŠèŠçèŠçŽ ãåããSPAããŒãžã«å¯ŸããçŸä»£ã®éçºè
ã®ææ
ãèããã°ãããŒãžããã100ã200 MBã®è¿œå ã¯éçãã¯ããã«è¶
ããŠããŸãã ããã«æé»ã®æ§å³ã远å ããŸãïŒãããåã«èããããšããããŸãããïŒ:)ãéåžžã«æ²ããç»åã衚瀺ãããŸãã
ããã«ããŸã£ããåãçµæã衚瀺ããããã ãã«ããã®è¿œå ã¡ã¢ãªãç¡é§ã«ãªãããšããããããŸãã

ãŸãããã¹ã¯ãããã¯ã©ã€ã¢ã³ãã®å Žåãããã¯ãŸã ããã»ã©é¡èã§ã¯ãããŸããããã¢ãã€ã«ããã€ã¹ã®å Žåããã®åé¡ã¯ç¹ã«æ·±å»ã§ãã 第äžã«ãã»ãšãã©ãã¹ãŠã®ææ°ããã€ã¹ã§é«ãã¯ã»ã«å¯åºŠã®ç»é¢ã䜿çšãããŠããŸããã¬ã€ã€ãŒç»åã«å¥ã®4ã9ãæããŸãã 第äºã«ããã®ãããªããã€ã¹ã¯ãã¹ã¯ããããšæ¯èŒããŠããªãã®ã¡ã¢ãªãæã£ãŠããŸã ã ããšãã°ããŸã ããã»ã©å€ããªãiPhone 6ã®ã¡ã¢ãªã¯1 GBã®ã¿ã§ãããRAMããã³VRAMïŒGPUçšã®ã¡ã¢ãªïŒã«å
±éã§ãã ãããããã®ã¡ã¢ãªã®3åã®1ãã·ã¹ãã ããã»ã¹ãšããã¯ã°ã©ãŠã³ãããã»ã¹ã§äœ¿çšãããããã«3åã®1-ãã©ãŠã¶ãšçŸåšã®ããŒãžã§äœ¿çšãããããšãèãããšïŒãããŠãããã¯ããŒã¹ãã¬ãŒã ã¯ãŒã¯ã䜿çšããããã¹ãŠãéåžžã«æé©åãããšããæ¡ä»¶ã§ïŒãGPUç¹æ®å¹æã®ããã«æ®ããŸãçŽ200ã300 MBã ããã«ãiPhone 6ã¯ãããæé ãªäŸ¡æ Œã®ã¡ã¢ãªããã€ã¹äžã«ããé«äŸ¡ãªãã€ãšã³ãããã€ã¹ãæããŸãã
åççãªè³ªåããããããããŸããïŒ PNGç»åãGPUã«ä¿åããŠã¡ã¢ãªãç¯çŽããããšã¯å¯èœã§ããïŒ ã¯ããæè¡çã«ã¯å¯èœã§ãããGPUã®ç¹åŸŽã¯ã åã¬ã€ã€ãŒããã¯ã»ã«ããšã«æç»ãããããšã§ãã ã€ãŸããç»é¢ã«1ãã¯ã»ã«ãæç»ããã«ã¯ãPNGç»åãæ¯ååãã³ãŒãããŠå¿
èŠãªè²ãååŸããå¿
èŠããããŸãã ãã®å ŽåãæãåçŽãªã¢ãã¡ãŒã·ã§ã³ã®é床ã1 fpsãè¶
ããããšã¯ã»ãšãã©ãããŸããã
GPUã«ã¯ç¬èªã®ç»åå§çž®åœ¢åŒããããŸãã ãå§çž®çã«é¢ããŠã¯PNGãJPEGã«ãè¿ããªãããšã«æ³šæããŠãã ãããGPUèªäœã®ãµããŒãã«ããããããã®äœ¿çšã®å¯èœæ§ã¯å¶éãããŠããŸãã
é·æãšçæ
GPUã§ã®ã¢ãã¡ãŒã·ã§ã³ã®åäœã®çè«çãªéšåã調ã¹ãã®ã§ã䟿å®äžããããã®äœ¿çšã®ãã¹ãŠã®é·æãšçæãéããŸãããã
ã®ããã«
- ãµããã¯ã»ã«ç²ŸåºŠãš60 fpsã®é床ãåããéåžžã«æ»ãããªã¢ãã¡ãŒã·ã§ã³ã
- æ£ããäœæãããã¢ãã¡ãŒã·ã§ã³ã¯å¥ã®ã¹ã¬ããã§åäœããéãJSæäœã«ãã£ãŠãããã¯ãããŸããã
- ãå®ãã3D倿ã
ã«å¯ŸããŠ
- è€åã¬ã€ã€ãŒäžã®èŠçŽ ã®äœçœ®ã倿Žããã«ã¯ã远å ã®åæç»ãå¿
èŠã§ããå Žåã«ãã£ãŠã¯éåžžã«é
ããªãããšããããŸãïŒã€ã³ã¯ãªã¡ã³ã¿ã«ã§ã¯ãªãèŠçŽ ã®å®å
šãªã¬ã³ããªã³ã°ïŒã
- ã¬ã³ããªã³ã°ãããã¬ã€ã€ãŒã¯GPUã«è»¢éããå¿
èŠããããŸããã¬ã€ã€ãŒãå€ãããµã€ãºã倧ããã»ã©ã転éã«æéãããããŸãã äžçšåºŠããã³åŒ±ãã¢ãã€ã«ããã€ã¹ã§ã¯ãèŠçŽ ãæ¶ããŠãã衚瀺ããããšãã«ãç¹æ»
ãã«æ°ä»ãããšãã§ããŸãã
- åè€åå±€ã¯è¿œå ã®ã¡ã¢ãªãæ¶è²»ããŸãã ã¡ã¢ãªã¯ãã¢ãã€ã«ããã€ã¹ã§ã¯éåžžã«éããããªãœãŒã¹ã§ãã é床ã®ã¡ã¢ãªæ¶è²»ã¯ããã©ãŠã¶ã®ã¯ã©ãã·ã¥ã«ã€ãªããå¯èœæ§ããããŸãïŒ
- æé»çãªæ§æïŒåŸããªãå Žåãåæç»ã®æéãã¡ã¢ãªæ¶è²»ãããã³ãã©ãŠã¶ãŒãããããããããå¯èœæ§ãå¢å ããŸãã
- èŠèŠçãªã¢ãŒãã£ãã¡ã¯ãïŒSafariã§ã®ããã¹ãã¬ã³ããªã³ã°ãããŒãžã®æçã®æ¶å€±ãŸãã¯ããã¿ã
ã芧ã®ãšãããGPUã¢ãã¡ãŒã·ã§ã³ã«ã¯ããã®ç¬èªã®å©ç¹ãã¹ãŠã«å¯ŸããŠãå€ãã®éåžžã«éå€§ãªæ¬ ç¹ããããŸãããã®äž»ãªãã®ã¯ãåæç»ãšã¡ã¢ãªæ¶è²»ã§ãã ãããã£ãŠããã¹ãŠã®æé©åã¯ãããã®2ã€ã®ãã€ã³ãã«æ£ç¢ºã«é¢é£ä»ããããŸãã
ç°å¢ãã«ã¹ã¿ãã€ãºãã
é«å質ã®ã¢ãã¡ãŒã·ã§ã³çšã«ãµã€ããæé©åããåã«ãæé©åã®çµæã ãã§ãªãåé¡ã®ããé åã衚瀺ããç¹å¥ãªããŒã«ãçšæããå¿
èŠããããŸãã
ãµãã¡ãª
Safari Web Inspectorã«ã¯ãããŒãžäžã®ãã¹ãŠã®è€åã¬ã€ã€ãŒãããããæ¶è²»ããã¡ã¢ãªã確èªã§ããåªããããŒã«ãçµã¿èŸŒãŸããŠããŸãããŸããèŠçŽ ãå¥ã®ã¬ã€ã€ãŒã«ç§»åããçç±ã衚瀺ããããšãã§ããŸãã ãã®ããŒã«ã衚瀺ããã«ã¯ïŒ
- Safariã§ãââ¥Iã䜿çšããŠWeb InspectorãéããŸãã åäœããªãå Žåã¯ã[èšå®]> [詳现]ã§[ã¡ãã¥ãŒããŒã« [ éçºã¡ãã¥ãŒã衚瀺]ãªãã·ã§ã³ãæå¹ã«ããŠå詊è¡ããŠãã ããã
- Webã€ã³ã¹ãã¯ã¿ãŒã§ã[èŠçŽ ]ã¿ããã¯ãªãã¯ããå³åŽã®åã§[ã¬ã€ã€ãŒ]ãéžæããŸãã
- ããã§ãïŒèŠçŽ ïŒã¿ãã®äž»èŠéšåã®èŠçŽ ãã¯ãªãã¯ãããšãå³åŽã«ããã®èŠçŽ ã®è€åã¬ã€ã€ãŒã«é¢ããæ
å ±ïŒååšããå ŽåïŒãšãã¬ã€ã€ãŒãæã€ãã¹ãŠã®åèŠçŽ ã®ãªã¹ãã衚瀺ãããŸãã
- åã¬ã€ã€ãŒãã¯ãªãã¯ãããšãæ§æã®çç±ã衚瀺ãããŸãããã©ãŠã¶ãŒãèŠçŽ ãå¥ã®è€åã¬ã€ã€ãŒã«ç§»åããããšã決å®ããçç±ã§ãã

Google Chrome
DevToolsã«ãåæ§ã®ããŒã«ããããŸããããããæå¹ã«ããã«ã¯ç¹å¥ãªãã©ã°ãèšå®ããå¿
èŠããããŸãã
- ãã©ãŠã¶ã§ã
chrome://flags/#enable-devtools-experiments
ã«ç§»åãã Developer Toolsã®å®éšãã©ã°ãæå¹ã«ããŸã ã - ToolIïŒMacïŒãŸãã¯Ctrl-Shift-IïŒPCïŒã§DevToolsãéããã¢ã€ã³ã³ãã¯ãªãã¯ããŸã
å³äžã®[èšå®]ã»ã¯ã·ã§ã³ã«ç§»åããŸãã - ã¡ãã¥ãŒãã[å®éš]ã»ã¯ã·ã§ã³ãéžæãã[ã¬ã€ã€ãŒ]ããã«ããªã³ã«ããŸãã
- DevToolsãå床éããŠéããŸãïŒã¬ã€ã€ãŒããã«ãå©çšå¯èœã«ãªããŸãã

ãã®ããã«ã«ã¯ãã¢ã¯ãã£ããªãã¹ãŠã®è€åããŒãžã¬ã€ã€ãŒãããªãŒãã¥ãŒã§è¡šç€ºãããŸãã ã¬ã€ã€ãŒãéžæãããšããã®ã¬ã€ã€ãŒã«é¢ããæ
å ±ãå©çšå¯èœã«ãªããŸãïŒãµã€ãºãå æã¡ã¢ãªéãåæç»ã®åæ°ãããã³è€åã¬ã€ã€ãŒãžã®åé€ã®çç±ã
æé©å
ãã®ãããç°å¢ãèšå®ããæé©åã«çŽæ¥é²ãããšãã§ããŸãã ã³ã³ããžããã¬ã€ã€ãŒã®äœ¿çšã«é¢ãã2ã€ã®äž»ãªåé¡ãæ¢ã«ç¹å®ããŸããã远å ã®åãã€ã³ãïŒãã®åŸãã¬ã€ã€ãŒã€ã¡ãŒãžãGPUã«è»¢éããå¿
èŠãããïŒãšã¡ã¢ãªæ¶è²»ã§ãã ãããã£ãŠããã¹ãŠã®æé©åã¯ãåæç»ãµã€ã¯ã«ãšã¡ã¢ãªæ¶è²»ã®åæžãç®çãšããŠããŸãã
æé»ã®æ§æãé¿ãã
éåžžã«ã·ã³ãã«ã§æçœã§ãããæãéèŠãªæé©åã æé»ã®ã³ã³ããžã·ã§ã³ãšã¯ãGPUã§å¥ã®æç€ºçãªè€åã¬ã€ã€ãŒïŒãããªãCSSã¢ãã¡ãŒã·ã§ã³ãªã©ïŒãšæ£ããçµåããããã«ã®ã¿ãåå¥ã®è€åã¬ã€ã€ãŒã«èŠçŽ ãåé€ããããšã§ãã ãã®åé¡ã¯ãã¢ãã¡ãŒã·ã§ã³ãéå§ãããšãã«ã¢ãã€ã«ããã€ã¹ã§ç¹ã«åŒ·ãæããããšãã§ããŸãã
å°ããªäŸãèããŠã¿ãŸãããã
ãŠãŒã¶ãŒã¢ã¯ã·ã§ã³ã«ãã£ãŠã¢ãã¡ãŒã·ã§ã³åããèŠçŽ A
ããããŸãã ã¬ã€ã€ãŒããŒã«ã䜿çšããŠããŒãžãèŠããšã远å ã®ã¬ã€ã€ãŒããªãããšãããããŸãã ãã ãã[åç]ãã¿ã³ãã¯ãªãã¯ãããšããã«ãããã€ãã®åæã¬ã€ã€ãŒã衚瀺ãããã¢ãã¡ãŒã·ã§ã³ã®çµãããŸã§ã«æ¶ããŸãã ã¿ã€ã ã©ã€ã³ããŒã«ãèŠããšãã¢ãã¡ãŒã·ã§ã³ã®éå§ãšçµäºã«ããŒãžã®éèŠãªé åã®åæç»ã䌎ãããšãããããŸãã

ãã®äŸã§ãã©ãŠã¶ãäœãããããã¹ãããããšã«èŠãŠã¿ãŸãããã
- , , . â .
- Play
A
â CSS Transition transform
. , z-index
A
B
. . - repaint. -, - , - â . .
- GPU, , . , , GPU . «» : .
A
. , , â A
B
. , ( repaint) GPU. , .4, «».
, :
z-index
. <body>
. , - , DOM- . , , <body>
.- , , CSS-
will-change
. ( !) . , .
, , GPU. , , , , , , 3D-. .
: . , :
<div id="bg-change"></div> <style> #bg-change { width: 100px; height: 100px; background: red; transition: background 0.4s; } #bg-change:hover { background: blue; } </style>
CPU, repaint . GPU: :
<div id="bg-change"></div> <style> #bg-change { width: 100px; height: 100px; background: red; } #bg-change::before { background: blue; opacity: 0; transition: opacity 0.4s; } #bg-change:hover::before { opacity: 1; } </style>
, . - .
. ?

, 40 000 (39 ), â 100 , 400 . ãªãã§ïŒ :
<div id="a"></div> <div id="b"></div> <style> #a, #b { will-change: transform; } #a { width: 100px; height: 100px; } #b { width: 10px; height: 10px; transform: scale(10); } </style>
, #a
â 100Ã100 (100Ã100Ã4 = 40 000 ), #b
â 10Ã10 (10Ã10Ã4 = 400 ), 100Ã100 transform: scale(10)
. #b
- will-change
, transform
GPU .
: width
height
, transform: scale(âŠ)
. , . , , , 5â10% : , .
CSS Transitions Animations
, transform
opacity
CSS Transitions Animations GPU. JS, , , , : translateZ(0)
transform
, will-change: transform, opacity
, .
JS- , requestAnimationFrame
. Element.animate()
CSS-.
CSS Transitions/Animations , â JS , CSS, .
? , JS - ?
CSS- : GPU . , , GPU. JS , â . 60 ( JS ) GPU, . , , CSS-, :
, , JS . CSS- , ( ), JS .
CSS, . , JS.
, Chaos Fighters . - . , , GPU, , . iPhone 5 â Apple â . .
, , .
, - . : CSS-. â : , <img>
CSS- :
. â .
. , , . , . , .
: .sun
, ; .
, , . : 500Ã500Ã4 â 977 .
, 500Ã500 , , ( ) , 3000Ã3000Ã4 = 36 ! âŠ
Layers . : . , GPU. - (), â .
, , ! , .
, : GPU , . , :
- : 500Ã500Ã4 â 977
- 12 : 250Ã40Ã4 Ã 12 â 469
2 . , , . , GPU, .
, CSS , . transform
. 360Ë. , @keyframes
, .
JS-, , ..
, 2 .
. â , , . . , . c GPU , : .
10%. 250Ã0.9 Ã 40Ã0.9 = 225Ã36 . , 250Ã20 , 250/225 â 1.111.
: background-size: cover;
.sun-ray
, , transform: scale(1.111)
.
, , PNG- . , , , PNG-.
GPU 225Ã36Ã4 Ã 12 â 380 ( 469 ). 19% , downscale
. 0.1
, , , , 977 / 380 â 2.5 !
, , : CPU, JS-. , , . , GPU, . .
, Chaos Fighters, . :
- , . .
- Layers, .
- , . ,
position: fixed
, <iframe>
, <video>
. - , . (. Layer Squashing ) â , . : , . ,
translateZ()
. : translateZ(0.0001px)
, translateZ(0.0002px)
.. , . transform: translateZ(0)
will-change: transform
, . GPU , . : . â «» .
One Big Disclaimer : GPU- -. , . , Google Chrome CPU GPU, , . Safari (, background-color
) CPU GPU , .
, GPU .
English version