æ®å¿µãªããããªãªãžãã«ã®ã°ã©ãã£ãã¯ã¯iframeãä»ããŠæ¿å ¥ãããŸãã åçãæ®ã£ãŠç»åãé 眮ããããšã¯ã§ããŸãããèè èªèº«ãé¢é£ããã°ã©ããšæŽæ°ãããã°ã©ããé 眮ããã®ã§ãããããžã®ãªã³ã¯ãæçš¿ããŸããã çŽ æµãªèªæžãïŒ
- ãšã³ããªãŒ
- æ§èœè©Šéš
- ä»®æ³ãã£ã³ãã¹ã§äºåã¬ã³ããªã³ã°
- ã°ã«ãŒãé話
- äžèŠãªç¶æ å€æŽãé¿ãã
- ãã£ã³ãã¹å šäœã§ã¯ãªããéãã®ã¿ãæã
- è€éãªã·ãŒã³ã«ã¬ã€ã€ãŒããã£ã³ãã¹ã䜿çšãã
- shadowBlurãé¿ãã
- ç»é¢ãã¯ãªã¢ããããŸããŸãªæ¹æ³
- æŽæ°ä»¥å€ã®åº§æšãé¿ãã
- ãrequestAnimationFrameãã§ã¢ãã¡ãŒã·ã§ã³ãæé©åãã
- ã»ãšãã©ã®ã¢ãã€ã«ãã£ã³ãã¹ã®å®è£ ã¯é ã
- ãããã«
- åç §è³æ
ãšã³ããªãŒ
Appleã®å®éšãšããŠå§ãŸã£ãHTML5ãã£ã³ãã¹ã¯ãã€ã³ã¿ãŒãããäžã®2D ãã€ã¬ã¯ãã°ã©ãã£ãã¯ã¹ã§æãåºãåãå ¥ããããŠããæšæºã§ãã å€ãã®éçºè ã¯ãããŸããŸãªãã«ãã¡ãã£ã¢ãããžã§ã¯ããèŠèŠåãã²ãŒã ã§ããã䜿çšããŠããŸãã ã¢ããªã±ãŒã·ã§ã³ã®è€éããå¢ãã«ã€ããŠãéçºè ã¯ããã©ãŒãã³ã¹ã®å£ã«å¶ç¶ã«åºããããŸãã
ãã£ã³ãã¹ã®æé©åã«ã¯å€ãã®ãããªãã¯ããæ£åšããŠããŸãã ãã®èšäºã®ç®çã¯ããããããŸãšããŠãéçºè ãèªã¿ããããªãœãŒã¹ãäœæããããšã§ãã ãã®èšäºã«ã¯ãã³ã³ãã¥ãŒã¿ãŒã°ã©ãã£ãã¯ã¹ã®ãã¹ãŠã®é åã«é©çšãããåºæ¬çãªæé©åãšããã£ã³ãã¹ã®å®è£ ãé²åããã«ã€ããŠå€åãããã£ã³ãã¹ã®ç¹å®ã®ææ³ã®äž¡æ¹ãå«ãŸããŠããŸãã ç¹ã«ãGPUã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã䜿çšããããšã説æãããŠããææ³ã®ããã€ãã¯ããŸãéèŠã§ã¯ãªããªããŸãã å¿ èŠã«å¿ããŠããã瀺ãããŸãã
ãã®èšäºã¯HTML5ãã£ã³ãã¹ãã¥ãŒããªã¢ã«ã§ã¯ãªãããšã«æ³šæããŠãã ããã ãã ããHTML5Rocksã®é¢é£èšäº ãã Dive into HTML5ãã®ç« ãããã³MDNã®ã¬ãã¹ã³ãåŠç¿ã§ããŸãã
æ§èœè©Šéš
HTML5ãã£ã³ãã¹ã®ããŒã¹ã®éãäžçã§ã¯ã JSPerf ïŒ jsperf.com ïŒã¯ãææ¡ãããæé©åããã¹ãŠæ©èœããããšã確èªããã®ã«åœ¹ç«ã¡ãŸãã JSPerfã¯ãéçºè ãJavaScriptããã©ãŒãã³ã¹ãã¹ããäœæã§ããWebã¢ããªã±ãŒã·ã§ã³ã§ãã åãã¹ãã¯ãååŸããããšããŠããçµæïŒããšãã°ããã£ã³ãã¹ã®ã¯ãªãŒãã³ã°ïŒã«çŠç¹ãåœãŠãŠãããããŸããŸãªã¢ãããŒããå«ãŸããŠããŸãã JSPerfã¯ãåãªãã·ã§ã³ãå¯èœãªéãçæéã§å®è¡ããçµ±èšçã«æå³ã®ãã1ç§ãããã®å埩åæ°ã衚瀺ããŸãã åžžã«ããè¯ããã®ã§ãïŒ
JSPerfããŒãžãžã®èšªåè ã¯ããã©ãŠã¶ã§ãã¹ããå®è¡ããJSPerfãæ£èŠåãããçµæãBrowserscope ïŒ browserscope.org ïŒã«ä¿åã§ããããã«ããŸã ã ãã®èšäºã®æé©åææ³ã¯JSPerfã«ä¿ç®¡ãããŠããããããã€ã§ãæ»ã£ãŠããã®ææ³ãŸãã¯ãã®ææ³ããŸã é©çšå¯èœãã©ããã«é¢ããææ°æ å ±ã確èªã§ããŸãã ãããã®çµæãèšäºã§äœ¿çšãããŠããã°ã©ããšããŠè¡šç€ºããå°ããªãã«ããŒã¢ããªã±ãŒã·ã§ã³ãäœæããŸããã
ãã®èšäºã®ãã¹ãŠã®ããã©ãŒãã³ã¹ãã¹ãã®çµæã¯ããã©ãŠã¶ãŒã®ããŒãžã§ã³ã«é¢é£ä»ããããŠããŸãã ããã¯ããã©ãŠã¶ãã©ã®OSã§èµ·åãããã®ããããã«éèŠãªããšã«ã¯ããã¹ããè¡ââããããšãã«HTML5ãã£ã³ãã¹ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ããªã³ã«ãªã£ãŠãããã©ãããããããªããããå¶éã®ããã§ãã ã¢ãã¬ã¹ããŒã«ã
about:gpu
ãšå ¥åãããšãChromeã§ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ãæå¹ã«ãªã£ãŠãããã©ããã確èªã§ããŸãã
ä»®æ³ãã£ã³ãã¹ã§äºåã¬ã³ããªã³ã°
åæ§ã®ããªããã£ããå€ãã®ãã¬ãŒã ã«ããã£ãŠç»é¢ã«æç»ããå ŽåïŒã²ãŒã ãäœæããå Žåã«ããããããšã§ãïŒãã¹ããŒãžå€ã§å€§ããªéšåãæç»ããããšã§ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã äºåã¬ã³ããªã³ã°ã§ã¯ãäžæçãªç»åãæç»ãããä»®æ³ïŒãŸãã¯ä»®æ³ïŒãã£ã³ãã¹ã䜿çšããä»®æ³ãã£ã³ãã¹ã衚瀺å¯èœãªãã£ã³ãã¹ã«ã³ããŒããŸãã ã³ã³ãã¥ãŒã¿ã°ã©ãã£ãã¯ã¹ã«ç²ŸéããŠãã人ã«ãšã£ãŠããã®ææ³ã¯ãã£ã¹ãã¬ã€ãªã¹ããšãåŒã°ããŸã ã
ããšãã°ã1ç§ããã60ãã¬ãŒã ã§ããªãªãåæç»ãããšããŸãã åãã¬ãŒã ã«åœŒã®åžœåãå£ã²ãããMããæãããã¢ãã¡ãŒã·ã§ã³ãéå§ããåã«äºåã«æãããšãã§ããŸãã
äºåã¬ã³ããªã³ã°ãªãïŒ
// canvas, context are defined function render() { drawMario(context); requestAnimationFrame(render); }
äºåã¬ã³ããªã³ã°ïŒ
var m_canvas = document.createElement('canvas'); m_canvas.width = 64; m_canvas.height = 64; var m_context = m_canvas.getContext('2d'); drawMario(m_context); function render() { context.drawImage(m_canvas, 0, 0); requestAnimationFrame(render); }
requestAnimationFrameã«æ³šæããŠãã ãããrequestAnimationFrameã®äœ¿çšæ¹æ³ã«ã€ããŠã¯ãåŸã»ã©è©³ãã説æããŸãã 次ã®ã°ã©ãã¯ãäºåã¬ã³ããªã³ã°ïŒ jsperf ïŒã䜿çšããå©ç¹ã瀺ããŠããŸãïŒ ã°ã©ã ã
ãã®ææ³ã¯ãã¬ã³ããªã³ã°ãé£ããå Žåã«ç¹ã«å¹æçã§ãïŒdrawMarioïŒã è¯ãäŸã¯ãããã¹ãã®ã¬ã³ããªã³ã°ã§ããããã¯éåžžã«é«äŸ¡ãªæäœã§ãã äºåã¬ã³ããªã³ã°ããã¹ãïŒ jsperf ïŒã䜿çšãããšãããã©ãŒãã³ã¹ãåçã«åäžããŸãã ã°ã©ã
å¯èœæ§ãšããŠãäžèšã®äŸã§ã¯ããäºåã«ã¬ã³ããªã³ã°ãããã«ãŒãºããã¹ãã®ããã©ãŒãã³ã¹ãäœãããšãããããŸãã äºåã¬ã³ããªã³ã°ããå Žåãäžæãã£ã³ãã¹ã®ãµã€ãºãã€ã¡ãŒãžã«å¯ŸããŠããã€ããããšã確èªããããšãéèŠã§ããããããªããšã倧ããªãã£ã³ãã¹ãå¥ã®ãã£ã³ãã¹ã«ã³ããŒãããšãã«ããã©ãŒãã³ã¹ãåäžããããã©ãŒãã³ã¹ãäœäžããŸãïŒã¿ãŒã²ãããã£ã³ãã¹ã®ãµã€ãºã®é¢æ°ã®ããã«èŠããŸãïŒã äžèšã®äŸã«é©ãããã£ã³ãã¹ã¯æ¬¡ã®ãšããã§ãã
can2.width = 100; can2.height = 40;
倧ãšæ¯èŒããŠïŒ
can3.width = 300; can3.height = 100;
ã°ã«ãŒãé話
ã¬ã³ããªã³ã°ã¯é«äŸ¡ãªæäœã§ãããããã³ãã³ãã®é·ããªã¹ãã䜿çšããŠæç»ã¹ããŒããã·ã³ãããŒããããããããããªãããã¡ãŒã«ã¢ããããŒãããæ¹ãã¯ããã«å¹ççã§ãã
ããšãã°ãè€æ°ã®ç·ãæç»ããå Žåããã¹ãŠã®ç·ã§1ã€ã®ãã¹ãäœæãã1åã®åŒã³åºãã§æç»ããããšããå§ãããŸãã ã€ãŸããåã ã®ç·ãæããããïŒ
for (var i = 0; i < points.length - 1; i++) { var p1 = points[i]; var p2 = points[i+1]; context.beginPath(); context.moveTo(p1.x, p1.y); context.lineTo(p2.x, p2.y); context.stroke(); }
1æ¬ã®ããªã©ã€ã³ãæç»ããæ¹ãé©åã§ãïŒ
context.beginPath(); for (var i = 0; i < points.length - 1; i++) { var p1 = points[i]; var p2 = points[i+1]; context.moveTo(p1.x, p1.y); context.lineTo(p2.x, p2.y); } context.stroke();
ããã¯ãã£ã³ãã¹ã«ãé©çšãããŸãã ããšãã°ãè€éãªãã¹ãæç»ããå Žåãã»ã°ã¡ã³ããåå¥ã«æç»ããïŒ jsperf ïŒïŒ graphããããããã«ãã¹ãŠã®ãã€ã³ããé 眮ããæ¹ãé©åã§ãã
ãã ããcanvasã«ã¯ãã®ã«ãŒã«ã®éèŠãªäŸå€ãããããšã«æ³šæããŠãã ããïŒæç»ããããªããžã§ã¯ãã®ããªããã£ããåšå²ã«å°ããªé·æ¹åœ¢ïŒå¢çããã¯ã¹ïŒãæã£ãŠããå Žåãããããåå¥ã«ïŒ jsperf ïŒæç»ããæ¹ãå¹ççã§ããããšãããã ãŸã ã
äžèŠãªç¶æ å€æŽãé¿ãã
Canvasã¯ã¹ããŒããã·ã³ã«åºã¥ããŠå®è£ ãããŸããã¹ããŒããã·ã³ã¯ãå¡ãã€ã¶ãã¹ã¿ã€ã«ãã¹ãããŒã¯ã¹ã¿ã€ã«ã®ã»ããçŸåšã®ãã¹ã圢æãã以åã®ãã€ã³ãã远跡ããŸãã æé©åããããšãããšãæç»ã«éäžããããªãèªæããããŸãã ãã ããã¹ããŒããã·ã³ã§ã®æäœãã³ã¹ãã«ã€ãªãããŸãã
ã·ãŒã³ã§è€æ°ã®å¡ãã€ã¶ãã®è²ã䜿çšããå Žåããã£ã³ãã¹äžã®å Žæãããè²ã§ãã€ã³ãããæ¹ãå®äŸ¡ã§ãã æµ ãã¹ããªããã«ãã¯ã¹ãã£ãæç»ããã«ã¯ãç·ãæç»ããè²ãå€æŽãã次ãæç»ããŸãã
for (var i = 0; i < STRIPES; i++) { context.fillStyle = (i % 2 ? COLOR1 : COLOR2); context.fillRect(i * GAP, 0, GAP, 480); }
ãŸãã¯ããã¹ãŠã®å¶æ°ãã³ããšå¥æ°ãã³ããæç»ããŸãã
context.fillStyle = COLOR1; for (var i = 0; i < STRIPES/2; i++) { context.fillRect((i*2) * GAP, 0, GAP, 480); } context.fillStyle = COLOR2; for (var i = 0; i < STRIPES/2; i++) { context.fillRect((i*2+1) * GAP, 0, GAP, 480); }
ãããã®ã¡ãœããã®æ¯èŒã¯ã次ã®ãã¹ãïŒ jsperf ïŒã§ç€ºãããŠããŸãïŒ graph
äºæ³ã©ãããéè·¯ã®ç¶æ ãæäœãããããæåã®ãªãã·ã§ã³ã¯é ããªããŸãã
ãã£ã³ãã¹å šäœã§ã¯ãªããéãã®ã¿ãæã
ãæ³åã®ãšãããæç»ããç»é¢ã®å°ããéšåã»ã©å®äŸ¡ã§ãã åæç»ã®éã«ããããªéããããªãå Žåãéãã®ã¿ãã¬ã³ããªã³ã°ããããšã§ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã ã€ãŸããã¬ã³ããªã³ã°ããåã«ç»é¢å šäœãã¯ãªã¢ãããããïŒ
context.fillRect(0, 0, canvas.width, canvas.height);
ããã¢ãã«ã®å¢çããã¯ã¹ãèŠãŠãããã ããã¯ãªã¢ããŸãã
context.fillRect(last.x, last.y, last.width, last.height);
ããã¯ãç»é¢ã暪åãçœãç¹ïŒ jsperf ïŒãå«ã次ã®ãã¹ãã§ç€ºãããŠããŸãïŒ graph ã
ã³ã³ãã¥ãŒã¿ã°ã©ãã£ãã¯ã¹ãåŸæã§ããã°ããåæç»é åããšåŒã°ãããã®ææ³ãç¥ã£ãŠããå¿ èŠããããŸãããã®ææ³ã§ã¯ã以åã®å¢çããã¯ã¹ãä¿åãããã¬ã³ããªã³ã°ããšã«ã¯ãªã¢ãããŸãã
ãã®ãã¯ããã¯ã¯ããã®ãã³ãã³ããŒJavaScriptãšãã¥ã¬ãŒã¿ãŒã®èª¬æã®ããã«ããã¯ã»ã«åäœã®ã¬ã³ããªã³ã°ã«ãé©çšãããŸã ã
è€éãªã·ãŒã³ã«ã¬ã€ã€ãŒããã£ã³ãã¹ã䜿çšãã
åè¿°ã®ããã«ã倧ããªç»åã®ã¬ã³ããªã³ã°ã¯é«äŸ¡ã§ãããé¿ããã¹ãã§ãã ãªãã¹ã¯ãªãŒã³ãããã¡ãŒïŒäºåã¬ã³ããªã³ã°ã»ã¯ã·ã§ã³ïŒã䜿çšããããšã«å ããŠãäºãã«ç©ã¿éãããããã£ã³ãã¹ã䜿çšã§ããŸãã æäžäœã¬ã€ã€ãŒã®éæ床ã䜿çšããŠãGPUã䜿çšããŠã¬ã³ããªã³ã°äžã«ã¢ã«ãã¡ãã£ãã«ãé©çšã§ããŸãã 次ã®ããã«ã絶察ã«é 眮ããã2ã€ã®ãã£ã³ãã¹ãéããŠäœ¿çšããŸãã
<canvas id="bg" width="640" height="480" style="position: absolute; z-index: 0"> </canvas> <canvas id="fg" width="640" height="480" style="position: absolute; z-index: 1"> </canvas>
åäžã®ãã£ã³ãã¹ãè¶ ããå©ç¹ã¯ãäžéšãã¬ã³ããªã³ã°ãŸãã¯ã¯ãªãŒãã³ã°ãããšãã«ãèæ¯ã«åœ±é¿ãäžããªãããšã§ãã ã²ãŒã ãŸãã¯ãã«ãã¡ãã£ã¢ã¢ããªã±ãŒã·ã§ã³ã2ã€ã®ã¬ã€ã€ãŒã«åå²ã§ããå Žåãããããç°ãªããã£ã³ãã¹ã«æç»ããŠããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšããå§ãããŸãã 次ã®ã°ã©ãã¯ã1ã€ã®ãã£ã³ãã¹ãšãå¿ èŠã«å¿ããŠæäžå±€ïŒ jsperf ïŒãåæç»ãŸãã¯ã¯ãªãŒãã³ã°ãããã£ã³ãã¹ãšã®åçŽãªããŒãžã§ã³ãæ¯èŒããã°ã©ãã§ãã
å€ãã®å Žåãæ¬ é¥ã®ãã人éã®èªèããæ©æµãåããããšãã§ããèæ¯ã1åãŸãã¯1å以äžã®é »åºŠã§ããæç»ã§ããŸããïŒãŠãŒã¶ãŒã®æ³šæã®ã»ãšãã©ãæç»ããŸãïŒã ããšãã°ããããã¬ã€ã€ãŒãNã¬ã³ããªã³ã°ããŠãèæ¯ã1åã ãæââç»ã§ããŸãã
ãã®æ¹æ³ã¯ãã¢ããªã±ãŒã·ã§ã³ããã®ãããªæ§é ã§ããé©åã«æ©èœããå Žåãä»ã®ä»»æã®æ°ã®ã¬ã€ã€ãŒã«ãé©çšãããŸãã
shadowBlurãé¿ãã
ä»ã®ã°ã©ãã£ã«ã«ç°å¢ãšåæ§ã«ãHTML5ãã£ã³ãã¹ã§ã¯éçºè ãããªããã£ãããŒããããšãã§ããŸããããã®æäœã¯éåžžã«é«äŸ¡ã§ãã
context.shadowOffsetX = 5; context.shadowOffsetY = 5; context.shadowBlur = 4; context.shadowColor = 'rgba(255, 0, 0, 0.5)'; context.fillRect(20, 20, 150, 100);
ãã®ãã¹ãã¯ã圱ã®æç¡ã«ãããããæç»ãããåãã·ãŒã³ãšããã©ãŒãã³ã¹ã®æ±ºå®çãªéãïŒ jsperf ïŒã瀺ããŠããŸã ã
ç»é¢ãã¯ãªã¢ããããŸããŸãªæ¹æ³
ãã£ã³ãã¹ã¯å³æã°ã©ãã£ãã¯ã¢ãŒãã®ãã©ãã€ã ãªã®ã§ãã·ãŒã³ã¯åãã¬ãŒã ã§åæç»ããå¿ èŠããããŸãã ãã®ããããã£ã³ãã¹ã®ã¯ãªãŒãã³ã°ã¯ãã¢ããªã±ãŒã·ã§ã³ããã³ã²ãŒã ã§åºæ¬çã«éèŠãªæäœã§ãã
äžèŠãªç¶æ å€æŽã®åé¿ã»ã¯ã·ã§ã³ã§è¿°ã¹ãããã«ããã£ã³ãã¹å šäœãã¯ãªã¢ããããšã¯ãã°ãã°æãŸãããããŸãããããããè¡ãå¿ èŠãããå Žåãcontext.clearRectïŒ0ã0ãwidthãheightïŒãåŒã³åºãããããã¯ã䜿çšããŸãïŒcanvas.width = canvas .width;ã
å·çæç¹ã§ã¯ãclearRectã¯å¹ ã®ãªã»ãããè¿œãè¶ããŸãããå Žåã«ãã£ãŠã¯ãChrome 14ïŒ jsperf ïŒïŒ graphã§å¹ ã®ãªã»ããã䜿çšããæ¹ãã¯ããã«é«éã§ãã
ãããã®ããªãã¯ã¯ããã£ã³ãã¹ã®å®è£ ã«å€§ããäŸåããŠããããã泚æããŠãã ããã 詳现ã«ã€ããŠã¯ããã£ã³ãã¹ã®ã¯ãªãŒãã³ã°ã«é¢ããSimon Sarrisã®èšäºãåç §ããŠãã ããã
æŽæ°ä»¥å€ã®åº§æšãé¿ãã
HTML5ãã£ã³ãã¹ã¯ãµããã¯ã»ã«ã¬ã³ããªã³ã°ããµããŒãããŠãããç¡å¹ã«ããæ¹æ³ã¯ãããŸããã æŽæ°ä»¥å€ã®åº§æšã§æç»ããå Žåãèªåçã«ã¢ã³ããšã€ãªã¢ã¹ã䜿çšããŠç·ãæ»ããã«ããŸãã Seb Lee-Delisleã®èšäºã®ãµããã¯ã»ã«ããã©ãŒãã³ã¹ã®èŠèŠå¹æã以äžã«ç€ºããŸã ã
å¹³æ»åãããã¹ãã©ã€ããå¿ èŠãªãã®ã§ã¯ãªãå ŽåãMath.floorãŸãã¯Math.roundïŒ jsperf ïŒïŒ graphã䜿çšããŠåº§æšãå€æããæ¹ãã¯ããã«é«éã§ãã
éæŽæ°åº§æšãæŽæ°åº§æšã«å€æããã«ã¯ãããã€ãã®æ©ç¥ã«å¯ãã ææ³ããããŸãããã®ã»ãšãã©ã¯ãæ°ã«ååãè¿œå ãããããåäœã®æäœãé©çšããŠã«ãããªãåé€ããããšã«åºã¥ããŠããŸãã
// With a bitwise or. rounded = (0.5 + somenum) | 0; // A double bitwise not. rounded = ~~ (0.5 + somenum); // Finally, a left bitwise shift. rounded = (0.5 + somenum) << 0;
ããã§ããã©ãŒãã³ã¹ã®å®å šãªå èš³ïŒ jsperf ïŒïŒ ã°ã©ã ã
ãã®æé©åæ¹æ³ã¯ããã£ã³ãã¹ã®å®è£ ãGPUã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã«ãªã£ãç¬éããæå³ããªããªããªããéæŽæ°åº§æšããã°ããæç»ã§ããŸãã
ãrequestAnimationFrameãã§ã¢ãã¡ãŒã·ã§ã³ãæé©åãã
æ¯èŒçæ°ããrequestAnimationFrame APIã¯ããã©ãŠã¶ã§ã€ã³ã¿ã©ã¯ãã£ãã¢ããªã±ãŒã·ã§ã³ãå®è£ ããããã«æšå¥šãããŸãã ç¹å®ã®é »åºŠã§æç»ããããã«ãã©ãŠã¶ã«æ瀺ãã代ããã«ãã¬ã³ããªã³ã°ãåŒã³åºãããã«äžå¯§ã«ãã©ãŠã¶ã«èŠæ±ããå®äºãããéç¥ããŸãã ããã«ãããŒãžãéã¢ã¯ãã£ããªå Žåããã©ãŠã¶ã¯æç»ããªãã»ã©ã¹ããŒãã§ãã
requestAnimationFrameåŒã³åºãã¯60 FPSã察象ãšããŠããŸããããããä¿èšŒãããã®ã§ã¯ãªããããæåŸã®ã¬ã³ããªã³ã°ããçµéããæéã远跡ããå¿ èŠããããŸãã 次ã®ããã«ãªããŸãã
var x = 100; var y = 100; var lastRender = new Date(); function render() { var delta = new Date() - lastRender; x += delta; y += delta; context.fillRect(x, y, W, H); requestAnimationFrame(render); } render();
requestAnimationFrameã®äœ¿çšã¯ããã£ã³ãã¹ãšWebGLãªã©ã®ä»ã®æè¡ã®äž¡æ¹ã«é©çšãããããšã«æ³šæããŠãã ããã
ãã®èšäºã®å·çæç¹ã§ã¯ãAPIã¯ChromeãSafariãFirefoxã§ã®ã¿äœ¿çšå¯èœã§ããã®ã§ã æ éã«äœ¿çšããå¿ èŠããããŸãã
ã»ãšãã©ã®ã¢ãã€ã«ãã£ã³ãã¹ã®å®è£ ã¯é ã
ã¢ãã€ã«ãã©ãããã©ãŒã ã«ã€ããŠè©±ããŸãããã æ®å¿µãªãããå·çæç¹ã§ã¯ãSafari 5.1ãæèŒããiOS 5.0ããŒã¿çã®ã¿ããã£ã³ãã¹ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã䜿çšããŠããŸããã ããããªããšãã¢ãã€ã«ãã©ãŠã¶ã«ã¯ãææ°ã®ãã£ã³ãã¹ã¢ããªã±ãŒã·ã§ã³ã«ååãªCPUãæèŒãããŠããŸããã äžèšã®ããã€ãã®ãã¹ãã¯ããã¹ã¯ããããšæ¯èŒããŠã¢ãã€ã«ãã©ãããã©ãŒã ã®ããã©ãŒãã³ã¹ãäœäžããé åºã瀺ããŠãããæåãæåŸ ã§ããã¯ãã¹ãã©ãããã©ãŒã ã¢ããªã±ãŒã·ã§ã³ã®ã¿ã€ããå€§å¹ ã«å¶éããŠããŸãã
ãããã«
ãã®èšäºã§ã¯ãçç£çãªHTML5ãã£ã³ãã¹ã¢ããªã±ãŒã·ã§ã³ã®éçºã«åœ¹ç«ã€ãæçšãªæé©åã®åºç¯ãªã»ããã«ã€ããŠèª¬æããŸããã ããã§äœãæ°ããããšãåŠãã ã®ã§ãå ã«é²ã¿ãçŽ æŽãããäœåãæé©åããŸãã ãŸãã¯ãã²ãŒã ãæé©åã¢ããªããŸã ãæã¡ã§ãªãå Žåã¯ã Chrome ExperimentsãŸãã¯Creative JSãåèã«ããŠãã ããã
åç §è³æ
- å³æã¢ãŒããš ä¿æã¢ãŒãã
- ãã®ä»ã®HTML5Rocks ãã£ã³ãã¹ã®èšäº ã
- Dive into HTML5ã®Canvasã»ã¯ã·ã§ã³ ã
- JSPerfã䜿çšãããšãéçºè ã¯JSããã©ãŒãã³ã¹ãã¹ããäœæã§ããŸãã
- Browserscopeã¯ããã©ãŠã¶ãŒã®ããã©ãŒãã³ã¹ããŒã¿ãä¿åããŸãã
- JSPerfView ïŒJSPerfãã¹ããã°ã©ããšããŠè¡šç€ºããŸãã
- ãã£ã³ãã¹ã®ã¯ãªã¢ã«é¢ããSimonã®ããã°æçš¿ ã
- ãµããã¯ã»ã«ã¬ã³ããªã³ã°ã®ããã©ãŒãã³ã¹ã«é¢ããSebastianã®ããã°æçš¿ ã
-
requestAnimationFrame
䜿çšã«é¢ããPaulã®ããã°æçš¿ ã - JS NESãšãã¥ã¬ãŒã¿ãŒã®æé©åã«é¢ãããã³ã®è¬æŒ ã
ãæ°ã«å ¥ãã®ã³ã¡ã³ã
ãã±ãã¬ããªã³ ïŒ
ã¢ãã€ã«ããã€ã¹ã§ã¯ãç¶æ³ã¯ãŸã£ããéã§ã-å€å±€ãã£ã³ãã¹ã¯éåžžã«é ãããã1 +ã·ãŒã³ãã¬ã¬ã³ããªã³ã°ãèæ¯ã«äœ¿çšããå¿ èŠããããŸãïŒãããŠãdivã®åŸãã¯ãã£ã³ãã¹ã®ãµã€ãºã§ããããã£ã³ãã¹ã®èæ¯ãäžå¯è§£ãªããšã«éåžžã«é ãããïŒã
ãã£ãšããªãããŒãªæ¹æ³ã§ãæºåž¯é»è©±ã§å®å šã«éåžžã®é床ã®ãã£ã³ãã¹ãå®çŸã§ããŸãã
TheShock ïŒ
...
ã³ãŒãããå€æãããšãåãã¬ãŒã ã«ã°ã©ãã£ãã¯ããªããã£ããæç»ãã代ããã«ããããã¡ã«äžåºŠæç»ããŠãããããã¡ããæç»ããæ¹ãããããšãæå³ããŸããæ°åŠã«åŸã£ãŠã.arcãŸãã¯æ²ç·ã§è¡ãããæ°åŠèšç®ã«åŸã£ãŠåãæç»ããã®ã¯æ¬åœã§ãã bezierCurveToã§è¡ãããèšç®ã¯ãé©åãªãµã€ãºã®ç»åãåã«ã³ããŒãããããã¯ããã«é ããªããŸãã
ããããå®éã®ãããã«ãããã¡ãªã³ã°ãã¯ããŸãæå³ããããŸããããã©ãŠã¶ã«ã¯ç¬èªã®ããã¯ãããã¡ããããããã¯ãããã¡ãã¡ã€ã³ã¬ã€ã€ã«æç»ããŸãã
1.æéããããããã
2.ã¬ã³ããªã³ã°ã®ããã«ããã¯ãæ¢ãã®ãé£ãããªããŸã
...