ãã®èšäºã¯ããµã³ã¯ãããã«ãã«ã¯ã§éå¬ãããHolyJS 2017 JavaScriptã«ã³ââãã¡ã¬ã³ã¹ã§ã®Martinã®ã¹ããŒãã«åºã¥ããŠããããã©ãŠã¶ã§ã®èŠèŠåã®ä»çµã¿ãšããµã€ããé£ã°ãããã«äœãããå¿ èŠããããã«ã€ããŠèªã£ãŠããŸãã
ã¹ããŒã«ãŒã«ã€ããŠ
Martinã¯Archilogicã®ãšã³ãžãã¢ãªã³ã°ãããã§ãã ããã¯ããŠãŒã¶ãŒããã¹ã¯ãããããã³ã¢ãã€ã«ããã€ã¹ã®ãã©ãŠã¶ãŒã§ä»®æ³3Dãã¢ãŒãäœæã§ããããã«ãããååã®WebãµãŒãã¹ãéçºããŠããå°ããªäŒç€Ÿã§ãã
ãµã€ãã¯ãããã¯ãŒã¯ããã©ã®ããã«èªã¿èŸŒãŸããŸããïŒ
ä»æ¥ã¯ãããã¹ããèŠèŠçãªãã®ã«å€æããæ¹æ³ã«ã€ããŠèª¬æããŸãã ããŒã¯ã¢ããã§å§ãŸãããã¯ã»ã«ã§çµãããŸãã ã©ã®ããã«æ©èœããŸããïŒ

ããã©ãŒãã³ã¹ã®æé©åã«ã€ããŠæåã«ç¥ã£ãŠããã¹ãããšã¯ããµã€ãã®èªã¿èŸŒã¿æ¹æ³ã§ãã
- HTMLã¯WebããååŸãããŸã
- å°çæã«HTMLããã¹ã解æããŒã¯ã³
- ããŒã¯ã³ã¯ãªããžã§ã¯ãã«è§£æãããŸãïŒDOM / CSSOMïŒ
- ãªããžã§ã¯ãã¯ããŒãžã«ãããŸã
- ãªããžã§ã¯ãã¯æç»ããã1ã€ã®å šäœã«é 眮ãããŸãã
- JSãŸãã¯CSSã¯ã³ã³ãã³ããå€æŽã§ããŸã
ãã®ãããæåã®æ®µéã§ãµãŒããŒãžã®èŠæ±ããããããããããã¹ãããŒã¿ïŒHTMLãCSSãJavaScriptïŒãååŸããå¿ èŠããããŸãã ããã¹ããåãåã£ããããããããŒã¯ã¢ããããå¿ èŠããããŸããã€ãŸããããã«åŠçããããã«ãèŠçŽ ãšã¿ã°ã«å解ããå¿ èŠããããŸãã
JavaScriptãæ±ããšãã¯ãã³ãŒãã®æäœãéå§ããåã«ãJavaScriptå šäœãååŸããå¿ èŠããããŸãã HTMLã«ã¯ããªãŒæ§é ããããããèŠçŽ ã®1ã€ãå®å šã«ååŸããããšã§åæãéå§ã§ããŸãã åæã¯HTMLããŒã¿ã®åä¿¡æã«å®è¡ããããããã¹ããªãŒãã³ã°ãšåŒã°ããŸãã
ååãªããŒã¯ã³ãããå Žåãããããåæããããããããªããžã§ã¯ããäœæãå§ããŸãã ãªããžã§ã¯ãã«ã¯ããªãŒæ§é ããããŸãïŒããšãã°ãããã¥ã¡ã³ãã«ã¯èŠåºããããã¹ããç»åãªã©ããããŸãïŒã ããã¯ãHTMLã ãã§ãªãCSSã§ãè¡ããããããDOMãšCSSOMã®2ã€ã®ããªãŒãååŸããŸãã
ã©ãã«ãåæããããªããžã§ã¯ããåä¿¡ãããåŸããããã®ãªããžã§ã¯ãã®ãµã€ãºããã§ã«ããã£ãŠãããããŒãžã«é 眮ã§ããŸãã ãã®æ®µéã¯é¢ä»ããšåŒã°ããŸãã
ããŒãžã¬ã€ã¢ãŠããäœæãããããªããžã§ã¯ãã衚瀺ããå¿ èŠããããŸãã æç»ããããªããžã§ã¯ãã¯ãããŒãžãäœæããããã«é 眮ãããŸãã ãã®ããã»ã¹ãå®äºãããšãJavaScriptãšCSSã䜿çšããŠããŒãžãåçã«ã§ããŸãã
次ã«ããããã®æ®µéã«ã€ããŠè©³ãã説æããŸãã
ãµã€ãããŒãžåæã®å®è¡æ¹æ³
åæã¯ãå®æããèŠçŽ ãååŸããããšããå§ãŸããŸã-ãã®ããã«ïŒ
<h1>Hello HolyJS!</h1>
ããã¯å®å šãªèŠçŽ ã§ããããããã©ãŠã¶ã¯ãããtitleèŠçŽ ãšãã®å éšã®ããã¹ãããŒãã«å解ããŸãã
<p>Lorem ipsumâŠ</p>
ãã®åŸããã©ãŠã¶ã¯å éšã«ããã¹ãããŒããæã€æ®µèœèŠçŽ ãèŠãããšãã§ããŸãã
<p><imgâŠ></p>
ç»åãªã©ãå«ãå¥ã®æ®µèœ
æåŸã«ããã©ãŠã¶ãŒã¯æ¬¡ã®ããã«è¿°ã¹ãŠããŸãããããããŸãããèŠçŽ ããããŸããããªãŒãæ§ç¯ã§ããŸããã ããŒãžã®æ¬æãååŸããã¿ã€ãã«ãããã¹ãããŒãã段èœãç»åãªã©ãè¿œå ããŸãã æ°ããããŒã¿ãåä¿¡ããããšã圌ã¯ãããè¡ããŸãã

