Webã¯ãŒã«ãŒã¯ãã¡ã€ã³ã¹ã¬ããã®å€éšã§JavaScriptã³ãŒããå®è¡ããããŒã«ãããã°ã©ããŒã«æäŸããŸããããã«ããããã©ãŠã¶ãŒã§ã®åŠçãè¡ãããŸãã ãã®ã¹ããªãŒã ã¯ãç»é¢ãžã®ããŒã¿åºåã®èŠæ±ãåŠçãããŠãŒã¶ãŒã®æäœãç¹ã«ããŒã¹ãããŒã¯ãšããŠã¹ã¯ãªãã¯ã®èªèããµããŒãããŸãã åãã¹ã¬ããããããšãã°AJAXèŠæ±ã®åŠçãªã©ããããã¯ãŒã¯ã®ãµããŒããæ
åœããŸãã
ã€ãã³ããšAJAXãªã¯ãšã¹ãã®åŠçã¯éåæã§ãã¡ã€ã³ã¹ã¬ããã®å€éšã§ã³ãŒããå®è¡ããæ¹æ³ãšèããããšãã§ããŸããããã®ãããªæäœãå®è¡ããããã®è² è·ã¯ãã¹ãŠã¡ã€ã³ã¹ã¬ããã«ããã£ãŠããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®éåžžã®æäœãä¿èšŒããã«ã¯ããããã®æäœãå®è¡ããå¿
èŠããããŸããšãŠãéãã ããããªããšãã€ã³ã¿ã©ã¯ãã£ããªããŒãžèŠçŽ ãæåŸ
ã©ããã«æ©èœããŸããã

