αααααα·ααΈααΆααααΆαααα α αααααΆαα
ααΆααααααααααΆααααΆαααα αααα·ααΆααΆααααΆαααα αααα·ααΆααααΆααααααααΆααααΆαααα ααααα·ααΈαααΈααα’αΌααΆααααΆαααα α
α»ααααΆαααΆα
ααααα ααααααΎαααααΆααααΆαααααα½α? ααΆαβααΆαβααααΆααΆαβααΆβα
αααΎαβααβαα½α
βααβα αΎαβαααα»αβααΆαβαααααΎαβααΆαβαααβα ααααβααΎβααα (Cloud Gaming) ααΌα
βααΆ Stadia αααβααΎαβααβααΆαβααΆααβα±ααβααααΎβααα Google α ααααΆααΈαααΆ
Thanh Nguyen ααΆααααααα
α
α·αααααΆαααααα±ααΆααααααΎαααααααααααααΎαα
αα ααααααΆαα CloudRetro α CloudRetro ααΊααα’ααααΎ Pion,
ααΆαα»
ααΆαααΈααααΆααα»α αα
αααααα Google ααΆααααααΆαα’αααΈ Stadia ααΆααΆαααααΎα±αααααα»αααΆαα’αΆααααααααααΎαα αααα·ααααααΊααααα αα·αα
αααααααα·αααααΆαα ααααααα»ααααααααΏααααααααΆ ααΎααΆα’αΆα
αα
αα½α
αααααααααΆααΆαα½ααα
αα
αααα·ααααΆαααααΆαααααΆααα ααααααααΆααααΆααΎααααΈαααααΆααααα
αααΆααα’αααΈαααααΆααααααααΆααααα»αα±αααααα»ααααααΎαααααααααΆαααααα½ααααααααα»αααα ααααααααααααααΎαα
αα α ααααααααΊα’ααα
αΆαααααΆααα ααΆαβαααααβαααβαααα»αβα
ααβα
ααβαααααβααααΎαβααΆαβααβααΆαβααααΎβααΆαβαααα»αβααααΆαβααααβαααα»α
TLDRα ααααααααΆαααααΈααΆαα½αααΉααααα½αααα
α ααα»α’αααΈααΆαααΆααΆααααα ααααααΎαααααΊααΆα’ααΆαα
αααα»αααΏααΆ Cloud Gaming ααΉαααααΆααα ααΆααααΆαααααααααααΆααααα αααααα·αααααΉαααααα»ααααααα ααα»ααααααααΆαααααααααααααααααα·ααααΆααΆααααααα»αααααΌααααααααα ααΆααααα ααααααΎαααααΊααΆα ααα»α ααααΌαααααααΌαααΆαααΈαααααα/αααΆαααΈαααα ααααΌααααααααΎαααΆαααααααααααααααααΆαααααα αα·αααΆαααααααααΆαααΆααααααααΆααα»αααααααα αααααααα·ααααΆα αααααα ααΎαααΆαααΈαααααΈα ααααΆα αα·αααΆαααααΆαααΌαααΆα/ααα‘αααα ααΆααα’αα·αα·ααα αααΆαααΈαααααααΎαααΆααααΆαααααααααα ααΌα αααααααΆαααΈαααααααααααΆαααααΈααααααΆα ααααααΆαααααααααααααΉααααα αΎαα
Google Stadia αα·αααΆα’αα»ααααΆαα±ααα’αααααα
α’ααΆαααααα
αα
αααα·ααααΆαααα αααααααΎαααΆααΎ Microsoft Windows 10 ααααΎαααΆαααΎαααααα·ααΈαα»αααααΆαα’ααΈαααΊαα·α Chrome αααα¬αα?
ααΆααααα ααααααΎαααααΆαααΆαααααα½αααααααααααααα αα ααααα
ααΆααααα ααααααΊααΆααααααααααααα½α ααααααααΌαα±ααα’αααααααΎααααΆααααααΎααααα αα αα·ααααα ααααα·αααΎααααααααΆαααΎααα½ααααααααΆααααααΆααα 2 αα·ααΆααΈαα αααα α»α ααΎααααα αααα’αΆα ααα½αααααΆαα ααΆαβααααΆαβααααβααααΆααβααΈααα’αΌβααΆαβαααααβααΊαβαααβααα»ααααΆαβαα·ααΆααΈ ααα»ααααβαα βααβαααααβα±ααβααΌαβααααααΆαβααααΎβααααΆααβααβα ααα»βααα ααααααΆαααΆααααα ααααα·αααΎα αααααααααΊαααΆα 500ms αααααΆαα·αα’αΆα αααααΆαααα ααααα ααααααΎαααΊααΎααααΈαααααα ααΆαααΌαααΆαααΊααααΆαααΆααααα»α ααΎααααΈα±αααααααΆααααΆαααΆααααα αΌα αα·αααααααααααααααααααΆαααΆαααα αααΌα ααΆααααα’αΆα ααααΎαα ααΆαα ααΌα αααα αα·ααΈααΆαααααααααααααααΈα ααααααΆαααααΆαααΈααα’αΌαα·αααααΌαααΆαα’αα»αααααα ααΈαααααα
ααααΌα αααααααααΌαα
αααααααααααααΎαα αα CloudRetro
αααα»αααΆααααααα α α·ααααααααΎαααααΌααΆαααααααα ααααααΎααα ααΎααααΈααΎαααΆααΎα’αααΈαααΆααα’αααααα’αΆα αα αα½α αααα¬αα ααΆαα½αααΉαααΆαααΉααααααΉααααααΆαααααΉααααΉαααααααα αααα»αααΆαααααΎαααΎα Golang αααααΆαααααααα»ααΆαααααααααα·α αααααααΆααΆααΆααΆααααααα»αααααΆααααααΆααααΆααα α αΎααααααα·αααααααΆααααΆαα’αα»ααααααα αααααΆαα ααα»ααααΆα αααΎαααα ααΌα ααααααα»αααΆαααααΎααα ααααααααα αα ααΊααΆααααα αΎαα’αα·αααααααΆαααΏα; Channels in Go ααΊααα’αααααΆααααΆαααααααααα multithreadingα
αααααα
α’αααα’αΆα
ααααααααααααααα’αααΈαααααααα
ααΈαααα
αα»αααΆα CloudRetro
CloudRetro ααααΎααααΆααα αααααααα’ααΈαααΆα ααΎααααΈαααα αΆαααΈααΆαααααααΆααααα ααααααΎαααα αααα’αα»ααααΆαα±ααα’αααααα½αααΆααααα·ααααααααα ααααααααααααΆα αααΎαα
- ααΆαα
αααααα αααα
- ααΆαα αΆααααΆαααααΈααααΆαααα αααααΎαααααα; αα·αα αΆαααΆα αααΆααα α¬ααα‘αΎαααα
- ααααΎαααΆααα αααα»ααααααα·ααΈαα»αααααΆαααΌαααααα ααΌα αααααα·αα αΆαααΆα αααααΎαααααα·ααΈααΎααααΈααααΎαααΆαααΆααα
- ααααα ααααα’αΆα ααααΌαααΆαα ααααααααα ααΎα§αααααααΆα αααΎα α αΎααααααΆαα»ααααα»αααααααααΆαααααααααααααα’αααα αΌα
- α αααααααα’αΆα
ααααΌαααΆαα
αΆαα α¬ααΆα’αΆα
ααααααα’αααααααΎααααΆααααΆα
αααΎααααα»αααααααα½αα
- Crowdplay ααΌα ααΆ TwitchPlayPokemon ααΆααααααα·ααΆααααααααΆ αα·ααααααααΆαα·αα αααΎαααα
- α αααααααα αααααΆαααΆαα’ααΈαααΊαα·αα α’αααααααΎααααΆααααΆα αααΎαα’αΆα αααααααα·αα αΆαααΆα αααα‘αΎααααααΆαα Samurai Shodown α₯α‘αΌααααα’αΆα ααααΌαααΆαααααααα’αααααα 2 ααΆαααα ααΎαααααΆα CloudRetro
ααααααΆαααααααα ααααα’ααααααα αααΎαααΎα’ααΈαααΊαα·ααα ααΎα§αααααααααααα αααααΆαα ααΆαααααααα
αααααΌαααΆααα·ααα αα αααα·ααααΆααα
ααΆαααααααααααΊααΆαααααΈαααααααΌαααΆαααααααα»αααΆαααααααα»ααααα αΆααααααΎαααααααα
1. α’ααααααααααΆαα
αααααΌαααΆαααααααα ααααΆαα·αααααΆααααα α¬α αααΆαααα ααΈααααα ααα»ααααααΆααΊααΆααΆαααααααααααΆαααααααααα»α ααΆα’αα»ααααΆαα±ααα ααααααΎααααα ααααΆαααΈααααΆααααααααααΈαααααααααααΈααΆααααα’αΆα ααααΎαα ααΆαα ααααα·αααΎααΎααααααααΎα αααααααααΆαα’ααααααααααααΆαα ααΎαα’αΆα αααα αΆαααααΆαααΈααα α¬ CDN α ααααΈαααααΆα αααααααΎααα·αα αΆαααΆα αα αΆααααααΆααα ααΆαααα αΆαααααααα αααα½αα±ααααΆαα’αΆααα‘αΌαααααααΈααα ααΆαααααΆαααΈααααα·α α¬αααααΌααααα ααααααααΆααα αααΆαααΈααα WebSocket αααααΆα ααααααΈαααααΆααααααααΌαααΆααααααΌααααααααΆαααα α’αααααααΎααααΆααααΆααααααΆααααααΆαα WebRTC ααΈααααΆαα αα·ααα ααα2. ααααααΈααααααααααΆαααΆαααΊααααΆαααΆα
ααΆαα’αΆαα’αααΈ Stadia αααα»ααααααααΎα WebRTC αααααΆαααΎαα‘αΎααα αααα»αα’ααααααα½αα ααα½αα αααα»αααΆαααΉαααΆ WebRTC ααΊααΆαα αα αααα·ααααΆααααα’α₯αααα αα αα·αααα’α₯αααα αααααααΆααααααΎααααΆαααααα»αααΆααααα ααααααΎαααα WebRTC ααΊααΆαααααααααααααααααααα·ααΈαα»αααααΆαα’ααΈαααΊαα·α αα·ααααααα·ααΈααΌααααααααΆαα½αααΉαααΆαααααΆααααααααΆααααααααΆααΆαααααααααΆαααα API ααααΆαααααα½αα ααΆαααααααΌαααΆαααααΆααααΈαα·ααααααααα·αα αα·ααααααααα· ααααΌαααΆαααααΎα±αααααααΎααααααΆααααααααααααααααααααΆα αα·αααΆαααΌαα·ααααααααΆααααααααΆααααααΆαα½αααΌα ααΆ VP8 αα·α H264 ααααα»αααΆααααααα’αΆαα·ααΆααααα»αααΆαααΆααΆααΌααααα·αααααα’αααααααΎααααΆααααα’αααα»ααααα’αΆα ααααΎαα ααΆα ααΎααΆααααααΆααααΆα ααα·ααααααΆααα»αααΆααααααα ααΆαααΆααααααααα’αΆα ααα½αααααΆααα αααα»ααααα½ααααααααΆαα Google Stadia ααΆαααα αΆααααααααααα»αααΆαααΆαααααααααα αααΌαααΆααα ααΎαααΆαααΈααα α αΎαααα»αααααΌαααΆααααααΎααα»αααΆαααΆααααααααααα»αααααααααΌααα ααΆαααα·ααααααααα·α
3. α ααα αΆαα αααααΆαα ααΆααααααααααΆαα½αααΉαααααΌαααΌαα·ααΆααααα
αα·αααΆαααα½ααααααααΆαααΆααααα αΆαα αα·αααΌαααααΌαααΆαααααΎα±αααααααΎαααα»ααααΆααααα αααααΆααα ααααΆαααααΆαααααα α α·αααααααα½αα ααααα αααΎααααα»ααααααΆαααΊααααΆαα ααααΆααααααααααααΌαααααΆαααααααΆααα½αααΎααααΈααααΌαααααααΆαααΈαααααααα αα·αα’αααααααΎααααΆαααααα»α ααΎααααΈααΆααααααααααααααΆααααΎααααΎααα αα (RTT)α ααααΆααααααααααααΌαααααΆαα’ααααααααααααα½α 1 αα·ααααΆαααΈαααααααααΈαααΆα αααΎααααα ααα αΆαααΌααΆαααα·αααααα α’αΆαααα·αααΆααα·α α’αΆαααα·αααΆαααΎα α’αΊααα»α αα·ααα αα»ααΈ α α·αα αααΆαααΈαααααααααΈαααΆααα’ααααααΌαααααΆα ααααα‘ααααΆαααααα»αα ααααααααα’αΆα ααααααα½αααΆαα ααα αΆαααααααΆ αα αααααααααΆαααΈαααα αΌααα½α α¬α αΆαα ααααΈαααααΆαα ααΌα ααααααΆαα½αααΉαα ααΆα ααααα ααΆααααααααααΆαααΈαααααααααα’αα»ααααΆαα±ααααααΎααΆαααααααΆααααααα4. ααΆαααααααΆαααααααα·ααΈαα»ααα
ααΆααααα ααααααΎαααααΊααα’αααα»ααα ααααααααΆααααΌαααΆααα·α αααα»αααΈα’αααααααΎααααΆααα αααααΆααααααΆααΆα’αΆα ααααΎαααΆααα αααα»ααααααα·ααΈαα»αααα αααααα·ααΈαα»αααααΆαα’ααΈαααΊαα·ααα½αααααΎα±αααααα·ααααααααα ααααααΆαααΆαα»αααΆαααΆααααα’αΆα ααααΎαα ααΆααααααΆααα’αααααααΎααααΆαα ααααααααΆαα»ααα½αααααΈααΆαααα‘αΎααααααα·ααΈ αα·ααααααααΉαα αααααα·ααΈαα»ααααααα½αααααααα»αααΆααααααααα·ααΆαααΆαααααα ααα αα·ααα»αααααΌααααααααα ααΆααααΆαααα’ WebRTC ααααΌαααΆαααΆαααααααΆαααα’αα ααΌααΆαααααααα·ααΈαα»αααααααααα5. ααΆαααααααααΆαα αααΆααααΆααααα ααα»α αααααΆααα αααα αα·αααααΆαααα
αααα»αααΎαααααΆααααα ααααααΎαααααΆαααα·ααΆαα½αα ααα»ααααααααααΌααα½αααα’αΆα ααααΆααα’αααΈααα αααα·ααΆα α₯α‘αΌαααααααα»αααΆααα½ααααα αΌαLibRetro ααΆαα½αααΉαααααΆαααα cloud gaming ααΈααααα LibRetro αααααααΌαα ααα»α αααααΆαααααααα·ααΈααααΆααααΆαα αααααααααααααα’αΆααααααΆααα αααα retro ααΌα ααΆ SNES, GBA, PS α6. αααααααααααΆααα’ααααααα αααΎα ααΆααααα αααΌαααα»ααα αα·αααΆαααααΆααααΆααααα (ααααααα ) ααΆαα½αα αααα
CloudRetro ααΆααααααΆααααα ααααααααΈααΆα αααΎαααΌα ααΆ CrowdPlay αα·α Online MultiPlayer αααααΆααα ααααα’ααΈαααΆαα ααααα·αααΎα’αααααααΎαα½αα ααα½αααΎααααααααΆαααααα ααΌα ααααΆαα ααΎαα»αααααΌααααααααααααΆ αα½αααααΉαααΎαα ααααααααααα»αααααΎαααΆαααΌα ααααΆ α αΎααααααΆααα’αΆα α αΌααα½αααΆααΆαααααααααΆαααααα ααα ααααΆαααΆαα ααααααααΌαααΆααααααΆαα»ααααα»αααααΆαααααα»ααααα ααΆα’αα»ααααΆαα±ααα’αααααααΎααααΆαααααααααααΆααααααααααα ααΎα§αααααααααααααα
7. ααΆαααααΎααΆαααααααΆαααααα
ααΌα SAAS ααΆαα½αααΆααααα αα α»ααααααααα ααΆααααα ααααααΎαααααααΌαααααααΌαααΆααα ααΆα‘αΎαααΎααααΈα±ααααΆαααΆαααααααΆααααααα ααΆααα ααΆα’ααααααααααααα½α-ααααααα’αα»ααααΆαα±ααα’ααααααααααααααααααααααααααΎααααΈαααααΎα ααΆα αααααΆααααα αααΎαα8. ααααΆαααΆααααααΆαααα ααααααα½α
α αααααΆαα ααΆαααααααααααα CloudRetro ααααΌαααΆααααα αα‘αΎααα ααΎα’ααααααααααααΆαααααααααααααΆ (Digital Ocean, Alibaba, α’ααααααααααααΆααααΆαααααα½α) αααααΆαααααααααααααααααΆα αααα»αααΎαααααΎαααΆααααα»ααα»αααΊααα Docker αααααΆααα αααααΆαα ααΆαααααααα αα·αααααααα ααΆααααααααααΆαααααααααααΆααααααααΎααααααΈα bash ααΎααααΈαααααΆαααΆαααΆαααααα αΌααα αααα»αα’ααααααααααααΆααααααα½αα αααααΆααα½ααααα αΌαααΆααΆαα½α NAT Traversal αα αααα»α WebRTC ααΎαα’αΆα ααΆαααΆααααααααααα»αααΆαααΆαααααααΆα CloudRetro αα ααΎαααα·ααΆαααααΆαα½α αα·αααΌααααΈαααα ααΎαααΆαααΈαααααα’αααααααΎααΆαα½ααααΆααα ααΆααααΆαααααααα
ααααααα (α¬αααΆαααΈαααααααααΈααααααΆααααααΆααααΆαααΎ) αα»αα αααα ααααΎαααΆαααααααααααααααΌα αα·αα αΆαααααααααααΆαα’αα·αααΌααααα’αααααααΎααααΆααα ααααΈααααααααααΌαααΆαα ααα αΆαααΆαααααα·ααααα α αΎααααααααα·αα½ααα’αΆα αααααααααααααα’αααααααΎααααΆααααΆα αααΎααααα»ααααααααΆαααααΆα
α’ααααααααααααα½αα ααα½ααα»αααααΌααααα»αααΆαααααΌααααα’αααααααΎααααΆααααααΈααΆαα½αααααααααααααααααααα»ααααααΆααααΆαααααΆαα α’ααααααααααααα½αααααΎα’ααααααααααΆαα½αααααααααΆαααα WebSocket α
ααΆααααα»αααααΆαααΆαα ααααα α§ααααααααα»αααΈα ααααΆααααααΆααααααΆααααααα ααααααΆααα’ααα α§ααααααααα»αααααααααααΌααα»αααΆαααααΆαααααΌα ααΆ αααααΆαα»α/αααα»αααΈα ααααΆαα
ααααΆααααααααααααα·αααααΌααα CloudRetroααααααΈαααααΆαααααα½α
αα ααααααα’αααααααΎααααΆααααααΈααΎα CloudRetro αα αααα»αααα αΆαααΈ 1 αα·αααΈ 2 ααααααα αΆααααα»αααΌαααΆαααΆαααααα α’ααααααααααααα½ααα½αααΆαα½αααΉααααααΈαα»ααααα·ααααααΆαααααΌαααΆαααααΎαα»ααα ααΆαααααααααΈαα½αα αααααΆααααΈααα αααα»αααα αΆαααΈ 3 α’αα·αα·ααααααΆααΆααααααΆαααααααααΆαααααααααααΆααα’αααααααααΎααααΎ HTTP ping α αααααΆαααααααααΈααααΆααααααΆαααααααααααΌαααΆααααααΌααααα‘αααα α’ααααααααααααα½ααα·αααΎααααΈα±ααααΆααα’αΆα ααααααα»ααααα·αααααααααααααα»αααΎααααΈαααααΎα’αααααααΎααααΆααα ααα αΆαααΈ 4 ααΆαααααααααααΎαα ααααα ααΆααααααΆααααααααΈα WebRTC ααααΌαααΆααααααΎαα‘αΎααααΆαα’αααααααΎααααΆαα αα·ααα»ααααα·ααααααΆαα αΆααααΆααα
ααααααΈαα’αααααααΎααααΆαααααααΆααααΈααα½αααΆααα·αααα·α αΌαααααΎα’αααΈααααα ααΆααααα»ααααααα
α αααα αα·ααααααααααααΈαααααΌαααΆααααααΆαα»ααα ααΆααααα»ααα»ααααα·ααααα»αααΆαα―αα αα·αααααΆααααααΌαααααααΆααα ααΈαααααΆααααα ααα»α αααααΆααα αα αα α»αααααααααααααΆαααααααααααααΌαααΆαα’αα»αααααααααΆαααααααα·αααααααα αααα»αα’αααα αα αΆαααΆαααα
ααα»αααα·α Golang αα αααα»αααααΎαααΆαααΌα ααααΆα ααααα αααααΆααααΊααΆαααααααααα½α, i.e. ααΆαααΎαααααΎαααΆαα αααααααα―αααΆααααα αααα»αααααΎαααΆααα½αααααααααα
α’αααααααααααααΆαααΆαα»αααααααααΆαααΆαα»ααααΆαααα
- WebRTCα αααΆαααΆααααΆαααΈαααααααααααα½αααααΆααααα αΌαααααα’αααααααΎ αα·ααααα αααααααααααΆαα’αα·αααΌαααΈαααΆαααΈαααα
- αααααα·ααΈααααΆααααΆαα ααααα αααΆαααΆαα»α ααααα ααΌαα’ααα»αααααααααΆααα Libretro ααααααααα’αΆα ααααΎαααΆαα αααααα αααα»αααααΎαααΆαααΌα ααααΆ αα·αααααΆααα αΆααααααααααααααααααααΆα αα·αααααααΈααααα αΌαααΆααααα»αα
- ααα»ααααα»αα ααααααααΌαααΆαα αΆαααα αα·αααααΎαα ααΆαααααααα·ααΈαααααααααΌαα
- ααΌαααΆα/αααααα·ααΈαααααααααα‘ααα ααααααααααααααΆαα’αα·αααΌααααααααα»ααααα α’αα·αααΌααα½αααΆαααα»αααααααΆαααααα αα·ααααα ααααΌαααΆα/α’αΌααΈαααΌαααααΆαα’αα·αααΌαα
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ
CloudRetro ααΉαααα’ααααΎ WebRTC ααΆαα αα αααα·ααααΆααα’αΉαααααααααααΆ ααΌα αααααα»αααΉαα αΌααα αααα»αααααααΆααααα’α·αααααΆαα’αα»αααα Golang αααα»αααΆααααααα α α·ααααα·ααΆαα’αααΈ WebRTC αααα½αα―αα αααααΊααΆαα αα αααα·ααααΆααα’ααα αΆααααααααΆααα½ααααα»ααααΆαααααΆαααααα»αααΆααααααα ααΆαααΌαααΆαααΊααααΆαααΈααΈααααααΆααααΆαααααΆααα·ααααααα
WebRTC
WebRTC ααααΌαβααΆαβαα ααΆβα‘αΎαβααΎααααΈβαααααβααΌαβααΆαβαααααΆααβααΈβαα½αβαα βαα½αβαααβααΆαβαα»αααΆαβαααααβαα βααΎβαααααα·ααΈβααΌαααααβαα·αβαααααα·ααΈαα»αααβααΆαβα’ααΈαααΊαα·αβααΎαβαααβααααΎ APIs ααΆααααα
NAT ααααααΆαα
WebRTC ααααΌαααΆαααααααΆααααΆαααααΆαααα»αααΆα NAT Traversal ααααααΆα WebRTC ααααΌαβααΆαβαα ααΆβα‘αΎαβαααααΆααβααΆαβααααΆααααααβααΈβααα»αααβααααΆααβαα βααααΆααα ααααα ααααααΆααΊααΎααααΈαααααααααααΌαααααΆααααααααααααααα»α αααααΆαα αααααααΌα NAT αα·ααααααΆααααααΎααααααΆααααΆαααααΆααααααααΈαα·ααααααααα·ααΆααααααααΎαααΆαα α ααΆ
ICE . ααΆαααααααααααΎαααΆαααα WebRTC APIs αααααααα’αΆααααααΆα IP ααΆααΆαααααααα’ααααααααααΎαααΆαααΈααα STUN α αΎααααααΌαααΆαα αααΆαααΈααααααααΌαα (ααΎα ) αα ααααααααΆααααααΆαααααααααΆαααα·αα’αΆα αααααΎαααΆααααααααΆαααΆααααα CloudRetro αα·αααΆαααααααααααααΆαααααα»αααΈαααααααα·ααααααααα ααΆααααααΆααααΈαα·ααααααααα·ααααααΆαα·αααΆααααΆαα’αααααααΎααααΆαααα ααα»αααααααΆαα’αααααααΎααααΆαα αα·ααααΆαααΈααααααα αααααααΆααααΆαααΈααααααααΌααααααααΆαααΆαααΉααααααΉαααααΆααααααααααΆαααα·α ααΆαα§αααααα’αααααααΎααααΆααααααααΆα αααα’αα»ααααΆαα±ααα’αααααΎαα αααα αΌαααΆαα»α α¬ααααΎα’αΆααααααΆα IP ααΆααΆααααααααααΆαα αααααΆααααΆαααΈααααα·ααα ααΈααααα NAT ααα
ααΈαα»ααααα»αα αααααααααααααααα ααΆαααα·ααΆα ααα αΆαα αααααααααΆαα Cloud Gamingα αααα·ααααααΊααΎααααΈα’αα»ααααΆαα±ααα’ααααααααΎαα αααααααααα αααα αα·αααααΆαααααΆαααααΆαα α αΎαα’αααααααΎααααΆααααΉαααααΎα’ααααααααααΆαα½αα’ααααααααααααΆαααααααΆααα αα αααα»ααααααααα·ααααααΆαααα CloudRetro ααααΆααααααΆααααααααααααααΆααααααΆααααααΆαααααααΈαααΆααΈααΈααΈαα ααΆααα’αααααααΎααααΆαα αααααααΎα±ααααΆα’αΆα ααααΎααΆαααααααΆαααΆαααΆααααα αααΎααα ααααααααΆαααααΆααα αΆααααααα αα½ααΆααΈαααα WebRTC NAT Traversal αα ααΈαααααΊααΆαααΆααααααΆααααααΆααααΆαααααα»αααΆααα½αααααα½ααααααΆαα αΆααααααΎαααΆααααααΆααααΈααααΆαααα ααααΆαααα ααΎααααΆαααααΆαααααΆαααααααΆααΈααΈααΈ αααααααΎα±ααααΆααΆααααααΆααααα½ααααααΆααα’ααααααααΎαααΎααααΈααααΆαααα αααααΆαα
ααΆααααα αΆααααΈααα’αΌ
ααΆααααα αΆααααΈααα’αΌααΊααΆααααααα½αααααα·αα’αΆα ααααααΆαααααααααααα αΌαααααα αα·ααα½αα αααααααΆαα αααΎααααααα αΌααααΌαα αααααααααααΆαα·αα αΆαααΆα ααααα»αααΆαααΉαααΆααααααααΆααααα’α·αααααΆαα’αα·αααΌαααΈααα’αΌ VP8/H264 ααα ααΆααααααΉαα’αααΈααααααα·αα’αΆα αα½αα’αααα±αααααα’αααΈαααααΎαααααΏαααΈααα’αΌααααααΈα ααααΆααααα α»αα’αΆαααααα·αα·ααΆααααα·αααααΉααα»α αα·ααααααααΌαααΆαααΊααααΆαα
ααΆααααα αΆααααΈααα’αΌαααααΆααααααΆααααααααααΈαααΊαα·ααΆαααααααααα½ααααααααΆαααααΌαααααΆααΆααΆαααααααΆα’αα·αααΌαααα»α + αααααααΆαααααΌααααααΆα + αααααααΆαα·ααΌαααΊααΆαααΆααααα’αΆα ααααΎαα ααΆαα ααΎαααΈααα ααααΎαααΆααααααααΌαααααΌααααααα αα·αααααα ααΆααααααΌαααΆααααααααααΌααα½αα ααα½ααα·αααααΌαααΆαα’αα»ααααααβα§ααΆα ααα ααΎααα·αα’αΆα α’αα»ααααααααααΆααααααααααΌαααΌαααΆαααα αα―αααΆαααΌα ααΆα αα·αααααααααααΆααα·ααΌα α¬ααααΎααΆααααα αΆαααα·ααααΈαααααΆααααααΆαααααα
αααα·ααα ααΈαααααααΆααααα αΆααααΈααα’αΌααΊααΎααααΈαα»αααααΆααααααααΆαααααα·αα αΆαααΆα α ααααααααααααααΆααΆαααΌαααααα·αααΆαααααΉαααααΌααααα’αΆα ααα½αααααΆααααααΆααα’αααααααΎααααΆααα ααααααααΈααΎααΆαα’αα·αααΌαααα»αααΌαααΆααα·αα·αααααα»αααα αααα½ααααααααΆααααα αΆαααΈααα»ααα αα α»ααααααααΈααα»ααα»α αα·ααααααΆαα ααΌα ααααααΆαααααΆααα»αααααΆαααααα½αααααα»ααααααααααααΌαααΆαααααΎα ααΌα αααα’αΆα ααΎαααΎαααΈα§ααΆα αααααΆαα½α Pacman ααΆαααα ααα»α ααΈαααααααααααααα»ααααααααααααΌαααΆααααααΌαα
ααΆαααααααααααα»αααΈααα’αΌαααααααΎ Pacman ααΆα§ααΆα αααααΆααααα αΆααα’αΌααΈαααΌ
ααΌα ααααΆαααααα αααα½ααααααααΆαααΆααααα αΆααα’αΌααΈαααΌ αα»ααα·αααααααααααα»ααααα·αα’αΆα αααααΆαα Opus αα αα α»ααααααααΊααΆααΌαα·αα’αΌααΈαααΌαααααααΎαααΆαααα’αααα»αα ααΆααααΌαααΆααα ααΆα‘αΎαααΎααααΈαααααΌααααα’αΌααΈαααΌααΎαα·ααΈααΆα datagram αααααΆααααααΆαα·αααΌα ααΆ RTP (Real Time Transport Protocol)α ααΆαααΊαααααααΆααΆαααΆα mp3 αα·α aac α αΎααα»αααΆαααΊαααααααΆαα ααΆαααΊααααΆαααΆααααααΆααΊαααα αα 5 ~ 66,5ms α
Pion, WebRTC αα Golang
ααΈ ααΊααΆαααααααααααααΎαα αα αααααΆα WebRTC αα Golang α αααα½αα±ααααΆααα»αααααααΆαααααααΆααα C++ WebRTC ααΎα Pion ααΊααΆααΆαα’αα»αααα Golang αα WebRTC ααΆαα½αααΉαααΆαα’αα»ααααααΆαααααααααΎα ααΆααα½ααααα αΌα Go αα·αααΆααααααααααααααααΎαα·ααΈααΆα WebRTC ααααααΆαααααααΎαααΆαααααΆαααΆαα½αααΉαα§αααααααααΆααααα’ααα αΆαααααΆα αααΎαααΆαα½αααΉαααΆαααΊααααΆαααΈααΈαα ααΆααΆαααΆαα’αα»ααααααααΆαααααα½ααααα STUN, DTLS, SCTP ααΆααΎαα αα·αααΆααα·ααααααα½αα ααα½αααΆαα½α QUIC αα·α WebAssembly α αααααΆααααααααααΎαα αα αααααΊααΆααααΆααα·ααααΆααααα’αα½αααΆαα½αααΉαα―αααΆαααααα’ ααΆαα’αα»αααααα·ααΈααΆααααααΆα αα·αα§ααΆα αααααα’αα
αα αααα Pion αααααΉαααΆααααα’ααααααααΎαααααααααΆααααααΆαα ααΆαααΆαααααααΎα ααΆαα½αααΉαααΆααα·ααΆααααΆα’αααΈαα»αααΆαααΆα αααΎααααα»αααααΎαααΆαα’αααΈ WebRTC α ααααα·αααΎα’αααα αΆααα’αΆααααααααΎαα αα αααα·ααααΆααα ααΌαα αΌααα½α
http://pion.ly/slack - α’αααααΉααααα’αααΈααααΈαααΆα αααΎααααΆαααααα CloudRetro αα αααα»α Golang
ααΆαα’αα»αααααααααααα αααα»α Goαα ααΆααααα»αααα·ααα αααα»ααααααααΆα
ααΌαα’ααα»αα ααααααΆααα ααΆααα»αααα·ααααααααααα’αΆααααα Go αααα αΆααααΆαααααΆαααααΉαααα·ααΆααα αα·αααΆαααααααααΆααααΌαααΆαααααα½ααααΆαααααΆααα ααΌα αα αααα»αααααΆααααΆα GoRoutines αααααααααΆααΆααααΆαααΆαα»ααΆα αααΎαααααααα»αααααΎαααΆαααααααααΆα αααΆαααΆαα»ααΈαα½αααααααααααααααΆαααΆαααααααΆ αα·αααααΆααααααααΆαααααααααΆαα ααΆαα’αα’αΆαααααΎαααΎααααα Golang αααααα±ααααααΉαααα·ααΆαααα’αΆααΌαα·ααα½αααααΌαααΆαααααΎαααΆαααΆααααααα αααα»αα αααα (ααΌαααΈααααα»αα αααα)α αααααΆααααααΆαα·αα αΆαααΆα αα αΆααααααααααΆααααΆααα ααΆαααααα α§ααΆα ααα αα ααααααα’αααααααΎααααΆαααααααΆαα»α ααΌαααααααααααααααΆαααΆαα ααααααααΌαααΆαααΆαααΆαα ααααΆαααΆαααααα½ααααααα αααα αΌααα αΌααααααΆααααααΆαα»αααΆααααα ααα ααα‘α»ααααααΈαα ααααααΈαα½αα αααααα·ααΈααΆααααααα’αΆα αααααααααααΆαααααααα·ααααα·ααΆααααααΆαα»α α¬αααα αΌαααα»ααααα αααααααΎα±ααααααΎαααΆαααααΎαααΆαααΆααα»ααααα·ααΆαα
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 αα·α Multiple Player αααααααα»ααααΆαααα’α₯αααα ααα ααΆαααααΆαααα ααΆαα»α αΌαααααα’αααααααΎααααΆααααΆααα’αααα αααα»ααααααααα½αααααΌαααΆαααΆαααααα αααα»αα αααα αΌααααααΆαα αααααΆααααααααααααααααααααααΆαα ααααααααΌαααΆαααΆααα±ααααααΎααααΆαααα ααΆααα’αααααααΎααααΆααααΆααα’αααα αααα»ααααααααααα½αα αα αααα»ααα·ααΈααα ααΎααααααα ααΆαααΌαααΆααααα ααααααΆαααΆαα αααααααΆαααααα ααααααΆα αααΎαααα’αααααααΎααααΆααααααααααααΆα
ααΆαααααΎααααΆααααααααΆαααααααααααααααΆαα»ααα·ααααα·αα Golang
Golang ααΊαα·αααα’α₯αααα ααααα ααΆαααααΊααΊαα ααΎαααααααααα ααΉαααΆααααααααΆαα ααα»αααα·α Go ααΊααΆαααααααΆαααΆααααα½αααΆααααα»αααΆααααααααΆαααααΉαααα·ααΆαααααααΆαααααΆ αα·αααΆαααα ααα»ααααααα»αααα·ααα·ααααααααΌαααααΎαααΆαααα’αααα»ααααααα ααΆααααααα·ααααΆαααααααΆαααααα»αααααΆααα αααααααΆαααα ααΌα αααααααα»αααΆαααααΎααΆααααααααΌααα½αα ααα½αα ααααααΆαα’αα»αααα αααα’αα»ααααααΆαα αΆαααα αα·ααααααα’αΆααΌαα·α α‘αΎααα·ααα ααααααα½αααΆαααααΎααααΈαααααΎαααααα·αααααΆαααααα·ααααα·ααΆαα
ααΎαααΈααα α’ααααααααΌαααααΆααα Golang ααΊαα·αα’αΆα αααααααααααΆα ααααα½αααΆααααααΆαα±ααααΆαααΆαααα’αΆαααΌααα½αα±ααααααααα ααΆααααΆααααΆαααααΆααααααααααα·ααΈααααΆαααΆααααααααΆααΆαααααααα
αααΈα α’αΌ
αααααααααααααΎααααΆαααααααΆααα Golang VP8/H264 αααααΆααααααααΎαα αα αααααΆααααΆαααααα½αααααααααααααααααααΆα αα·α Libretro αααααΆαααααααα·ααΈααααΆααααΆαα ααααα αααααΆαααβααΆααβα’ααβαααβααΊβααααΆααβααβααΆβαααα ααβααβαααααΆααα C αααα»α Go αααβααααΎ
αααΈα α’αΌ . αα»ααα·ααααα·αα½αα ααα½αααααΌαααΆαααΆααααα»ααααααΆααααααα Dave Cheney . αααα αΆααααααα»ααα½ααααααα- α’αααααααΆααααα»αααΆαα αΆααααΆαααΆαααα αααα»α CGO ααΌααααΈααααΆαα½αααΉα Golang RecoveryCrash;
- ααΆααααΆααααααα»αααΆααααααα’ααααααααΆαααΆαααΆααααααααααΆαα’αα»αααα αα ααααααααΎααα·αα’αΆα ααααΎααααα αΆαααα’α·ααα αααα»α CGO α
ααα ααααΈααααα·ααααΆα
αααα»αααΆαααααα ααααα αααααααα»ααααα»αααΆααααααΉαα’αααΈααααΆααααα ααααααΎααα αα·ααααααΎααααα·ααΆααααα½ααααα»ααααα ααααα’ααΈαααΆααααααΉαααααΆααα·ααααααΆαα½ααα·ααααααααααα»αααΆαα’ααΈαααΊαα·αα αααααααααααΉααα·αα’αΆα ααααΎαα ααΆαααααΎααααΆααααααΆααα Pion αα·αααΆαααΆααααααΈαα αααα Pion α αααα»αβααΆαβα’ααααα»αβαααΆαβααααΆααβα ααααβααΆαβα’αα·ααααβαααΆαβααααΆααβααααβααΆα APIs ααΆααααααααααααααα WebRTC αα·α Pion ααΆααΆααΆαααΌαααΆααα½ααααα αΌααααααααΆααααααα αααααα»ααΆαααααΌααααααα·ααααααααα»αααααΌαααΆαα ααααααΆααα αααααΆα αααααααα αααααΈααΆαααα»ααα·αααΆαα ααααααΉαααΈαα»αα’αααΈααΆαααααΆααααααααΈαα·ααααααααα· (P2P) αααααα
αααααΈααΆααΆαααΆαααΆααααα½ααααα»αααΆααα½ααααα αΌαααααα ααΆαααααααΈα P2P ααΊαα·αααΆααααααααα»αααααΆααααα»ααα·ααααΆααΆααααααα»αααααΌαααα ααΆαααααΌααααααααΆαααΆαα½αααΉαααΆααααα»αααααΆαααααααΆαααααααααααααΆααααααΆαααααααααΌαααΌα ααΆ IP αα·α NAT ααΎααααΈαααααΎααααα peer-to-peer α ααααααααααααα»αααααΎααΆαααΎααααααααα αααα»αααΆαααα½αα ααααααΉαααααΆααααααααΆα αααΎαα’αααΈαααααΆα αα·αααΆααααααΎαααααα·αααααΆαααααα·ααααα·ααΆα ααΌα αααααααα»αααΎαααΉαα α·αααα’ααααααααααααΆα±ααααΆααααααααααΎαααα·ααα P2P αααααααΎ WebRTC α
CloudRetro ααααΎααααα ααΉαααααΈααααΎααααΆααααΆααα’ααααααααα»αααΆαααααΉααα»αααΈαααααααααααααα»ααααα»αααΆαααΆα’ααααααα αααααααα’ααΈαααΆαα αααααΆαααΆαααΆααααα αααα»ααα·αααΆααΆααααααααΆα αααΎααα αααα»αααααααααααααα»αα’αΆα αααααα’ ααΌα ααΆααΆαααααΎα±αααααααΆαααΆαααααα½αα±αααα»αα α·ααα αα·αααααΎαααΆα ααΆααααααααααΆα ααα·αα αααααα»αααΆαααααα α¬αααααααΆααααα»αααΆαα αααααααα αααααααΆαα’αααααααΎααααΆααα αααα»ααααα»αααααΎααΆααααΆαααααΆαααΎααΏααααα ααΌαβα’αα»ααααβααΆα
αααααα α αΎαααΆααααααΆααααα·αααΎα’αααα αΌαα α·αααααΆα
ααααα: www.habr.com