ã¹ã¿ã€ã«ã·ãŒãã§ã¯æ¬¡ã®ããã«ãªããŸãã ããã«å€éšããŒãã«ãšã€ã³ã©ã€ã³ã¹ã¿ã€ã«ããããŸãã
<link rel="stylesheet" href="style.css"> <style> body { color: red; } h1 { color: blue; } </style> <p style="color: green">... </p>
å€éšããŒãã«ã®åé¡ã¯ããã以äžèªã¿èŸŒãåã«ããŒãããå¿ èŠãããããšã§ãã ããŠã³ããŒããå®äºãããã次ã«é²ã¿ãããŒãžã®æ¬æãèµ€ã«ãªã£ãŠããããšã確èªããããªãŒãè²ä»ãããŸãã

次ã«ã次ã®èŠçŽ ã«é²ã¿ãèŠåºããéã«ãªãã段èœãç·ã«ãªãã¯ãã§ãã ãããã£ãŠãã¹ã¿ã€ã«ã·ãŒãã®ãªããžã§ã¯ãã¢ãã«ãäœæããŸãã

ããããæã ã¯ãããèŠèŠåããŸããã ãµã€ããéããšããã®ããã«ã¯èŠããŸããã ãµã€ãåæã®æ®µéã§èŠèŠåã®é床ãåäžãããããã«çæããå¿ èŠãããã®ã¯æ¬¡ã®ãšããã§ãã
- éèŠãªCSSã«ãŒã«ïŒè²ãã¬ã€ã¢ãŠããªã©ïŒã«ã¯ã€ã³ã©ã€ã³ã¹ã¿ã€ã«ã䜿çšããŠãå€éšCSSãããªãŒã®æ§ç¯ã劚ããªãããã«ããŸãã
- åæãããšãã¯ãå
ã®HTMLããŒã¿ãååŸããé åºã«æ³šæããŠãã ããã
- ããªãŒãæ§ç¯ãããšãã®ç¹°ãè¿ããæå°éã«ããŸãã
- ãµãŒããŒåŽã®èŠèŠåã䜿çšããŸãã
å¥ã®ç¬éã ã¢ãã¡ãŒã·ã§ã³ãšããŒãã«ãèŠèŠåã®éãã«ã€ããŠåæããå Žåãèªåã¢ãŒãã§ãã¹ãŠã®åé¡ããã£ããããããšã¯ã»ãšãã©äžå¯èœã§ããåžžã«æåã§ãã¹ãããå¿ èŠããããŸãã ChromeãšFirefoxã®éçºè ã¯ãããã©ãŒãã³ã¹æž¬å®ããŒã«ã®æ¹åã«ãã§ã«åãçµãã§ããããšãããããŸãã ãã®äžã«ã¯ãã¬ã³ããªã³ã°ã®é »åºŠãæ°ããJavaScript APIãã¬ã€ã¢ãŠãæéã®æž¬å®ãå ±åããã¢ãã¡ãŒã·ã§ã³ã€ã³ã¹ãã¯ã¿ãŒãããŸãã ãšããã§ãããã§ã¬ã³ããªã³ã°æéãè©äŸ¡ã§ããŸãã ç§ãã¡ã¯ãã®æ©äŒãå©çšããŠãã·ãŒã³ãã©ããããéãèŠèŠåãããããè©äŸ¡ããŸãã ãããé ãããå Žåã¯ãããã€ãã®ããšããªãã«ããŠãå床ãã¹ãããŸãã
ããŒãžäžã®ãªããžã§ã¯ãã®å Žæ
次ã«ãã¬ã€ã¢ãŠãã®å®è¡æ¹æ³ãæ€èšããŸãã ããšãã°ãããã¹ãã®ããã¯ã©ã¹ããããŸãã
<div class="box"> Hello world </div>
ãã©ãŠã¶ã«ã¯ãããŒãžã®å¹ å šäœã«ããã¹ããããé·æ¹åœ¢ããããŸã