Webã¯ãŒã«ãŒã䜿çšãããšãJavaScriptã³ãŒããã¡ã€ã³ã¹ã¬ãããšéåžžäœãèµ·ããããšã¯å®å
šã«ç¬ç«ããå¥ã®ã¹ã¬ããã§å®è¡ã§ããŸãã
æè¿ãWebã¯ãŒã«ãŒã®å©ããåããŠã©ã®ãããªå®çšçãªã¿ã¹ã¯ã解決ã§ãããã«ã€ããŠå€ãã®è©±ããããŸãã æ®éã®çŸä»£ã®ããŒãœãã«ã³ã³ãã¥ãŒã¿ãŒã§ãããæã€èšç®èœåãšãã¢ãã€ã«ããã€ã¹ãããã©ãŒãã³ã¹ãšã¡ã¢ãªãµã€ãºã®ç¹ã§ããã«è¿ã¥ããŠãããšããäºå®ãèãããšããã©ãŠã¶ãŒã¢ããªã±ãŒã·ã§ã³ã§ã¯ã以åã¯è€éããããšèããããŠããå€ãã®ããšãã§ããŸãã
æ¬æ¥å
¬éãã翻蚳ã§ãããã®è³æã§ã¯ãã¡ã€ã³ã¹ã¬ããã«ã¯éãããã¿ã¹ã¯ã解決ããããã«Webã¯ãŒã«ãŒã䜿çšããæ©èœã«ã€ããŠèª¬æããŸãã ç¹ã«ãããã§ã¯ãã¡ã€ã³ã¹ããªãŒã ãšWebã¯ãŒã«ãŒã¹ããªãŒã éã®ããŒã¿äº€æãæŽçããæ¹æ³ã«ã€ããŠèª¬æããŸãã ãŸããWebã¯ãŒã«ãŒã䜿çšããããã®ããŸããŸãªã·ããªãªã瀺ãããã€ãã®äŸãåãäžããŸãã
Web Workerã®åºæ¬
å€ãã®å Žåãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã¯ãéçºè
ã®ã³ââã³ãã¥ãŒã¿ãŒäžã®åé¢ãããç°å¢ã§åæãããååŸãããã®ã«æºè¶³ãããŸãŸã§ãã ããšãã°ããã®ã¢ãããŒãã§ã¯ãæå°éã®è¿œå ããã°ã©ã ããã®ãããªã³ã³ãã¥ãŒã¿ãŒã§å®è¡ãããŸãã ãã ããå®éã«ã¯ããã§ã¯ãããŸããã éåžžã®ãŠãŒã¶ãŒãããã°ã©ã ãšäžç·ã«ããã«å€ãã®ã¢ããªã±ãŒã·ã§ã³ãå®è¡ã§ãããšããŸãããã
ãã®çµæãWebã¯ãŒã«ãŒã«ãã£ãŠäœæãããåå¥ã®ã¹ã¬ããã䜿çšããã«ãéé¢ãããç°å¢ã§æ£åžžã«åäœããã¢ããªã±ãŒã·ã§ã³ã¯ãå®éã®äœ¿çšã·ããªãªã§é©åã«èŠããããã«ãã®ãããªã¹ã¬ãããå¿
èŠãšããå ŽåããããŸãã
Webã¯ãŒã«ãŒãå®è¡ãããšãé©åãªãªããžã§ã¯ããäœæãããJavaScriptã³ãŒãã§ãã¡ã€ã«ãžã®ãã¹ãæž¡ãããŸãã
new Worker('worker-script.js')
äœæåŸãã¯ãŒã«ãŒã¯ã¡ã€ã³ã¹ã¬ããããç¬ç«ããå¥ã®ã¹ã¬ããã§åäœãããã¡ã€ã«ãšããŠè»¢éãããã³ãŒããå®è¡ããŸãã ãã©ãŠã¶ã¯ãWebã¯ãŒã«ãŒã®äœææã«æå®ããããã¡ã€ã«ãæ€çŽ¢ãããšãã«ãçŸåšã®HTMLããŒãžã眮ãããŠãããã©ã«ããŒãã«ãŒããšããçžå¯Ÿãã¹ã䜿çšããŸãã
ã¯ãŒã«ãŒãšã¡ã€ã³ã¹ããªãŒã éã®ããŒã¿ã¯ã2ã€ã®è£å®çãªã¡ã«ããºã ã䜿çšããŠéä¿¡ãããŸãã
postMessage()
é¢æ°ã¯éä¿¡è
ã«ãã£ãŠäœ¿çšãããŸãã
message
ã€ãã³ããã³ãã©ã¯åä¿¡åŽã§é©çšãããŸãã
message
ã€ãã³ããã³ãã©ãŒã¯ã€ãã³ãåŒæ°ãåãå
¥ããä»ã®ãã³ãã©ãŒãšåãããã«åäœããŸãã ãã®åŒæ°ã«ã¯ãåä¿¡åŽã«æž¡ãããããŒã¿ãå«ã
data
ããããã£ããããŸãã
äžèšã®ã¡ã«ããºã ã䜿çšãããšãåæ¹åã®æ
å ±äº€æãæŽçã§ããŸãã ã¡ã€ã³ã¹ã¬ããã®ã³ãŒãã¯ã
postMessage()
é¢æ°ã䜿çšããŠã¡ãã»ãŒãžãã¯ãŒã«ãŒã«éä¿¡ã§ããŸãã ã¯ãŒã«ãŒã¯ãã¯ãŒã«ãŒç°å¢ã§ã°ããŒãã«ã«å©çšå¯èœãª
postMessage()
å®è£
ã䜿çšããŠãã¡ã€ã³ã¹ã¬ããã«å¿çãéä¿¡ã§ããŸãã
ã¡ã€ã³ã¹ã¬ãããšWebã¯ãŒã«ãŒéã§ããŒã¿ãå
±æããããã®ç°¡åãªãããŒãã£ãŒãã¯æ¬¡ã®ããã«ãªããŸãã ããã¯ãHTMLããŒãžã®ã³ãŒããã©ã®ããã«ã¯ãŒã«ãŒã«ã¡ãã»ãŒãžãéä¿¡ããå¿çãåŸ
æ©ãããã瀺ããŠããŸãã
var worker = new Worker("demo1-hello-world.js"); // , postMessage() - worker.onmessage = (evt) => { console.log("Message posted from webworker: " + evt.data); } // - worker.postMessage({data: "123456789"});
以äžã¯ãããŒãžããã®ã¡ãã»ãŒãžã®åŠçãšå¿çãéä¿¡ããã¡ã«ããºã ãç·šæãããŠããWebã¯ãŒã«ãŒã®ã³ãŒãã§ãã
// demo1-hello-world.js postMessage('Worker running'); onmessage = (evt) => { postMessage("Worker received data: " + JSON.stringify(evt.data)); };
ãã®ã³ãŒããå®è¡ãããšãã³ã³ãœãŒã«ã«æ¬¡ã衚瀺ãããŸãã
Message posted from webworker: Worker running Message posted from webworker: Worker received data: {"data":"123456789"}
Webã¯ãŒã«ãŒã䜿çšããå Žåããããã¯é·æéå®è¡ãããããšãæåŸ
ãããçãã¿ã¹ã¯ãå®äºããããã«äœ¿çšããããåžžã«éå§ããã³åæ¢ãããŸãã ã¯ãŒã«ãŒã®ã©ã€ããµã€ã¯ã«äžã«ãã¡ã€ã³ã¹ã¬ãããšã®å€ãã®ã¡ãã»ãŒãžã³ã°ã»ãã·ã§ã³ãè¡ãããšãã§ããŸãã Webã¯ãŒã«ãŒã®å®è£
ã¯ã2ã€ã®ã¡ã«ããºã ã«ãããå®å
šã§ç«¶åã®ãªãã³ãŒãå®è¡ãæäŸããŸãã
- ãã©ãŠã¶ç°å¢ããåé¢ããããã¯ãŒã«ãŒã¹ã¬ããå°çšã®åé¢ãããã°ããŒãã«ç°å¢ã
postMessage()
é¢æ°ã䜿çšããŠãã¡ã€ã³ã¹ã¬ãããšã¯ãŒã«ãŒã¹ã¬ããéã§ããŒã¿ã®ã³ããŒã転éããŸãã
åã¯ãŒã«ãŒã¹ã¬ããã«ã¯ãHTMLããŒãžã«ããã³ãŒããå®è¡ãããJavaScriptç°å¢ãšã¯ç°ãªãåå¥ã®åé¢ãããã°ããŒãã«ç°å¢ããããŸãã ã¯ãŒã«ãŒã¯ãããŒãžç°å¢ããå©çšå¯èœãªã¡ã«ããºã ã«ã¢ã¯ã»ã¹ã§ããŸããã DOMã«ã¢ã¯ã»ã¹ã§ããã
window
ããã³
document
ãªããžã§ã¯ããæäœã§ããŸããã
ã¯ãŒã«ãŒã«ã¯ãéçºè
ã®ã³ââã³ãœãŒã«ã«ã¡ãã»ãŒãžãèšé²ããããã®
console
ãªããžã§ã¯ãããAJAXãªã¯ãšã¹ããå®è¡ããããã®
XMLHttpRequest
ãªããžã§ã¯ããªã©ãããã€ãã®ã¡ã«ããºã ã®ç¬èªã®ããŒãžã§ã³ããããŸãã ãã ããä»ã®åé¡ã§ã¯ãã¯ãŒã«ãŒã«ãã£ãŠå®è¡ãããã³ãŒãã¯èªçµŠèªè¶³ã§ããããšãæåŸ
ãããŸãã ãã®ãããããšãã°ãã¡ã€ã³ã¹ããªãŒã ã§äœ¿çšããäºå®ã®ã¯ãŒã«ãŒã¹ããªãŒã ã®
data
ã¯ã
postMessage()
é¢æ°ãä»ããŠ
data
ãªããžã§ã¯ããšããŠè»¢éããå¿
èŠããããŸãã
ããã«ã
postMessage()
é¢æ°ã䜿çšããŠéä¿¡ãããããŒã¿ã¯ã³ããŒãããŸããã€ãŸããã¡ã€ã³ã¹ããªãŒã ã«ãã£ãŠè¡ããããã®ããŒã¿ãžã®å€æŽã¯ãã¯ãŒã«ãŒã¹ããªãŒã ã®å
ã®ããŒã¿ã«åœ±é¿ããŸããã ããã¯ãã¡ã€ã³ã¹ããªãŒã ãšã¯ãŒã«ãŒã¹ããªãŒã éã§éä¿¡ããã競åãã䞊åããŒã¿å€æŽã«å¯Ÿããä¿è·ã®å
éšã¡ã«ããºã ã§ãã
Web Workerã®äœ¿çšãªãã·ã§ã³
Webã¯ãŒã«ãŒã®äžè¬çãªäœ¿çšæ³ã¯ãã¡ã€ã³ã¹ã¬ããã«å«ãŸããèšç®éã®ç¹ã§å°é£ã«ãªãå¯èœæ§ã®ããã¿ã¹ã¯ã§ãã ãã®è€éãã¯ãéå°ãªããã»ããµãªãœãŒã¹ã®æ¶è²»ããŸãã¯ãã®ã¿ã¹ã¯ã®å®è£
ããããšãã°ããŒã¿ã«ã¢ã¯ã»ã¹ããããã«äºæ³å€ã«é·ãæéãå¿
èŠãšããå¯èœæ§ããããšããäºå®ã®ããããã§è¡šãããŸãã
Webã¯ãŒã«ãŒã䜿çšããããã®ãªãã·ã§ã³ã®äžéšã次ã«ç€ºããŸãã
- åŸã§äœ¿çšããããã«ããŒã¿ãããªããŒããŸãã¯ãã£ãã·ã¥ããŸãã
- WebãµãŒãã¹ããããŒã¿ãããŠã³ããŒããããã®ããŒã¿ãåŠçããŸãã
- 倧éã®ããŒã¿ïŒããçš®ã®ç§åŠç»åãªã©ïŒã®åºåã®åŠçãšæºåã
- ã²ãŒã ã®åãã®åŠçã«é¢é£ããèšç®ã
- ç»ååŠçãšãã£ã«ã¿ãªã³ã°ã
- ããã¹ãããŒã¿åŠçïŒããã°ã©ã ããã¹ãã®æ§æã®ãã§ãã¯ããã¬ãŒã³ããã¹ãã®ã¹ãã«ãã§ãã¯ãåèªæ°ã®ã«ãŠã³ãïŒã
æãåçŽãªã±ãŒã¹ã§ã¯ãWebã¯ãŒã«ãŒã䜿çšããŠè§£æ±ºããåé¡ãéžæãããšããããã解決ããããã«å¿
èŠãªèšç®éã«æ³šæãæãå¿
èŠããããŸãã ãã ããããšãã°ãããã¯ãŒã¯ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããããã«å¿
èŠãªæéãèæ
®ããããšã¯éåžžã«éèŠã§ãã éåžžã«å€ãã®å Žåãã€ã³ã¿ãŒãããäžã®ããŒã¿äº€æã»ãã·ã§ã³ã¯ããããããªæéãããªç§ããããããŸãããããããã¯ãŒã¯ãªãœãŒã¹ãå©çšã§ããªããªãå Žåããããæ¥ç¶ã埩å
ããããããªã¯ãšã¹ããã¿ã€ã ã¢ãŠããããŸã§ããŒã¿äº€æãåæ¢ããå ŽåããããŸãïŒ1-2åãããå ŽåããããŸãïŒ
ãããŠãéé¢ãããéçºç°å¢ã§ããã°ã©ã ããã¹ããããšãã«ã³ãŒããå®è¡ããã®ã«æéãããããããªãå Žåã§ãããŠãŒã¶ãŒã®ã³ã³ãã¥ãŒã¿ãŒã§å€ãã®ã¿ã¹ã¯ãå®è¡ãããå Žåã«å ããŠãå®éã®ç¶æ
ã§ã³ãŒããå®è¡ãããšåé¡ã«ãªããŸãã
次ã®äŸã¯ãWebã¯ãŒã«ãŒã®ããã€ãã®å®çšçãªäœ¿çšäŸã瀺ããŠããŸãã
ã²ãŒã å
ã®è¡çªåŠç
æè¿ããã©ãŠã¶ãŒã§å®è¡ãããHTML5ã²ãŒã ã¯éåžžã«äžè¬çã§ãã äžå¿çãªã²ãŒã ã¡ã«ããºã ã®1ã€ã¯ãã²ãŒã äžçã§ã®ãªããžã§ã¯ãã®åããšçžäºäœçšã®èšç®ã§ãã äžéšã®ã²ãŒã ã§ã¯ã移åããèŠçŽ ã®æ°ãæ¯èŒçå°ãªããã¢ãã¡ãŒã·ã§ã³åããããšã¯é£ãããããŸããïŒããšãã°ããã®ããŒãžã§ã³ã®
Super Marioãªã© ïŒã ãã ããããéäžçãªã³ã³ãã¥ãŒãã£ã³ã°ãå¿
èŠãšããã²ãŒã ããããšä»®å®ããŸãããã
ãã®äŸã§ã¯ãå€ãã®ã«ã©ãã«ãªãªããžã§ã¯ãïŒããŒã«ãŸãã¯ããŒã«ãšèŠãªããŸãïŒã衚瀺ãããŸãããããã¯éããé·æ¹åœ¢ã®ã¹ããŒã¹ã«ããã移åããŠå£ãè·³ãè¿ããŸãã ç§ãã¡ã®ã¿ã¹ã¯ã¯ããŸãããŒã«ããã®ã¹ããŒã¹ããåºãªãããã«ãã次ã«ããŒã«ãäºãã«è·³ãè¿ãããã«ããããšã§ãã ã€ãŸããçžäºã®è¡çªãšç«¶æå Žã®å¢çãšã®è¡çªãåŠçããå¿
èŠããããŸãã
å¢çç·ãšã®è¡çªã®åŠçã¯æ¯èŒçåçŽãªã¿ã¹ã¯ã§ãããæ·±å»ãªèšç®ã¯å¿
èŠãããŸãããããã®ã¿ã¹ã¯ã®è€éãã¯è©³çŽ°ã«å
¥ããªãå Žåã§ããªããžã§ã¯ãã®æ°ã®2ä¹ã«æ¯äŸããããããªããžã§ã¯ãå士ã®è¡çªãæ€åºããã«ã¯å€ãã®ã³ã³ãã¥ãŒãã£ã³ã°ãªãœãŒã¹ãå¿
èŠã«ãªãå ŽåããããŸã ã€ãŸãã
n
ããŒã«ã«ã€ããŠã亀差ãããã©ãããç解ããããã«ãä»ã®ãã¹ãŠãšæ¯èŒããŠããããã®ããŒã«ã®äœçœ®ã確èªããå¿
èŠãããã移åæ¹åãå€æŽããå¿
èŠããªãããããªããŠã³ããå®çŸããnã®2ä¹ã«çããæäœæ°ã«ã€ãªãããŸãã
ãããã£ãŠã50åã®ããŒã«ã«ã€ããŠã¯ãçŽ2500åã®æ¯èŒãè¡ãå¿
èŠããããŸãã 100åã®ããŒã«ã®å Žåããã§ã«10,000åã®ãã§ãã¯ãå¿
èŠã§ãïŒå®éãããŒã«
n
ãšããŒã«
m
ã®è¡çªããã§ãã¯ããå ŽåãããŒã«
m
ãšããŒã«
n
è¡çªããã§ãã¯ããå¿
èŠã¯ãªãããããã®æ°ã¯ç€ºãããŠããæ°ã®ååãããããã«å°ãªããªã£ãŠããŸãããããã«ããããããããã®ãããªåé¡ã解決ããã«ã¯å€§éã®èšç®ãå¿
èŠã«ãªããŸãïŒã
ãã®äŸã§ã¯ãããŒã«å士ã®è¡çªã競æå Žã®å¢çãšã®è¡çªãåŠçããããã®èšç®ã¯ãåå¥ã®Webã¯ãŒã«ãŒã¹ã¬ããã§å®è¡ãããŸãã ãã®ã¹ããªãŒã ã¯1ç§ããã60åã¢ã¯ã»ã¹ãããŸããããã¯ããã©ãŠã¶ãŒã®ã¢ãã¡ãŒã·ã§ã³é床ããŸãã¯
requestAnimationFrame()
ååŒã³åºãã«å¯Ÿå¿ã
requestAnimationFrame()
ã ããã§ã¯ã
Ball
ãªããžã§ã¯ãã®ãªã¹ããå«ã
World
ãªããžã§ã¯ãã«ã€ããŠèª¬æããŸãã å
Ball
ãªããžã§ã¯ãã«ã¯ãçŸåšã®äœçœ®ãšé床ã«é¢ããæ
å ±ãä¿åãããŸãïŒãªããžã§ã¯ãã®ååŸãšè²ã«é¢ããæ
å ±ããããç»é¢ã«è¡šç€ºããããšãã§ããŸãïŒã
çŸåšã®äœçœ®ã§ã®ããŒã«ã®åºåã¯ãã¡ã€ã³ã¹ã¬ããïŒ
Canvas
ãªããžã§ã¯ããšãã®æç»ã³ã³ããã¹ãã«ã¢ã¯ã»ã¹ã§ããïŒã§å®è¡ãããŸãã ããŒã«ã®äœçœ®ã¯ãWebã¯ãŒã«ãŒã¹ã¬ããã§æŽæ°ãããŸãã ããŒã«ã競æå Žã®å¢çãŸãã¯ä»ã®ããŒã«ãšè¡çªãããšãé床ïŒç¹ã«ãããŒã«ã®ç§»åæ¹åïŒãå€åããŸãã
World
ãªããžã§ã¯ãã¯ããã©ãŠã¶ãŒã®ã¯ã©ã€ã¢ã³ãã³ãŒããšã¯ãŒã«ãŒã¹ã¬ããã®éã§æž¡ãããŸãã ããã¯ãæ°çŸåã®ããŒã«ã«å¯ŸããŠãæ¯èŒçå°ããªãªããžã§ã¯ãã§ãïŒããšãã°ã100åã®ããŒã«ã«å¯ŸããŠã1ã€ã«çŽ64ãã€ãã®ããŒã¿ãå¿
èŠãªå Žåãåèšéã¯çŽ6400ãã€ãã«ãªããŸãïŒã ãã®çµæãããã§ã®äž»ãªåé¡ã¯ãã²ãŒã ãªããžã§ã¯ãã«é¢ããããŒã¿ã®è»¢éã§ã¯ãªããã·ã¹ãã ã®èšç®è² è·ã§ãã
ãã®äŸã®å®å
šãªã³ãŒãã¯
ããã«ãããŸã ã ç¹ã«ãã¢ãã¡ãŒã·ã§ã³åããããªããžã§ã¯ããè¡šãããã«äœ¿çšããã
Ball
ã¯ã©ã¹ãšãã¢ãã¡ãŒã·ã§ã³ãå®è¡ãã
move()
ããã³
draw()
ã¡ãœãããå®è£
ãã
World
ã¯ã©ã¹ããããŸãã
ã¯ãŒã«ãŒã䜿çšããã«ã¢ãã¡ãŒã·ã§ã³ãå®è¡ããå Žåããã®äŸã®ã¡ã€ã³ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
const canvas = $('#democanvas').get(0), canvasBounds = {'left': 0, 'right': canvas.width, 'top': 0, 'bottom': canvas.height}, ctx = canvas.getContext('2d'); const numberOfBalls = 150, ballRadius = 15, maxVelocity = 10; // World const world = new World(canvasBounds), '#FFFF00', '#FF00FF', '#00FFFF']; // Ball World for(let i=0; i < numberOfBalls; i++) { world.addObject(new Ball(ballRadius, colors[i % colors.length]) .setRandomLocation(canvasBounds) .setRandomVelocity(maxVelocity)); } ... // function animationStep() { world.move(); world.draw(ctx); requestAnimationFrame(animationStep); } animationStep();
requestAnimationFrame()
ã䜿çšããŠãç»é¢æŽæ°æéã®äžéšãšããŠã
animationStep()
é¢æ°ã1ç§ããã60ååŒã³åºããŸãã ã¢ãã¡ãŒã·ã§ã³ã®ã¹ãããã¯ãåããŒã«ã®äœçœ®ïŒããã³å Žåã«ãã£ãŠã¯ãã®åãã®æ¹å
move()
ãæŽæ°ãã
move()
ã¡ãœããã®åŒã³åºããšã
canvas
ãªããžã§ã¯ãã䜿çšããŠæ°ããäœçœ®ã«ããŒã«ã衚瀺ãã
draw()
ã¡ãœããã®åŒã³åºãã§æ§æãããŸãã
ãã®ããã°ã©ã ã§ã¯ãŒã«ãŒãããŒã䜿çšããã«ã¯ã
move()
ã¡ãœãããåŒã³åºããããšãã«å®è¡ãããèšç®ãã€ãŸã
World.move()
ã³ãŒããã¯ãŒã«ãŒã«éä¿¡ããå¿
èŠããããŸãã
World
ãªããžã§ã¯ãã¯ã
postMessage()
åŒã³åºãã䜿çšããŠã
data
ãªããžã§ã¯ãã®åœ¢åŒã§ã¯ãŒã«ãŒã¹ã¬ããã«
data
ãŸããããã«ãããããã§
move()
ã¡ãœãããåŒã³åºãããšãã§ããŸãã æããã«ã
World
ãªããžã§ã¯ããã¡ã€ã³ã¹ããªãŒã ãšWebã¯ãŒã«ãŒã®éã§è»¢éããå¿
èŠããããŸããããã¯ãç»é¢ã«è¡šç€ºããã
Ball
ãªããžã§ã¯ãã®ãªã¹ããšãããããä¿æãããé·æ¹åœ¢é åã«é¢ããããŒã¿ãå«ãŸããŠããããã§ãã ããã«ã
Ball
ãªããžã§ã¯ãã«ã¯ãããããã®ããŒã«ã®äœçœ®ãé床ãããã³ç§»åæ¹åã«é¢ãããã¹ãŠã®æ
å ±ãå«ãŸããŠããŸãã
Web Workerã䜿çšããããã«èšèšããããããžã§ã¯ããå€æŽãããšãã¢ãã¡ãŒã·ã§ã³ã«ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
let worker = new Worker('collider-worker.js'); // draw worker.addEventListener("message", (evt) => { if ( evt.data.message === "draw") { world = evt.data.world; world.draw(ctx); requestAnimationFrame(animationStep); } }); // function animationStep() { worker.postMessage(world); // world.move() in worker } animationStep();
ã¯ãŒã«ãŒã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
// collider-worker.js importScripts("collider.js"); this.addEventListener("message", function(evt) { var world = evt.data; world.move(); // , this.postMessage({message: "draw", world: world}); });
ããã«ç€ºãã³ãŒãã¯ããŠã§ãã¯ãŒã«ãŒã¹ã¬ãããã¡ã€ã³ã¹ããªãŒã ãã
postMessage()
ã䜿çšããŠæž¡ããã
World
ãªããžã§ã¯ããåãåããã²ãŒã ãªããžã§ã¯ãã®äœçœ®ãšé床ã®æ°ããå€ãèšç®ããåŸãåããªããžã§ã¯ããã¡ã€ã³ã¹ããªãŒã ã«æ»ããšããäºå®ã«åºã¥ããŠããŸãäžçã®ã ãã©ãŠã¶ãã¹ã¬ããéã§è»¢éããããšãã«ãã®ãªããžã§ã¯ãã®ã³ããŒãäœæããããšã«æ³šæããŠãã ããã ããã§ã¯ã
World
ãªããžã§ã¯ãã®ã³ããŒãäœæããã®ã«å¿
èŠãªæéãOïŒn ** nïŒããã¯ããã«çããã€ãŸããè¡çªãæ€åºããã®ã«å¿
èŠãªæéïŒå®éã
World
ãªããžã§ã¯ãã«ã¯æ¯èŒçå°éã®ããŒã¿ãæ ŒçŽãããïŒ ïŒ
ãã ããæ°ããã³ãŒããéå§ãããšãäºæããªããšã©ãŒãçºçããŸãã
Uncaught TypeError: world.move is not a function at collider-worker.js:10
postMessage()
é¢æ°ã䜿çšããŠãªããžã§ã¯ããæž¡ããšãã«ãªããžã§ã¯ããã³ããŒããããã»ã¹ã§ã¯ãããŒã¿ã¯ãªããžã§ã¯ãã®ããããã£ããã³ããŒãããŸããããããã¿ã€ãã¯ã³ããŒãããŸããã
World
ãªããžã§ã¯ãã®ã¡ãœããã¯ããªããžã§ã¯ããã³ããŒãããŠã¯ãŒã«ãŒã«æž¡ããããšãã«ãããã¿ã€ãããåé¢ãããŸãã ããã¯
ãæ§é ã¯ããŒãã³ã°ã¢ã«ãŽãªãºã ã®äžéšã§
ãã ãã¡ã€ã³ã¹ããªãŒã ãšWebã¯ãŒã«ãŒéã§ãªããžã§ã¯ãã転éãããšãã«ãªããžã§ã¯ããã³ããŒããæšæºçãªæ¹æ³ã§ãã ãã®ããã»ã¹ã¯ã
ã·ãªã¢ã«åãšãåŒã°
ããŸãã
äžèšã®ãšã©ãŒãåãé€ãããã«ã
World
ã¯ã©ã¹ã«ã¡ãœãããè¿œå ããŠãã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæãïŒã¡ãœãããæã€ãããã¿ã€ãããããŸãïŒã
postMessage()
ã䜿çšããŠéä¿¡ãããããŒã¿ã«åºã¥ããŠãã®ãªããžã§ã¯ãã®ããããã£ãåå²ãåœãŠããŸãã
static restoreFromData(data) { // , let world = new World(data.bounds); world.displayList = data.displayList; return world; }
ãããã®å€æŽåŸã«ã³ãŒããå®è¡ããããšãããšãå¥ã®åæ§ã®ãšã©ãŒãçºçããŸãã å®éã«ã¯ã
World
ãªããžã§ã¯ãã«æ ŒçŽãããŠãã
Ball
ãªããžã§ã¯ãã®ãªã¹ãã埩å
ããå¿
èŠããããŸãã
Uncaught TypeError: obj1.getRadius is not a function at World.checkForCollisions (collider.js:60) at World.move (collider.js:36)
World
ã¯ã©ã¹èªäœã®åŸ©å
ãšåãæ¹æ³ã§ã
postMessage()
æž¡ãããããŒã¿ã«åºã¥ããŠå
Ball
ãªããžã§ã¯ãã埩å
ãããããã«ã
World
ã¯ã©ã¹ã®å®è£
ãæ¡åŒµããå¿
èŠããããŸãã
ããã§ã
World
ã¯ã©ã¹ã¯
World
ããã«ãªããŸãã
static restoreFromData(data) { // , let world = new World(data.bounds); world.animationStep = data.animationStep; world.displayList = []; data.displayList.forEach((obj) => { // Ball let ball = Ball.restoreFromData(obj); world.displayList.push(ball); }); return world; }
åæ§ã®
restoreFromData()
ã¡ãœããã
Ball
ã¯ã©ã¹ã«å®è£
ãããŠããŸãïŒ
static restoreFromData(data) { // , const ball = new Ball(data.radius, data.color); ball.position = data.position; ball.velocity = data.velocity; return ball; }
ãããã®å€æŽã«ãããã¢ãã¡ãŒã·ã§ã³ãæ£ããå®è¡ãããã¯ãŒââã«ãŒãããŒå
ã®ããããæ°çŸã®ããŒã«ã®ããããã®å€äœãèšç®ããããã©ãŠã¶ãŒã®æ°ããäœçœ®ã«æ¯ç§60åã®é床ã§è¡šç€ºãããŸãã
ãã®Webã¯ãŒã«ãŒã¹ã¬ããã®äœ¿çšäŸã¯ãã¡ã¢ãªã§ã¯ãªã倧ããªèšç®ãªãœãŒã¹ãå¿
èŠãšããã¿ã¹ã¯ã®ãœãªã¥ãŒã·ã§ã³ã瀺ããŠããŸãã 解決ããããã«å€§éã®ã¡ã¢ãªãå¿
èŠãšããåé¡ã«çŽé¢ããå Žåã¯ã©ããªããŸããïŒ
ãããå€ç»ååŠç
ãã®äŸã§ã¯ãããã»ããµãšã¡ã¢ãªã®äž¡æ¹ã«å€§ããªè² è·ããããã¢ããªã±ãŒã·ã§ã³ãæ€èšããŸãã HTML5
canvas
ãªããžã§ã¯ããšããŠè¡šãããç»åãããã¯ã»ã«ããŒã¿ãååŸããŠå€æãããããã«åºã¥ããŠå¥ã®ç»åãäœæããŸãã
ããã§ã¯ã2012幎ã«Ilmari Heikinenãäœæãã
ç»ååŠçã©ã€ãã©ãªã䜿çšã
ãŸã ã ããã°ã©ã ã¯ã«ã©ãŒç»åãåãå
¥ããããããã€ããªã®çœé»ç»åã«å€æããŸãã å€æäžã«ã°ã¬ãŒã®ãããå€ã䜿çšãããŸããã°ã¬ãŒã®è²ã®å€ããã®ãããå€ãããå°ãããã¯ã»ã«ã¯é»ã«ãªãã倧ããªå€ã®ãã¯ã»ã«ã¯çœã«ãªããŸãã
æ°ããç»åãååŸããããã®ã³ãŒãã¯ããã¹ãŠã®ã«ã©ãŒå€ïŒRGB圢åŒã§è¡šç€ºïŒãééããåŒã䜿çšããŠå¯Ÿå¿ããã°ã¬ãŒã®æ¿æ·¡ã«å€æããŸãããã®åŸãçµæã®ãã¯ã»ã«ãé»ãçœãã決å®ããŸãã
Filters.threshold = function(pixels, threshold) { var d = pixels.data; for (var i=0; i < d.length; i+=4) { var r = d[i]; var g = d[i+1]; var b = d[i+2]; var v = (0.2126*r + 0.7152*g + 0.0722*b >= threshold) ? 255 : 0; d[i] = d[i+1] = d[i+2] = v } return pixels; };
ãããå
ã®ç»åã§ãã
ãœãŒã¹ç»ååŠçåŸã®åŠçã次ã«ç€ºããŸãã
åŠçãããç»åãµã³ãã«ã³ãŒãã¯
ãã¡ãã«ãããŸã ã
å°ããªç»åãæ±ãå Žåã§ããåŠçããå¿
èŠã®ããããŒã¿ã®éãšåŠçã®èšç®ã³ã¹ãã¯ââéåžžã«å€§ãããªãå¯èœæ§ããããŸãã ããšãã°ã640x480ãã¯ã»ã«ã®ç»åã«ã¯307,200ãã¯ã»ã«ããããåãã¯ã»ã«ã¯4ãã€ãã®RGBAããŒã¿ã«å¯Ÿå¿ããŸãïŒAã¯è²ã®éæ床ãèšå®ããã¢ã«ãã¡ãã£ãã«ã§ãïŒã ãã®çµæããã®ãããªã€ã¡ãŒãžã®ãµã€ãºã¯çŽ1.2 MBã§ãã Webã¯ãŒã«ãŒã䜿çšããŠããã¯ã»ã«ããŒã¿ãå埩åŠçãããã®è²ã®å€ãå€æããèšç»ã§ãã ç»åã®ãã¯ã»ã«ããŒã¿ã¯ã¡ã€ã³ã¹ããªãŒã ããWebã¯ãŒã«ãŒã«è»¢éãããå€æŽãããç»åã¯ã¯ãŒã«ãŒããã¡ã€ã³ã¹ããªãŒã ã«è¿ãããŸãã ã¡ã€ã³ã¹ããªãŒã ãšã¯ãŒã«ãŒã¹ããªãŒã ã®å¢çãè¶ãããã³ã«ãã®ããŒã¿ãã³ããŒããå¿
èŠããªããã°ãããã§ãããã
postMessage()
é¢æ°ã¯ãã¡ãã»ãŒãžã§åç
§ã«ãã£ãŠéä¿¡ãããããŒã¿ãèšè¿°ãã1ã€ä»¥äžã®ããããã£ãèšå®ããããšã«ãã䜿çšã§ããŸãã ã€ãŸããããŒã¿ã®ã³ããŒã¯éä¿¡ããããããããžã®ãªã³ã¯ãéä¿¡ãããŸãã 次ã®ããã«ãªããŸãã
<div style="margin: 50px 100px"> <img id="original" src="images/flmansion.jpg" width="500" height="375"> <canvas id="output" width="500" height="375" style="border: 1px solid;"></canvas> </div> ... <script type="text/javascript"> const image = document.getElementById('original'); ... </script>
ããã§ã¯ã
Transferable
ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããä»»æã®ãªããžã§ã¯ãã䜿çšã§ããŸãã
data.buffer
ãªããžã§ã¯ãã®
data.buffer
ã®æ§ç¯ã¯ããã®èŠä»¶ãæºãããŸã
Uint8ClampedArray
å
Uint8ClampedArray
ïŒãã®åã®é
åã¯ã8ãããã®ç»åããŒã¿ãæ ŒçŽããããã«èšèšãããŠããŸãïŒã
ImageData
ã¯
context
HTML5
canvas
ãªããžã§ã¯ãã®
context
ã«å¯ŸããŠ
getImageData()
ã¡ãœãããåŒã³åºããã®ã§ãã
Transferable
ã€ã³ã¿ãŒãã§ãŒã¹ã¯ã
ArrayBuffer
ã
MessagePort
ãããã³
ImageBitmap
ããã€ãã®æšæºããŒã¿åã«ãã£ãŠå®è£
ãããŸãã
ArrayBuffer
ã¯ãå€æ°ã®é
åã¿ã€ãã§è¡šãããŸãïŒ
Int8Array
ã
Uint8Array
ã
Uint8ClampedArray
ã
Int16Array
ã
Uint16Array
ã
Int32Array
ã
Uint32Array
ã
Float32Array
ã
Float64Array
ã
ãã®çµæãå€ã§ã¯ãªãåç
§ã«ãã£ãŠã¹ããªãŒã éã§ããŒã¿ã転éãããããã«ãªã£ãå Žåããã®ããŒã¿ã2ã€ã®ã¹ããªãŒã ããåæã«å€æŽã§ããŸããïŒ æšæºã§ã¯ããã®ãããªåäœã¯çŠæ¢ãããŠããŸãã
postMessage()
, ( «neutered»).
postMessage()
-, . JS-.
ãŸãšã
- HTML5 , , .
, -:
postMessage()
message
.
- , HTML5-.
- , , , ,
postMessage()
.
-:
- , JavaScript-
postMessage()
, . , .
- ,
getImageData()
, buffer
postMessage()
( imageData.data.buffer
, imageData.data
). Transferable
.
çŸåšãWebã¯ãŒã«ãŒã¯ææ°ã®ãã©ãŠã¶ã®ã»ãšãã©ããµããŒãããŠããŸããç¹ã«ãChromeãSafariãFireFoxãã©ãŠã¶ãŒã¯ã2009幎é ãããããããµããŒãããŠããŸããWebã¯ãŒã«ãŒã¯MS Edgeã§ããµããŒããããŠãããIE10以éInternet Explorerã§ãµããŒããããŠããŸãããããžã§ã¯ãã§Webã¯ãŒã«ãŒã䜿çšããå Žåããã®ãããžã§ã¯ããšç¹å®ã®ãã©ãŠã¶ãŒãšã®äºææ§ã確èªããã«ã¯ãåçŽãªåãã§ãã¯ãå®è¡ããã ãã§ååif (typeof Worker !== "undefined")
ã§ãããã©ãŠã¶ãŒã§Webã¯ãŒã«ãŒããµããŒããããŠããªãããšãå€æããå ŽåãæäŸãããŠããã°ãã¯ãŒã«ãŒã䜿çšãããŠããªãã³ãŒãã®ä»£æ¿ããŒãžã§ã³ã«åãæ¿ããããšãã§ããŸãïŒãã®ã¢ãããŒãã§ã¯ãã¿ã€ã ã¢ãŠããŸãã¯åŒã³åºãã«ãã£ãŠã³ãŒããå®è¡ã§ããŸãrequestAnimationFrame()
ïŒã芪æãªãèªè
ïŒ ãŠã§ãã¯ãŒã«ãŒã䜿çšããŠããŸããïŒ