ãµãŒãã¹ãšããŠã®ãœãããŠã§ã¢ããµãŒãã¹ãšããŠã®ã€ã³ãã©ã¹ãã©ã¯ãã£ããµãŒãã¹ãšããŠã®ãã©ãããã©ãŒã ããµãŒãã¹ãšããŠã®éä¿¡ãã©ãããã©ãŒã ããµãŒãã¹ãšããŠã®ãããªäŒè°ããµãŒãã¹ãšããŠã®ã¯ã©ãŠã ã²ãŒã ã¯ã©ãã§ãã? Google ãæè¿ç«ã¡äžãã Stadia ãªã©ãã¯ã©ãŠã ã²ãŒã (Cloud Gaming) ãäœæããè©Šã¿ã¯ãã§ã«ããã€ããããŸãã ã¹ã¿ãžã¢ã
Thanh Nguyen æ°ã¯ããã®æ©äŒããªãŒãã³ãœãŒã¹ ãããžã§ã¯ã CloudRetro ã§ãã¹ãããããšã«ããŸããã CloudRetro 㯠Pion ãããŒã¹ã«ããŠããã
ãšã³ããªãŒ
æšå¹ŽãGoogle ã Stadia ãçºè¡šãããšããç§ã¯è¡æãåããŸããã ãã®ã¢ã€ãã¢ã¯éåžžã«ãŠããŒã¯ãã€é©æ°çã§ãæ¢åã®ãã¯ãããžãŒã§ã©ã®ããã«ããŠãããå¯èœãªã®ããåžžã«çåã«æã£ãŠããŸããã ãã®ãããã¯ãããæ·±ãç解ããããšãã欲æ±ãããç§ã¯ãªãŒãã³ãœãŒã¹ ã¯ã©ãŠã ã²ãŒã ã®ç¬èªããŒãžã§ã³ãäœæããããã«ãªããŸããã çµæã¯ãã ãã çŽ æŽãããã£ãã§ãã 以äžã«ç§ã®XNUMX幎éã®åãçµã¿ã®ããã»ã¹ãå
±æããããšæããŸã
TLDR: ãã€ã©ã€ããå«ãçãã¹ã©ã€ã ããŒãžã§ã³
ã¯ã©ãŠã ã²ãŒã ãæªæ¥ã§ããçç±
ç§ã¯ãã¯ã©ãŠã ã²ãŒãã³ã°ãè¿ããã¡ã«ã²ãŒã ã ãã§ãªããã³ã³ãã¥ãŒã¿ãŒ ãµã€ãšã³ã¹ã®ä»ã®åéã§ã次äžä»£ã«ãªããšä¿¡ããŠããŸãã ã¯ã©ãŠã ã²ãŒã ã¯ã¯ã©ã€ã¢ã³ã/ãµãŒã㌠ã¢ãã«ã®é ç¹ã§ãã ãã®ã¢ãã«ã¯ããªã¢ãŒã ãµãŒããŒäžã§ã²ãŒã ããžãã¯ããã¹ãããç»å/é³å£°ãã¯ã©ã€ã¢ã³ãã«ã¹ããªãŒãã³ã°ããããšã«ãããããã¯ãšã³ã管çãæ倧éã«é«ããããã³ããšã³ãã®äœæ¥ãæå°éã«æããŸãã ãµãŒããŒãéãåŠçãå®è¡ãããããã¯ã©ã€ã¢ã³ãã¯ããŒããŠã§ã¢ã®å¶éã«ç¿»åŒãããããšããªããªããŸãã
Google Stadia ã§ã¯åºæ¬çã«ãã¬ã€ã§ããããã«ãªããŸã
ãã®ãã¯ãããžãŒã®å°æ¥: Microsoft Windows 10 ã Chrome ãã©ãŠã¶ãŒã§å®è¡ããããã©ããªãããæ³åããŠã¿ãŠãã ããã
ã¯ã©ãŠã ã²ãŒã ã¯æè¡çã«é£ãã
ã²ãŒã ã¯ãç¶ç¶çãã€è¿ éãªãŠãŒã¶ãŒå¿çãå¿ èŠãšãããçšãªåéã® 2 ã€ã§ãã ããŒãžãã¯ãªãã¯ãããšãã« 500 ç§ã®é 延ãçºçããå ŽåããããŸãããããã¯èš±å®¹ç¯å²ã§ãã ã©ã€ããããªã¹ããªãŒã ã¯æ°ç§é ããåŸåããããŸãããããã§ãé©åºŠãªäœ¿ãããããæäŸããŸãã ãã ããã²ãŒã ã« XNUMX ããªç§ã®é 延ãé »ç¹ã«çºçããå Žåã¯ãåçŽã«ãã¬ã€ã§ããŸããã ç§ãã¡ã®ç®æšã¯ãå ¥åãšã¡ãã£ã¢ã®éã®ã®ã£ãããã§ããéãå°ããããããã«ã極ããŠäœãã¬ã€ãã³ã·ãŒãéæããããšã§ãã ãããã£ãŠããã㪠ã¹ããªãŒãã³ã°ã«å¯ŸããåŸæ¥ã®ã¢ãããŒãã¯ããã§ã¯é©çšã§ããŸããã
äžè¬çãªã¯ã©ãŠã ã²ãŒã ãã³ãã¬ãŒã
ãªãŒãã³ãœãŒã¹ ãããžã§ã¯ã CloudRetro
ç§ã¯ã¯ã©ãŠã ã²ãŒã ã®ãã¹ã ãµã³ãã«ãäœæããŠãããã»ã©å³ãããããã¯ãŒã¯å¶éäžã§ãã¹ãŠãå¯èœãã©ããã確èªããããšã«ããŸããã æŠå¿µå®èšŒã« Golang ãéžæããã®ã¯ãGolang ãç§ã«ãšã£ãŠæããªãã¿ã®ããèšèªã§ãããåŸã§ããã£ãããšã§ãããä»ã®å€ãã®çç±ãããã®å®è£ ã«é©ããŠããããã§ãã Go ã¯ã·ã³ãã«ã§ãéçºãéåžžã«æ©ãã§ãã Go ã®ãã£ãã«ã¯ãã«ãã¹ã¬ããã®ç®¡çã«æé©ã§ãã
ãããžã§ã¯ã
ãããžã§ã¯ãã®è©³çŽ°ã«ã€ããŠã¯ããã¡ããã芧ãã ããã
CloudRetro ã®æ©èœ
CloudRetro ã¯ãã¬ãã ã²ãŒã ã䜿çšããŠã¯ã©ãŠã ã²ãŒãã³ã°ã®åšåãå®èšŒããŸãã ããã«ãããå€ãã®ãŠããŒã¯ãªã²ãŒã äœéšãåŸãããšãã§ããŸãã
- ã²ãŒã ã®ç§»æ€æ§
- ããŒãžãéãããšãã«å³æåç; ããŠã³ããŒããã€ã³ã¹ããŒã«ã¯å¿ èŠãããŸãã
- ã¢ãã€ã«ãã©ãŠã¶ã§åäœããããããœãããŠã§ã¢ãå®è¡ããå¿ èŠã¯ãããŸãã
- ã²ãŒã ã»ãã·ã§ã³ã¯è€æ°ã®ããã€ã¹éã§å ±æã§ãã次åãã°ã€ã³ãããšãã®ããã«ã¯ã©ãŠãã«ä¿åã§ããŸãã
- ã²ãŒã ã¯ã¹ããªãŒãã³ã°ããããšããè€æ°ã®ãŠãŒã¶ãŒãåæã«ãã¬ã€ããããšãã§ããŸãã
- TwitchPlayPokemon ã®ãããªã¯ã©ãŠããã¬ã€ãããã¯ãã¹ãã©ãããã©ãŒã ã§ãããªã¢ã«ã¿ã€ã ãªã ã
- ãªã³ã©ã€ã³ã®ãªãã©ã€ã³ ã²ãŒã ã å€ãã®ãŠãŒã¶ãŒã¯ãããã¯ãŒã¯ãèšå®ããã«ãã¬ã€ã§ããŸãã ãµã ã©ã€ã¹ããªããã¯CloudRetroãããã¯ãŒã¯çµç±ã§2人ã®ãã¬ã€ã€ãŒã§ãã¬ã€ã§ããããã«ãªããŸãã
ããŸããŸãªããã€ã¹ã§ã®ãªã³ã©ã€ã³ ãã«ããã¬ã€ã€ãŒ ã²ãŒã ã®ã㢠ããŒãžã§ã³ã€ã³ãã©
èŠä»¶ãšãã¯ãããžãŒã¹ã¿ãã¯
以äžã¯ããããžã§ã¯ããéå§ããåã«èšå®ããèŠä»¶ã®ãªã¹ãã§ãã
1. ãã¬ã€ã€ãŒ XNUMX 人
ãã®èŠä»¶ã¯ãããã§ã¯ããã»ã©éèŠã§ãæçœã§ããªãããã«æãããããããŸããããããã¯ç§ã®éèŠãªãã€ã³ãã® XNUMX ã€ã§ãããããã«ããã¯ã©ãŠã ã²ãŒã ãåŸæ¥ã®ã¹ããªãŒãã³ã° ãµãŒãã¹ããå¯èœãªéãé ãããããšãã§ããŸãã ã·ã³ã°ã«ãã¬ã€ã€ãŒ ã²ãŒã ã«çŠç¹ãåœãŠãå Žåã¯ãäžç¹å®å€æ°ã«ã¹ããªãŒãã³ã°ããå¿ èŠããªããããéäžãµãŒããŒã CDN ãåãé€ãããšãã§ããŸãã ã¹ããªãŒã ãã·ã³ã¯ ãµãŒããŒã«ã¢ããããŒããããããã±ãããéäž WebSocket ãµãŒããŒã«æž¡ããããã代ããã«ããµãŒãã¹ ã¹ããªãŒã ã¯ãã¢ããŒã㢠WebRTC æ¥ç¶ãä»ããŠãŠãŒã¶ãŒã«çŽæ¥é ä¿¡ãããŸãã2. äœé 延ã®ã¡ãã£ã¢ ã¹ããªãŒã
Stadia ã«ã€ããŠèªãã§ãããšãããã€ãã®èšäºã§ WebRTC ã«ã€ããŠèšåããŠããã®ãããèŠãããŸãã WebRTC ã¯åªãããã¯ãããžãŒã§ãããã¯ã©ãŠã ã²ãŒã ã§ã®äœ¿çšã«æé©ã§ããããšãããããŸããã WebRTC ã¯ãã·ã³ãã«ãª API ãä»ã㊠Web ãã©ãŠã¶ãŒãšã¢ãã€ã« ã¢ããªã±ãŒã·ã§ã³ã«ãªã¢ã«ã¿ã€ã éä¿¡ãæäŸãããããžã§ã¯ãã§ãã ãã¢ããŒãã¢æ¥ç¶ãæäŸããã¡ãã£ã¢çšã«æé©åãããŠãããVP8 ã H264 ãªã©ã®æšæºã³ãŒããã¯ãçµã¿èŸŒãŸããŠããŸããç§ã¯ãé«å質ã®ã°ã©ãã£ãã¯ã¹ãç¶æããããšããããå¯èœãªéãæé«ã®ãŠãŒã¶ãŒ ãšã¯ã¹ããªãšã³ã¹ã確ä¿ããããšãåªå ããŸããã ã¢ã«ãŽãªãºã ã§ã¯å€å°ã®æ倱ã¯èš±å®¹ãããŸãã Google Stadia ã«ã¯ããµãŒããŒäžã®ç»åãµã€ãºãçž®å°ããè¿œå ã®æé ãããããã¬ãŒã ã¯ãã¢ã«éä¿¡ãããåã«é«å質ã«ã¢ããã¹ã±ãŒã«ãããŸãã
3. å°ççã«ãŒãã£ã³ã°ãåããåæ£ã€ã³ãã©ã¹ãã©ã¯ãã£
å§çž®ã¢ã«ãŽãªãºã ãšã³ãŒããã©ãã»ã©æé©åãããŠããŠããã¬ã€ãã³ã·ã«æã圱é¿ãäžãã決å®èŠå ã¯äŸç¶ãšããŠãããã¯ãŒã¯ã§ãã ã¢ãŒããã¯ãã£ã«ã¯ãã©ãŠã³ãããªããæé (RTT) ãåæžããããã«ããŠãŒã¶ãŒã«æãè¿ããµãŒããŒããã¢ãªã³ã°ããã¡ã«ããºã ãå¿ èŠã§ãã ã¢ãŒããã¯ãã£ã«ã¯ã1 ã€ã®ã³ãŒãã£ããŒã¿ãŒãšãç±³åœè¥¿éšãç±³åœæ±éšããšãŒããããã·ã³ã¬ããŒã«ãäžåœãªã©äžçäžã«åæ£ãããè€æ°ã®ã¹ããªãŒãã³ã° ãµãŒããŒãå¿ èŠã§ãã ãã¹ãŠã®ã¹ããªãŒãã³ã° ãµãŒããŒã¯å®å šã«åé¢ããå¿ èŠããããŸãã ã·ã¹ãã ã¯ããµãŒããŒããããã¯ãŒã¯ã«åå ãŸãã¯ãããã¯ãŒã¯ããé¢è±ãããšãã«ããã®åæ£ã調æŽã§ããŸãã ãããã£ãŠããã©ãã£ãã¯ã倧ããå Žåã¯ããµãŒããŒãè¿œå ããããšã§æ°Žå¹³æ¹åã®ã¹ã±ãŒãªã³ã°ãå¯èœã«ãªããŸãã4. ãã©ãŠã¶ã®äºææ§
ã¯ã©ãŠã ã²ãŒã ã¯ããŠãŒã¶ãŒã®èŠæ±ãæå°éã«æãããšãã«æé«ã®ããã©ãŒãã³ã¹ãçºæ®ããŸãã ã€ãŸãããã©ãŠã¶äžã§å®è¡ã§ãããšããããšã§ãã ãã©ãŠã¶ã¯ããŠãŒã¶ãŒããœãããŠã§ã¢ãããŒããŠã§ã¢ãã€ã³ã¹ããŒã«ããæéãçããã²ãŒã äœéšãã§ããéãå¿«é©ã«ããã®ã«åœ¹ç«ã¡ãŸãã ãã©ãŠã¶ã¯ãã¢ãã€ã« ããŒãžã§ã³ãšãã¹ã¯ããã ããŒãžã§ã³ã®éã§ã¯ãã¹ãã©ãããã©ãŒã æ©èœãæäŸããã®ã«ã圹ç«ã¡ãŸãã 幞ããªããšã«ãWebRTC ã¯ããŸããŸãªãã©ãŠã¶ãŒã§ååã«ãµããŒããããŠããŸãã5. ã²ãŒã ã€ã³ã¿ãŒãã§ã€ã¹ãšãµãŒãã¹ã®æ確ãªåé¢
ç§ã¯ã¯ã©ãŠãã²ãŒã ãµãŒãã¹ããã©ãããã©ãŒã ãšããŠæããŠããŸãã 誰ãããããããã®ããã©ãããã©ãŒã ã«æ¥ç¶ã§ããå¿ èŠããããŸãã ä»ãç§ã¯çµ±åããŸããLibRetro LibRetro 㯠SNESãGBAãPS ãªã©ã®ã¬ãã ã²ãŒã çšã®çŸããã²ãŒã ãšãã¥ã¬ãŒã¿ ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŠãããããã¯ã©ãŠã ã²ãŒã ãµãŒãã¹ãå©çšã§ããŸãã6. ãã«ããã¬ã€ã€ãŒãã¯ã©ãŠããã¬ã€ãã²ãŒã ãšã®å€éšãªã³ã¯ïŒãã£ãŒããªã³ã¯ïŒçšã®éšå±
CloudRetro ã¯ãã¬ãã ã²ãŒã ã® CrowdPlay ãââãªã³ã©ã€ã³ ãã«ããã¬ã€ã€ãŒãªã©ãå€ãã®æ°ããã²ãŒã ãã¬ã€ããµããŒãããŠããŸãã è€æ°ã®ãŠãŒã¶ãŒãç°ãªãã³ã³ãã¥ãŒã¿ãŒã§åããã£ãŒããªã³ã¯ãéããå Žåãåãã²ãŒã ãå®è¡ãããŠããã®ã衚瀺ãããã²ãŒã ã«åå ããããšãã§ããŸããããã«ãã²ãŒã ã®ç¶æ ã¯ã¯ã©ãŠã ã¹ãã¬ãŒãžã«ä¿åãããŸãã ããã«ããããŠãŒã¶ãŒã¯ãã€ã§ãä»ã®ããã€ã¹ã§ãã¬ã€ãç¶ããããšãã§ããŸãã
7. æ°Žå¹³æ¹åã®ã¹ã±ãŒãªã³ã°
æè¿ã®ä»ã® SAAS ãšåæ§ã«ãã¯ã©ãŠã ã²ãŒã ãæ°Žå¹³æ¹åã«ã¹ã±ãŒã©ãã«ã«ãªãããã«èšèšããå¿ èŠããããŸãã ã³ãŒãã£ããŒã¿ãŒãšã¯ãŒã«ãŒã®èšèšã«ãããããå€ãã®ãã©ãã£ãã¯ãåŠçããããã«ã¯ãŒã«ãŒãè¿œå ã§ããŸãã8. XNUMX ã€ã®ã¯ã©ãŠãã«æ¥ç¶ã§ããªã
CloudRetro ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã¯ãããŸããŸãªå°åã®ããŸããŸãªã¯ã©ãŠã ãããã€ã㌠(Digital OceanãAlibabaãã«ã¹ã¿ã ãããã€ããŒ) ã§ãã¹ããããŠããŸãã ã€ã³ãã©ã¹ãã©ã¯ãã£ã® Docker ã³ã³ããã§ã®å®è¡ãæå¹ã«ããåäžã®ã¯ã©ãŠã ãããã€ããŒã«ããã¯ãããªãããã« bash ã¹ã¯ãªããã䜿çšããŠãããã¯ãŒã¯èšå®ãæ§æããŸãã ããã WebRTC ã® NAT ãã©ããŒãµã«ãšçµã¿åãããããšã§ãCloudRetro ãããããã¯ã©ãŠã ãã©ãããã©ãŒã ãããã«ã¯ãããããŠãŒã¶ãŒã®ãã·ã³ã«æè»ã«ãããã€ã§ããããã«ãªããŸãã建ç¯ãã¶ã€ã³
ã¯ãŒã«ãŒïŒ (ãŸãã¯åè¿°ã®ã¹ããªãŒãã³ã° ãµãŒããŒ) ã¯ãã²ãŒã ãå¢ããããšã³ã³ãŒã ãã€ãã©ã€ã³ãå®è¡ãããšã³ã³ãŒããããã¡ãã£ã¢ããŠãŒã¶ãŒã«ã¹ããªãŒãã³ã°ããŸãã ã¯ãŒã«ãŒ ã€ã³ã¹ã¿ã³ã¹ã¯äžçäžã«åæ£ãããŠãããåã¯ãŒã«ãŒã¯è€æ°ã®ãŠãŒã¶ãŒ ã»ãã·ã§ã³ãåæã«åŠçã§ããŸãã
ã³ãŒãã£ããŒã¿ãŒïŒ æ°ãããŠãŒã¶ãŒãã¹ããªãŒãã³ã°ã«æé©ãªã¯ãŒã«ãŒãšãã¢ãªã³ã°ãã責任ããããŸãã ã³ãŒãã£ããŒã¿ãŒã¯ãWebSocket ãä»ããŠã¯ãŒã«ãŒãšå¯Ÿè©±ããŸãã
ã²ãŒã ç¶æ ã®ã¹ãã¬ãŒãž: ãã¹ãŠã®ã²ãŒã ç¶æ ãéäžãªã¢ãŒãã¹ãã¬ãŒãžã§ç®¡çããŸãã ãã®ã¹ãã¬ãŒãžã¯ããªã¢ãŒã ã»ãŒã/ããŒããªã©ã®éèŠãªæ©èœãæäŸããŸãã
CloudRetro ã®ãããã¬ãã«ã®ã¢ãŒããã¯ãã£ã«ã¹ã¿ã ã¹ã¯ãªãã
以äžã®å³ã«ç€ºãæé 1 ãš 2 ã§æ°ãããŠãŒã¶ãŒã CloudRetro ãéããšãã³ãŒãã£ããŒã¿ãŒãšå©çšå¯èœãªã¯ãŒã«ãŒã®ãªã¹ããæåã®ããŒãžã«èŠæ±ãããŸãã ãã®åŸãã¹ããã 3 ã§ãã¯ã©ã€ã¢ã³ã㯠HTTP ping ãªã¯ãšã¹ãã䜿çšããŠãã¹ãŠã®åè£ã®é 延ãèšç®ããŸãã ãã®é 延ã®ãªã¹ãã¯ã³ãŒãã£ããŒã¿ãŒã«éãè¿ãããã³ãŒãã£ããŒã¿ãŒã¯ãŠãŒã¶ãŒã«ãµãŒãã¹ãæäŸããã®ã«æé©ãªã¯ãŒã«ãŒã決å®ã§ããŸãã 以äžã®ã¹ããã 4 ã§ã²ãŒã ãäœæããŸãã WebRTC ã¹ããªãŒãã³ã°æ¥ç¶ã¯ããŠãŒã¶ãŒãšå²ãåœãŠãããã¯ãŒã«ãŒã®éã«ç¢ºç«ãããŸãã
ã¢ã¯ã»ã¹æš©ååŸåŸã®ãŠãŒã¶ãŒã¹ã¯ãªããåŽåè ã®äžã«ã¯äœãããã®ã
ã²ãŒã ãšã¹ããªãŒãã³ã° ãã€ãã©ã€ã³ã¯ã¯ãŒã«ãŒå ã«åé¢ããŠä¿åãããã€ã³ã¿ãŒãã§ã€ã¹ãéããŠããã§æ å ±ã亀æããŸãã çŸåšããã®éä¿¡ã¯ã¡ã¢ãªäžã®ããŒã¿ã転éããããšã«ãã£ãŠå®è¡ãããŸãã
Golang ãã£ã³ãã« åãããã»ã¹ã§ã 次ã®ç®æšã¯åé¢ã§ãã å¥ã®ããã»ã¹ã§ã²ãŒã ãç¬ç«ããŠèµ·åããŸãã
ã¯ãŒã«ãŒã³ã³ããŒãã³ãã®çžäºäœçšã¡ã€ã³ã³ã³ããŒãã³ãïŒ
- WebRTCïŒ ãŠãŒã¶ãŒå ¥åãåãå ¥ãããšã³ã³ãŒããããã¡ãã£ã¢ããµãŒããŒããåºåããã¯ã©ã€ã¢ã³ã ã³ã³ããŒãã³ãã
- ã²ãŒã ãšãã¥ã¬ãŒã¿: ã²ãŒã ã³ã³ããŒãã³ãã Libretro ã©ã€ãã©ãªã®ãããã§ãã·ã¹ãã ã¯åãããã»ã¹å ã§ã²ãŒã ãå®è¡ããã¡ãã£ã¢ãšå ¥åã¹ããªãŒã ãå éšçã«ã€ã³ã¿ãŒã»ããã§ããŸãã
- ã²ãŒã å ãã¬ãŒã ããã£ããã£ãããŠãšã³ã³ãŒããŒã«éä¿¡ãããŸãã
- ç»å/é³å£°ãšã³ã³ãŒã: ã¡ãã£ã¢ ãã¬ãŒã ãååŸããããã¯ã°ã©ãŠã³ãã§ãšã³ã³ãŒããããšã³ã³ãŒããããç»å/é³å£°ãåºåãããšã³ã³ãŒã ãã€ãã©ã€ã³ã
å ·çŸå
CloudRetro ã¯ããã¯ããŒã³ ãã¯ãããžãŒãšã㊠WebRTC ã«äŸåããŠãããããGolang å®è£ ã®è©³çŽ°ã«å ¥ãåã«ãWebRTC èªäœã«ã€ããŠè©±ãããšã«ããŸããã ããã¯é©ãã¹ããã¯ãããžãŒã§ãã¹ããªãŒãã³ã° ããŒã¿ã®ã¬ã€ãã³ã·ãŒã XNUMX ç§æªæºã«ããã®ã«å€§ãã«åœ¹ç«ã¡ãŸããã
WebRTC
WebRTC ã¯ãã·ã³ãã«ãª API ã䜿çšããŠãã€ãã£ã ã¢ãã€ã« ã¢ããªãšãã©ãŠã¶ãŒã§é«å質ã®ãã¢ããŒãã¢æ¥ç¶ãæäŸããããã«èšèšãããŠããŸãã
NATãã©ããŒãµã«
WebRTC ã¯ãNAT ãã©ããŒãµã«æ©èœã§ç¥ãããŠããŸãã WebRTC ã¯ãã¢ããŒãã¢éä¿¡çšã«èšèšãããŠããŸãã ãã®ç®æšã¯ãNAT ã²ãŒããŠã§ã€ãšãã¡ã€ã¢ãŠã©ãŒã«ãåé¿ããŠããšåŒã°ããããã»ã¹ãä»ããŠãã¢ããŒãã¢éä¿¡ãè¡ããæãé©åãªçŽæ¥ã«ãŒããèŠã€ããããšã§ãã
ICE ã ãã®ããã»ã¹ã®äžç°ãšããŠãWebRTC API 㯠STUN ãµãŒããŒã䜿çšããŠãããªã㯠IP ã¢ãã¬ã¹ãæ€çŽ¢ããããããªã¬ãŒ ãµãŒããŒã«è»¢éããŸã (é çª ) ãã€ã¬ã¯ãæ¥ç¶ã確ç«ã§ããªãå Žåããã ããCloudRetro ã¯ãã®æ©èœãååã«æŽ»çšããŠããŸããã ãã®ãã¢ããŒãã¢æ¥ç¶ã¯ãŠãŒã¶ãŒéã§ã¯ãªãããŠãŒã¶ãŒãšã¯ã©ãŠã ãµãŒããŒã®éã«ååšããŸãã ãã®ã¢ãã«ã®ãµãŒããŒåŽã§ã¯ãäžè¬çãªãŠãŒã¶ãŒ ããã€ã¹ã«æ¯ã¹ãŠçŽæ¥çãªéä¿¡å¶éãå°ãªããªããŸãã ããã«ããããµãŒããŒã NAT ã®èåŸã«ãªããããåä¿¡ããŒããäºåã«éãããããããªã㯠IP ã¢ãã¬ã¹ãçŽæ¥äœ¿çšãããã§ããŸãã
以åãç§ã¯ãã®ãããžã§ã¯ããã¯ã©ãŠã ã²ãŒãã³ã°ã®ã²ãŒã é ä¿¡ãã©ãããã©ãŒã ã«ããããšèããŠããŸããã ãã®ã¢ã€ãã¢ã¯ãã²ãŒã ã¯ãªãšãŒã¿ãŒãã²ãŒã ãšã¹ããªãŒãã³ã° ãªãœãŒã¹ãæäŸã§ããããã«ããããšã§ããã ãããŠãŠãŒã¶ãŒã¯ãããã€ããŒãšçŽæ¥å¯Ÿè©±ããããšã«ãªããŸãã ãã®åæ£åã®æ¹æ³ã§ã¯ãCloudRetro ã¯ãµãŒãããŒãã£ã®ã¹ããªãŒãã³ã° ãªãœãŒã¹ããŠãŒã¶ãŒã«æ¥ç¶ããããã®ãã¬ãŒã ã¯ãŒã¯ã«ãããããã¹ããããªããªã£ããšãã®æ¡åŒµæ§ãåäžããŸãã ããã§ã® WebRTC NAT ãã©ããŒãµã«ã®åœ¹å²ã¯ããµãŒãããŒãã£ã®ã¹ããªãŒãã³ã° ãªãœãŒã¹ã§ã®ãã¢ããŒãã¢æ¥ç¶ã®åæåãä¿é²ããäœæè ããããã¯ãŒã¯ã«ç°¡åã«æ¥ç¶ã§ããããã«ããããã«éåžžã«éèŠã§ãã
ãããªå§çž®
ãããªå§çž®ã¯ãã€ãã©ã€ã³ã«äžå¯æ¬ ãªéšåã§ãããã¹ã ãŒãºãªãããŒã«å€§ããè²¢ç®ããŸãã VP8/H264 ãã㪠ãšã³ã³ãŒãã£ã³ã°ã®è©³çŽ°ããã¹ãŠç¥ãå¿ èŠã¯ãããŸããããæŠå¿µãç解ãããšãã¹ããªãŒãã³ã° ãããªé床ãªãã·ã§ã³ãç解ããäºæããªãåäœããããã°ããé 延ã調æŽããã®ã«åœ¹ç«ã¡ãŸãã
ã¹ããªãŒãã³ã° ãµãŒãã¹çšã«ãããªãå§çž®ããããšã¯ãã¢ã«ãŽãªãºã ã«ãã£ãŠãåèšã®ãšã³ã³ãŒãæé + ãããã¯ãŒã¯éä¿¡æé + ãã³ãŒãæéãå¯èœãªéãçããªãããšãä¿èšŒããå¿ èŠããããããå°é£ã§ãã ããã«ãã³ãŒãã£ã³ã°ããã»ã¹ã¯äžè²«æ§ããããç¶ç¶çã§ããå¿ èŠããããŸãã äžéšã®ãšã³ã³ãŒãã®ãã¬ãŒããªãã¯é©çšãããŸãããããšãã°ããã¡ã€ã« ãµã€ãºããã³ãŒãæéãããé·ããšã³ã³ãŒãæéãåªå ããããäžè²«æ§ã®ãªãå§çž®ã䜿çšãããããããšã¯ã§ããŸããã
ãããªå§çž®ã®èåŸã«ããèãæ¹ã¯ããŠãŒã¶ãŒã蚱容ã§ããã¬ãã«ã®ç²ŸåºŠãç¶æããªãããäžèŠãªæ å ±ãåé€ããããšã§ãã åã ã®éæ¢ç»åãã¬ãŒã ããšã³ã³ãŒãããããšã«å ããŠãã¢ã«ãŽãªãºã ã¯ååŸã®ãã¬ãŒã ããçŸåšã®ãã¬ãŒã ãæšæž¬ããããããããã®å·®åã®ã¿ãéä¿¡ãããŸãã ããã¯ãã³ã®äŸãããããããã«ãå·®åãã€ã³ãã®ã¿ãéä¿¡ãããŸãã
ããã¯ãã³ãäŸã«ãããããªãã¬ãŒã ã®æ¯èŒé³å£°å§çž®
åæ§ã«ãé³å£°å§çž®ã¢ã«ãŽãªãºã ã§ã¯ã人éãèªèã§ããªãããŒã¿ã¯çç¥ãããŸãã Opus ã¯çŸåšæãããã©ãŒãã³ã¹ã®é«ããªãŒãã£ãª ã³ãŒããã¯ã§ãã ããã¯ãRTP (Real Time Transport Protocol) ãªã©ã®é åºä»ããããããŒã¿ã°ã©ã ãããã³ã«ãä»ããŠé³å£°æ³¢ãéä¿¡ããããã«èšèšãããŠããŸãã mp3ãaacãããé 延ãå°ãªããé«å質ã§ãã ã¬ã€ãã³ã·ã¯éåžž 5 ïœ 66,5 ããªç§çšåºŠã§ãã
PionãGolang ã® WebRTC
ãã€äžéå ã¯ãWebRTC ã Golang ã«æäŸãããªãŒãã³ãœãŒã¹ ãããžã§ã¯ãã§ãã Pion ã¯ããã€ãã£ã C++ WebRTC ã©ã€ãã©ãªã®éåžžã®ã©ããã³ã°ã®ä»£ããã«ãããåªããããã©ãŒãã³ã¹ãGo çµ±åãããã³ WebRTC ãããã³ã«ã§ã®ããŒãžã§ã³ç®¡çãåãã WebRTC ã®ãã€ãã£ã Golang å®è£ ã§ãããã®ã©ã€ãã©ãªã§ã¯ãå€ãã®åªããçµã¿èŸŒã¿æ©èœã䜿çšã㊠XNUMX ç§æªæºã®é 延ã§ã¹ããªãŒãã³ã°ããããšãã§ããŸãã STUNãDTLSãSCTPãªã©ã®ç¬èªã®å®è£ ããããŸãã QUIC ãš WebAssembly ã䜿ã£ãå®éšãããã€ããããŸãã ãã®ãªãŒãã³ ãœãŒã¹ ã©ã€ãã©ãªèªäœã¯ãåªããããã¥ã¡ã³ãããããã¯ãŒã¯ ãããã³ã«ã®å®è£ ãã¯ãŒã«ãªäŸãåããéåžžã«åªããåŠç¿ãªãœãŒã¹ã§ãã
éåžžã«æ ç±çãªã¯ãªãšã€ã¿ãŒãçãã Pion ã³ãã¥ããã£ã¯éåžžã«æŽ»çºã§ãWebRTC ã«ã€ããŠå€ãã®è³ªã®é«ãè°è«ãè¡ãããŠããŸãã ãã®æè¡ã«èå³ãããæ¹ã¯ãã²ãåå ãã ãã
http://pion.ly/slack â ããããã®æ°ããããšãåŠã¶ã§ããããGolang 㧠CloudRetro ãæžã
Go ã§ã®ã¯ãŒã«ãŒã®å®è£å®éã® Gââo ãã£ãã«
Go ã®çŸãããã£ãã«èšèšã®ãããã§ãã€ãã³ã ã¹ããªãŒãã³ã°ãšåæå®è¡ã®åé¡ãå€§å¹ ã«ç°¡çŽ åãããŠããŸãã å³ã«ããããã«ãç°ãªã GoRoutine ã«ã¯è€æ°ã®ã³ã³ããŒãã³ãã䞊è¡ããŠå®è¡ãããŸãã åã³ã³ããŒãã³ãã¯ãã®ç¶æ ã管çãããã£ãã«ãéããŠéä¿¡ããŸãã Golang ã®éžæçã¢ãµãŒã·ã§ã³ã«ãããã²ãŒã å ã§æ¯å XNUMX ã€ã®ã¢ããã㯠ã€ãã³ãã匷å¶çã«åŠçãããŸã (ã²ãŒã ãã£ãã¯)ã ããã¯ããã®èšèšã§ã¯ããã¯ãå¿ èŠãªãããšãæå³ããŸãã ããšãã°ããŠãŒã¶ãŒãä¿åãããšãã¯ãã²ãŒã ç¶æ ã®å®å šãªã¹ãããã·ã§ãããå¿ èŠã§ãã ãã®ç¶æ ã¯ãä¿åãå®äºãããŸã§ãã°ã€ã³ç¶æ ã®ãŸãŸç¶ç¶ããå¿ èŠããããŸãã åã²ãŒã ãã£ãã¯äžãããã¯ãšã³ãã¯ä¿åæäœãŸãã¯å ¥åæäœã®ã¿ãåŠçã§ãããããããã»ã¹ãã¹ã¬ãã ã»ãŒãã«ãªããŸãã
func (e *gameEmulator) gameUpdate() { for { select { case <-e.saveOperation: e.saveGameState() case key := <-e.input: e.updateGameState(key) case <-e.done: e.close() return } } }
ãã¡ã³ã€ã³/ãã¡ã³ã¢ãŠã
ãã® Golang ãã³ãã¬ãŒãã¯ãç§ã® CrowdPlay ãšãã«ããã¬ã€ã€ãŒã®ãŠãŒã¹ã±ãŒã¹ã«å®å šã«é©åããŸãã ãã®ãã¿ãŒã³ã«åŸã£ãŠãXNUMX ã€ã®éšå±å ã®ãã¹ãŠã®ãŠãŒã¶ãŒå ¥åã¯äžå€®ã®å ¥å£ãã£ãã«ã«çµã¿èŸŒãŸããŸãã ãã®åŸãã²ãŒã ã¡ãã£ã¢ãåãéšå±å ã®ãã¹ãŠã®ãŠãŒã¶ãŒã«å±éãããŸãã ãã®ããã«ããŠãç°ãªããŠãŒã¶ãŒã®è€æ°ã®ã²ãŒã ã»ãã·ã§ã³éã§ã²ãŒã ç¶æ ãåå²ããããšãã§ããŸãã
ç°ãªãã»ãã·ã§ã³éã®åæGolangã®æ¬ ç¹
Golang ã¯å®ç§ã§ã¯ãããŸããã ãã£ã³ãã«ãé ãã§ãã ããããã³ã°ãšæ¯èŒãããšãGo ãã£ãã«ã¯åæã€ãââã³ããã¹ã¬ããåãããã€ãã³ããåŠçããç°¡åãªæ¹æ³ã§ããã ãã§ããããã£ãã«ã¯æé«ã®ããã©ãŒãã³ã¹ãæäŸããŸããã ãã£ãã«ã®äžã«ã¯è€éãªããããã³ã° ããžãã¯ããããŸãã ããã§ãããã©ãŒãã³ã¹ãæé©åããããã«ãã£ãã«ã眮ãæãããšãã«ããã¯ãšã¢ãããã¯å€ãåé©çšããŠãå®è£ ã«ããã€ãã®èª¿æŽãå ããŸããã
ããã«ãGolang ã®ã¬ããŒãž ã³ã¬ã¯ã¿ãŒã¯ç®¡çãããŠããªããããçãããã»ã©é·ãäžæåæ¢ãçºçããããšããããŸãã ããã¯ããªã¢ã«ã¿ã€ã ã¹ããªãŒãã³ã° ã¢ããªã±ãŒã·ã§ã³ã«å€§ããªå¹²æžãäžããŸãã
Cgo
ãã®ãããžã§ã¯ãã§ã¯ãã¡ãã£ã¢å§çž®ã«ã¯æ¢åã®ãªãŒãã³ ãœãŒã¹ Golang VP8/H264 ã©ã€ãã©ãªããã²ãŒã ãšãã¥ã¬ãŒã¿ã«ã¯ Libretro ã䜿çšããŸãã ãããã®ã©ã€ãã©ãªã¯ãã¹ãŠãGo ã® C ã©ã€ãã©ãªã®åãªãã©ãããŒã§ãã
Cgo ã ãã¡ãªããã®äžéšã以äžã«æããŸããã€ãã»ãã§ã€ããŒã«ãããã®æçš¿ ã ééããåé¡:- Golang RecoveryCrash ã䜿çšããŠã CGO ã§ã¯ã©ãã·ã¥ãææã§ããªãã
- CGO ã§è©³çŽ°ãªåé¡ãæ€åºã§ããªãå Žåãããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ã§ããŸããã
ãŸãšã
ã¯ã©ãŠã ã²ãŒã ãµãŒãã¹ãç解ãããªã³ã©ã€ã³ã§åéãšæãããã¬ãã ã²ãŒã ããã¬ã€ã§ãããã©ãããã©ãŒã ãäœæãããšããç®æšãéæããŸããã ãã®ãããžã§ã¯ãã¯ãPion å³æžé€šãš Pion ã³ãã¥ããã£ã®æ¯æŽããªããã°äžå¯èœã§ããã éäžçãªéçºã«éåžžã«æè¬ããŠããŸãã WebRTC ãš Pion ãæäŸããã·ã³ãã«ãª API ã«ãããã·ãŒã ã¬ã¹ãªçµ±åãä¿èšŒãããŸããã ãã¢ããŒã㢠(P2P) éä¿¡ã«é¢ããäºåç¥èããŸã£ãããªãã£ãã«ãããããããç§ã®æåã®æŠå¿µå®èšŒã¯åãé±ã«ãªãªãŒã¹ãããŸããã
çµ±åã®å®¹æãã«ãããããããP2P ã¹ããªãŒãã³ã°ã¯å®éãã³ã³ãã¥ãŒã¿ãŒ ãµã€ãšã³ã¹ã«ãããŠéåžžã«è€éãªé åã§ãã 圌女ã¯ããã¢ããŒã㢠ã»ãã·ã§ã³ãäœæããããã«ãIP ã NAT ãªã©ã®é·å¹Žã«ããããããã¯ãŒã¯ ã¢ãŒããã¯ãã£ã®è€éãã«å¯ŸåŠããå¿ èŠããããŸãã ãã®ãããžã§ã¯ãã«åãçµãã§ããéãç§ã¯ãããã¯ãŒãã³ã°ãšããã©ãŒãã³ã¹ã®æé©åã«é¢ããå€ãã®è²Žéãªç¥èãåŸãããšãã§ããã®ã§ãçããã WebRTC ã䜿çšã㊠P2P 補åãæ§ç¯ããŠã¿ãããšããå§ãããŸãã
CloudRetro ã¯ãã¬ããã²ãŒããŒãšããŠã®ç§ã®èŠ³ç¹ããäºæ³ãããã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ã«å¯Ÿå¿ããŸãã ãã ãããããã¯ãŒã¯ã®ä¿¡é Œæ§ãšããã©ãŒãã³ã¹ãåäžãããããããé«å質ã®ã²ãŒã ã°ã©ãã£ãã¯ã¹ãæäŸãããããŠãŒã¶ãŒéã§ã²ãŒã ãå ±æãããããæ©èœãªã©ããããžã§ã¯ãã«ã¯æ¹åã§ããç¹ããããããããšæããŸãã ç§ã¯ããã«äžçæžåœåãçµãã§ããŸãã åŸã£ãŠãã ãã
ãããžã§ã¯ã ãããŠæ°ã«å ¥ã£ãããµããŒãããŠãã ããã
åºæïŒ habr.com