次ã«ãããçš®ã®ç»åããããŸã
<div class="box"> Hello world </div> <b><img src="yay.png"></b>
ããã¹ãã®ããé·æ¹åœ¢ãããŒãžã®å¹ å šäœãå ãããããäžã«ãããŸãã

ããã§CSSãè¿œå ãããŸããïŒ
<style> .box { display: inline-block; width: 50%; } </style>
ãããŠãé·æ¹åœ¢ã¯ã€ã³ã©ã€ã³ãããã¯ã§ãããããŒãžã®å¹ ã®ååããå ããªãããšãããããŸãã ãããããªããç»åã®ããé«ãå Žæã衚瀺ãããã®ã§ãããã«è»¢éããŸãã

ããã¯ãããããã©ãŠã¶ã®ã¬ã€ã¢ãŠãã§ãã
èŠèŠåã®é床ã«åœ±é¿ãäžããããã€ãã®äºé ã次ã«ç€ºããŸãããµã€ãã¬ã€ã¢ãŠãã®æ®µéã§èŠããŠãã䟡å€ããããŸãã
- ã³ã³ãã³ãã§ã¯ãªããã¬ã€ã¢ãŠãã¬ãã«ã§ããŒãžãã©ã®ããã«èŠããããç解ããããšãéèŠã§ãïŒãããã¯ã®å Žæãšãµã€ãºïŒã
- ã¬ã€ã¢ãŠãã¯CSSOM + DOMã«åºã¥ããŠããŸããã€ãŸããJavaScriptã§éèŠãªå€æŽãè¡ã£ãå Žåã¯ãã¬ã€ã¢ãŠããããçŽãå¿
èŠããããŸãã
- ã¬ã€ã¢ãŠãã¯åèŠçŽ ã®å®éã®ãµã€ãºã決å®ããŸãïŒèŠçŽ ã®ãµã€ãºãå€æŽããå Žåã¯ãã¬ã€ã¢ãŠããå床è¡ãå¿
èŠããããŸãïŒã
- ã¬ã€ã¢ãŠãã¯ããã©ãŒãã³ã¹ã«åœ±é¿ããå¯èœæ§ããããããã¬ã€ã¢ãŠãã®å€æŽã¯é¿ããŠãã ããã
- ã¬ã€ã¢ãŠããå€æŽãããšãèŠçŽ ã®ã¬ã³ããªã³ã°ãç¹°ãè¿ãããå¯èœæ§ãããããããããã©ãŒãã³ã¹ã«åœ±é¿ããŸãïŒããšãã°ãç»åã®ãµã€ãºãå€æŽããå Žåãå床æç»ããå¿
èŠããããŸãïŒã
- ã¢ãã¡ãŒã·ã§ã³äžã«ãã¬ã€ã¢ãŠãããé£ã³ç«ã€ãããšããããŸãã
æç»ãªããžã§ã¯ã
ãã®æ®µéã§äœãèµ·ãã£ãŠããã®ããç解ããããã«ããã¯ã»ã«ãšã¯äœããæãåºããŸãããã ããã¯ãæãããç°ãªã3è²ïŒç·ãèµ€ãéïŒã§æ§æããã2次å ããžã¿ã«ç»åã®æå°ã®è«çèŠçŽ ã§ãã åãã¯ã»ã«ã«ã¯ãç·ãéãèµ€ã®æããã決å®ãã3ã€ã®æ°å€ããããŸãã

ãããã£ãŠãã¬ã³ããªã³ã°ãšã¬ã³ããªã³ã°ã¯ãæçµçã«ã¯æ°åã®ãªã¹ããååŸããŠæžãçãã以äžã®ãã®ã§ã¯ãããŸããã ãããã®æ°å€ãäºãã«åœ±é¿ãäžããªãããšã¯éåžžã«è¯ãããšã§ããæåã®ãã¯ã»ã«ã«ã¯3ã€ã®æ°å€ãããã2çªç®ã®ãã¯ã»ã«ã«ã¯3ã€ã®æ°å€ããããŸãã ãããã£ãŠãããã€ãã®ãã¯ã»ã«ã«å€æŽãå ããå¿ èŠãããå Žåãããã¯ä»ã®äœãã®å€æŽã䌎ãããæ°å€éã«äŸåé¢ä¿ã¯ãããŸããã ãŸããããã®ãããã§ããããã䞊è¡ããŠèšè¿°ãããã倧éã®æ°åãã³ããŒãããããããšãã§ããŸãã
ã¬ã³ããªã³ã°ã«é¢ããŠçæããå¿ èŠãããã®ã¯æ¬¡ã®ãšããã§ãã
- é£ç¶ããŠã¯çºçããŸããã
- ããã¯ããã©ãŒãã³ã¹ã«åœ±é¿ããå¯èœæ§ããããŸãïŒãã«HD解å床ã¯1920Ã1080ãã€ãŸãçŽ200äžãã¯ã»ã«ã§ãïŒã
- ããã«ã¯ã¡ã¢ãªãé¢ä¿ããŸãïŒããããã3ãã€ãã®ããªã¥ãŒã ãæã€500x500ãã¯ã»ã«ã®è§£å床ã®ç»åã§ãã£ãŠãã750ãããã€ãã®ã¡ã¢ãªãå¿
èŠã§ãïŒã
倧éã®ããŒã¿ãæžã蟌ãã®ã¯éåççã§ãããããã¬ã€ã¢ãŠãã䜿çšãããŸãã æ¯åãã¯ã»ã«å€ãäžæžããã代ããã«ãäžåºŠæç»ããŠã¡ã¢ãªã«ä¿åããæ¯åã¡ã¢ãªããã³ããŒããŠããã»ã¹ãé«éåããã ãã§ååã§ãã ãããã£ãŠãèæ¯ç»åãšèšæ¶ã«ç«ã®åçãããå Žåãç«ã®ã¬ã€ã€ãŒãé©åãªå Žæã®èæ¯ã®äžã«é 眮ããããšã§ãäœåºŠã䜿çšã§ããŸãã

ãããã®ãã¯ã»ã«ããã¹ãŠåæç»ããã®ã§ã¯ãªããæ°åãå°ãå€æŽããã ãã§ãããšãã°ãç»é¢äžãé£ãã§ããç«ã®ã¢ãã¡ãŒã·ã§ã³ãååŸã§ããŸãã

ãã¬ã³ãã䜿çšããŠãããã®ç»åãäœæã§ããŸã-ãã¬ã³ãã¢ãŒããå€æŽããŸãã ãã¬ã³ãããã»ã¹ã§ã¯ã2ã€ã®ãœãŒã¹ã¬ã€ã€ãŒã«ã·ã§ãŒããŒãé©çšãããŸããããã¯ãã¬ã€ã€ãŒã®ãã¬ã³ãæ¹æ³ã瀺ãé¢æ°ã§ãã æ¬äŒŒã³ãŒãã§ã¯æ¬¡ã®ããã«ãªããŸãã
const shader = (x, y, layers, blend, filter) => { return filter( blend(x, y, layers) // returns colour ) // returns final colour }
ã€ãŸããç¹å®ã®ãã¯ã»ã«ã«ã€ããŠããã¹ãŠã®ã¬ã€ã€ãŒã®å€ãååŸãããç¹å®ã®æ¹æ³ã§çµåãããŸãã 15çš®é¡ã®ãã¬ã³ãã£ã³ã°ã¢ãŒãïŒä¹ç®ãã¹ã¯ãªãŒã³ãªã©ïŒããããåã¢ãŒãã¯åºæ¬çã«è²ãçµã¿åãããããã®å ¬åŒã§ãã ããšãã°ãä¹ç®ã¢ãŒãã䜿çšããå Žåãå€ã¯ä¹ç®ãããŸãã
color(x,y) = cat(x,y) * sky(x,y)
ãã®å Žåã次ã®ãããªç«ãååŸããŸãã

æ··åè²ãåãåã£ãåŸãå¥ã®é¢æ°-ãã£ã«ã¿ãŒãå®è¡ã§ããŸãã ãã£ã«ã¿ãŒã®äŸãšããŠã¯ãäžéæ床ãã³ã³ãã©ã¹ããè²å転ãã»ãã¢ã圩床ã圱ã®æ圱ãã°ã¬ãŒã¹ã±ãŒã«ãžã®å€æãªã©ããããŸããããšãã°ãã°ã¬ãŒã¹ã±ãŒã«ãã£ã«ã¿ãŒã䜿çšããå Žåãçµæã®è²ã®æ°å€ãå ç®ããã3ã€ã«åå²ãããŸãã
(r, g, b) => (r + g + b) / 3
ãããã£ãŠããã¯ã»ã«ã®è²ãååã«æãããã°ã¬ãŒã®æ¿æ·¡ã«å€æãããå Žåãæããç»åãåŸãããè²ãããå Žåã¯æãããšã«ãªããŸãã
ãããŠããã®ã°ã¬ãŒã¹ã±ãŒã«é¢æ°ãå®éã«ã©ã®ããã«èŠãããã以äžã«ç€ºããŸãïŒ
varying highp vec2 coord; uniform sampler2D layer; void main(void) { vec4 color = texture2D(layer, vec2(coord.s, coord.t)); float grayScale = (color.r + color.g + color.b) / 3.0; gl_FragColor = vec4(grayScale, grayScale, grayScale, 1.0); }
ãã¬ã³ãã¢ãŒããšãã£ã«ã¿ãŒã䜿çšããå Žåãç°ãªããã©ãŠã¶ãŒããŸã£ããåãããã«åäœããªãããšãéèŠã§ãã ã¬ã€ã€ãŒã®ã¿ã䜿çšããŠã¬ã³ããªã³ã°ãè¡ãããããã«ãã¢ãŒããã¯ãã£ãåèšèšããå¯äžã®ãã©ãŠã¶ãŒã¯Chromeã§ãã ä»ã®ãã©ãŠã¶ã¯CSSãã£ã«ã¿ãŒãšã»ãŒåãããã«æ©èœããŸãããSVGãã£ã«ã¿ãŒã¯äœããã®çç±ã§åã¬ã³ããªã³ã°ãããŸãããç解ã§ããŸããã ããã¯ãã»ãšãã©ã®ãã©ãŠã¶ïŒFirefoxãSafariãInternet ExplorerãEdgeïŒã§çºçããŸãã
ããã§ãã¬ã€ã¢ãŠããäžãããã®ïŒ
- ãµã€ãã®ããŸããŸãªèŠçŽ ãã¬ã€ã€ãŒåœ¢åŒã§ã¡ã¢ãªã«ä¿åããå¿
èŠã«å¿ããŠæ§æã§ããŸãã
- ã¡ã¢ãªããã®ã³ããŒæäœãéåžžã«è¿
éã«çºçããããããµã€ãã®èªã¿èŸŒã¿ãé«éåããŸãã
- ãã¬ã³ãã¢ãŒããšãã£ã«ã¿ãŒã䜿çšããŠåã¬ã³ããªã³ã°ããã«ãããã€ãã®å€æŽãå ããããšãã§ããŸãã
- ããŒã¿ãå¥ã®äœçœ®ã«ç§»åããã¹ã±ãŒãªã³ã°ãšå転ãå®è¡ã§ããŸãã
ãã ããåã¬ã€ã€ãŒã¯ã¡ã¢ãªå ã«ä¿æããå¿ èŠããããããå€ãã®ã¬ã€ã€ãŒãäœæããããšã¯ã§ããŸããïŒããããªããšãã¢ãã€ã«ããã€ã¹ãŠãŒã¶ãŒã¯ããã«ã¡ã¢ãªäžè¶³ãšã©ãŒã«ééããŸãïŒã ã¬ã€ã€ãŒã¯ãå¿ èŠãªå Žåã«ã®ã¿äœ¿çšãã䟡å€ããããŸãã
- ãããªããã£ã³ãã¹-å€æ°ã®å€åãããã¬ãŒã ãå«ããããªããã³ã²ãŒã çšã
- 3Då€æ;
- è€åã¢ãã¡ãŒã·ã§ã³ïŒããŒã¿ã®ç§»åãå転ãã¹ã±ãŒãªã³ã°ãå«ããã®ïŒ;
- æ°ããwill-changeããããã£ãäœåå€æŽããããæ£ç¢ºã«æå®ã§ããŸãã
will-changeããããã£ã¯ãã©ãŠã¶ã®ãã³ãã§ããããã³ããå€ãã»ã©ã¬ã³ããªã³ã°ãåäžããŸãã ã€ãŸãããã©ãŠã¶ã«ããã®Canvasãããããã®å ŽæãŸãã¯ãµã€ãºãå€æŽããããšäŒãããšãã»ãšãã©ã®å Žåããã©ãŠã¶ã¯ããŒãžãããéãåŠçã§ããããã«ãªããŸãã
éã³ãŸãããïŒå®çšçãªäŸ
ã²ãŒã ããã¬ã€ããäžèšã®ãã¹ãŠãç解ããæ¹æ³ã確èªããããšãææ¡ããŸãã
以äžã®ã³ãŒãã¯ãèŠçŽ ã150ãã¯ã»ã«æšªã«ç§»åãã2ç§åŸã«å ã®äœçœ®ã«æ»ããŸãã ãã®ã¢ãã¡ãŒã·ã§ã³ãã¬ã³ããªã³ã°ããããã©ãã質åã«çããŠã以äžã®çããåç §ããŠãã ããã
#transform { transform: translateX(150px); } setTimeout(() => { el.style.transform = 'translateX(0)' }, 2000)
ã¯ããããã¯2Då€æã§ããããã§ãã ããã§ã¯ã¬ã€ã€ãŒã¯äœ¿çšãããããã¯ã»ã«ãåã³æç»ãããŸãã
ã²ãŒã ã®ç¬¬2ã©ãŠã³ãã§ãç°ãªãã³ãŒãã䜿çšããŸããã 圌ã¯åãããšãããŸãããåãã¯ç°ãªããŸãã ãã®ã¢ãã¡ãŒã·ã§ã³ã¯æãããŸããïŒ
#transform { transform: translate3d(150px, 0,0); } setTimeout(() => { el.style.transform = 'translate3d(0, 0, 0)' }, 2000)
ãããã3Då€æã䜿çšãããããã¬ã€ã€ãŒãæå³ããŸãã
æåŸã«ã第3ã©ãŠã³ãã ããã¯äœã§ãã
@keyframes move { 0% { left: 0; } 100% { left: 200px; } }
ããã¯ãã©ã®ãããªå Žåã§ãå®è¡ãã¹ãã§ãªãããšã§ãã ãã ããããã§will-changeããããã£ã䜿çšããŠã²ãŒã ã®ã«ãŒã«ãå€æŽã§ããŸãã ããã§2ç§ã®ã¢ãã¡ãŒã·ã§ã³ãäœæãããå·Šã«ç§»åã§ããŸãã ãã®ãããªã³ãŒãã䜿çšããããšã¯å¯èœã ãšæããŸããïŒ
#transform { will-change: left; animation: move 2s infinite; }
å¯èœã§ãããèŠçŽ ãã¬ã€ã¢ãŠãå ã®ä»ã®èŠçŽ ããç¬ç«ããŠããå Žåã®ã¿ã§ãïŒããšãã°ãèŠçŽ ã®äœçœ®ã¯çµ¶å¯Ÿã§ãïŒã ãã®äœçœ®ãçžå¯Ÿçãªå Žåãäœçœ®ãå€æŽãããšãããŒãžäžã®ä»ã®èŠçŽ ã移åããŸãã
ãã®ãããã¬ã€ã€ãŒãšã¬ã€ã¢ãŠãã«é¢ããŠçæãã¹ãããšãããã€ããããŸãã
- åã¬ã€ã¢ãŠããšã¬ã³ããªã³ã°ãé¿ãã-ããã«ããããã©ãŒãã³ã¹ãäœäžããŸãã ã¬ã€ã€ãŒã¯äŸ¿å©ãããããŸãããã泚æããŠãã ããã ã¡ã¢ãªãŒã䜿ããããªãããã«å¿
èŠã§ããããšã確å®ã§ãªãéããäœæããªãã§ãã ããã
- æåã«æž¬å®ãã次ã«æé©åããŸãã ãã©ãŠã¶ã§éçºè
ã®ã³ââã³ãœãŒã«ã䜿çšããŠã¢ãã¡ãŒã·ã§ã³ããã¹ãããèŠçŽ ãæç»ãããé »åºŠã芳å¯ããã¡ã¢ãªäœ¿çšéã枬å®ããŸãã
- å¯èœãªéãã¬ã€ã¢ãŠãã䜿çšããŠãã ããïŒwill-changeããããã£ã3Då€æãªã©ã䜿çšïŒ
ããããããŒã«ã«ã€ã¹ã®åŒçšãé©åãªå Žæã§ãããçç£æ§ã¯ä»äºãé¿ããããã®æè¡ã§ããã ããã©ãŒãã³ã¹ã«é¢ããŠèšãã°ãã§ããããšã¯ããããå°ãªãããšã ãšããããšãåžžã«å¿ããªãã§ãã ããã
Canvas 2DãšWebGLã®ããã©ãŒãã³ã¹æ¯èŒ
Canvas 2Dã䜿çšããã»ããé©åãªå ŽåãšãWebGLã®å Žåã«ã€ããŠããå°ã話ããŸãããã
次ã«ãCanvas 2Dã®ç°¡åãªäœ¿çšäŸã瀺ããŸãã ãã£ã³ãã¹ã®ãµã€ãºãHDãã¬ãŒã ã®ãµã€ãºã«çãããšããŸãã ããŸããŸãªå Žæã«å€ãã®ãªããžã§ã¯ããé 眮ããããããä»»æã®ãµã€ãºã«ããŠãããããŸããŸãªå Žæã«ããŸããŸãªãµã€ãºã§ç»åãæ°åæç»ããŸãã ããã¯ããã»ã©é£ãããããŸããïŒ
for(var i=0; i<NUM_OBJECTS; i++) { var x = Math.random() * HD_WIDTH, y = Math.random() * HD_HEIGHT, size = Math.random() * 512 ctx.drawImage(img, x - HALF_SIZE, y - HALF_SIZE, size, size ) }
Y軞ã«ã¯1ç§ãããã®ãã¬ãŒã æ°ã衚瀺ãããX軞ã«ã¯ããããå®è¡ãããªããžã§ã¯ãã®æ°ã衚瀺ãããŸãã ã€ãŸããåããªããžã§ã¯ãã1åã100åã250åã550åæç»ãããŸãã

ç·ã®ç·ããäžã®ãã¹ãŠã¯ãæ¯ç§60ãè¶ ãããã¬ãŒã ã¬ãŒãã§ã®éåžžã«æ»ãããªã¬ã³ããªã³ã°ãæå³ããŸãã ãªã¬ã³ãžè²ã®ç·ã¯ãåžæããã»ã©éãã¯ãããŸããããã¬ã³ããªã³ã°ããŸã ã¹ã ãŒãºãªãã¬ãŒã æ°ã瀺ããŠããŸãã èµ€ã¯ãæ»ãããªã¢ãã¡ãŒã·ã§ã³ã®ä»£ããã«ãã¹ã©ã€ãã·ã§ãŒã®ãããªåœ¢ã§ããžã£ãŒã¯ã§ã¬ã³ããªã³ã°ãå®è¡ãããç·ã§ãã ã芧ã®ããã«ããªããžã§ã¯ãã®æ°ã250ã®å Žåã1ç§ãããã®ãã¬ãŒã æ°ã¯èš±å®¹ããããã®ãããã¯ããã«å°ãªããªããŸãã
äžæ¹ã以äžã®ã°ã©ãã«èŠãããããã«ãWebGLã䜿çšããå Žåãåãæ°ã®ãªããžã§ã¯ãã¯1ç§ãããã®ãã¬ãŒã æ°ã«åœ±é¿ããŸããã

ããã§ããããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã䜿çšããå Žåã¯ã©ããªããŸããïŒã ããã¯ããŸãã¯ãŒã«ã§ã¯ãããŸããããåºæ¬çã«ã¯èš±å®¹ã§ããŸãã ãã ããCanvas 2Dã§ã¯ã1ç§ããã7ãã¬ãŒã ããååŸã§ããŸããã ãããŠã50,000ã®ãªããžã§ã¯ãã§ã¯ãã©ã¡ãã®å ŽåãèŠèŠåã¯éåžžã«é ããªããŸãããWebGLã¯ã¹ã©ã€ãã·ã§ãŒãæäŸããŸããããã®é床ã¯ãŸã 2åã§ãã

ãã®ããã3Dã ãã§ãªã2Dã³ã³ãã³ãã«ãWebGLã䜿çšãã䟡å€ããããŸãã
ãã ãããã¹ãŠãé«éã§ãããããWebGLã䜿çšããŠãã¹ãŠãå®è¡ããå¿ èŠããããšã¯èããªãã§ãã ããã ç§ã¯ãã€ãããã¯æªãèãã ãšèšããŸãã é©åãªããŒã«ã䜿çšããå¿ èŠããããŸããWebGLã䜿çšããŠå®å šã«ãã¹ãŠãéå§ããå Žåã«çºçããããã«ããŒããããã¯ãããžãŒãçºæããå¿ èŠã¯ãããŸããã
äœããã€äœ¿çšããããèŠããŠãããŠãã ããã ãããŠãåžžã«é©åãªããŒã«ãéžæããããšã確èªããŠãã ããã
HTML + CSSã¯ä»¥äžãäœæããããã«äœ¿çšãããŸãã
- ã»ãã³ãã£ãã¯ã§ã¢ã¯ã»ã¹ããããã³ã³ãã³ã
- ã°ã©ãã£ãã¯ããªããã£ã
SVGã¯æ¬¡ã®ç®çã§äœ¿çšãããŸãã
- ããŸãæ¡å€§ã§ããç»å
Canvas 2Dã¯ã次ã®ãã®ãäœæããã®ã«äŸ¿å©ã§ãã
- ã·ã³ãã«ãª2Dã¢ãã¡ãŒã·ã§ã³
WebGLã¯æ¬¡ã®çšéã«äœ¿çšããå¿ èŠããããŸãã
- 3Dã³ã³ãã³ããšã²ãŒã
ãã€ãWebã¢ãã¡ãŒã·ã§ã³ã¯ã以åã®Flashã¢ãã¡ãŒã·ã§ã³ãšåãéãã§åçã§ãããšæããŸãã ãã©ãŠã¶ã®èŠèŠåãšã³ãžã³ã¯åžžã«æ¹åãããŠããŸãã 2010ãã©ãŠã¶ãŒãšã³ãžã³ã䜿çšããŠææ°ã®ãã©ãŠã¶ãŒãšã³ãžã³ãšæ¯èŒãããšã倧ããªéããããããŸãã ã¯ãããã¡ããããšã³ãžã³ã¯ãŸã äžå®å šã§ãã æè¿ã®ãã©ãŠã¶ã®äž»ãªåé¡ã¯ãããŸãåçã§ã¯ãªãããŒãžçšã«äœæããããããã€ã³ã¿ã©ã¯ãã£ããªã°ã©ãã£ãã¯ã¢ããªã±ãŒã·ã§ã³ã«åžžã«é©å¿ããªããã°ãªããªãããšã§ãã
ãããããè¿ãå°æ¥ã«ç§ãã¡ãç®ã«ãããã®ã®æè¯ã®äŸã®1ã€ã¯ãMozillaã®å®éšçãªServoãšã³ãžã³ã§ãããã å¯èœãªéãããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã䜿çšãããããä»ã®ãã©ãŠã¶ãŒã§ã¯æ¯ç§60ãã¬ãŒã ã§ã¬ã³ããªã³ã°ãããServoã§ã¯120 FPSãååŸããŸãã
ã¢ããªã±ãŒã·ã§ã³ããã©ãŒãã³ã¹ã®ãããã¯ã«è¿ã人ã¯ããããããMartin Betterã®æ°ããã¬ããŒããããéãããã匷ã ãã¢ã¹ã¯ã¯ã®HolyJSã§è¬æŒããWebãã©ãããã©ãŒã ããããå€ããåŸãã§ãããã
ä»ã®ã¬ããŒãã«ãèå³ããããããããŸãããäŸãã°ïŒ
- ããé«éãªè§åºŠã¢ããªã±ãŒã·ã§ã³ ïŒMinco GechevïŒ
- ã¬ã¹ãã³ã·ãWebãã¶ã€ã³ã®æ°ããåéº ïŒVitaliy FridmanïŒ
- å·ã®äžçã®æ±ãã¢ãã¡ãŒã·ã§ã³ ïŒAlexey TaktarovïŒ
äŒè°ããã°ã©ã å šäœã¯ãµã€ãã§å ¥æã§ããŸã ããã±ããã¯ãã¡ãã§è³Œå ¥ã§ããŸã ã