WebRTC์˜ ์˜คํ”ˆ ์†Œ์Šค ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„: p2p, ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด, ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์—†์Œ

WebRTC์˜ ์˜คํ”ˆ ์†Œ์Šค ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„: p2p, ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด, ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์—†์Œ
์„œ๋น„์Šค๋กœ์„œ์˜ ์†Œํ”„ํŠธ์›จ์–ด, ์„œ๋น„์Šค๋กœ์„œ์˜ ์ธํ”„๋ผ, ์„œ๋น„์Šค๋กœ์„œ์˜ ํ”Œ๋žซํผ, ์„œ๋น„์Šค๋กœ์„œ์˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ํ”Œ๋žซํผ, ์„œ๋น„์Šค๋กœ์„œ์˜ ํ™”์ƒํšŒ์˜, ์„œ๋น„์Šค๋กœ์„œ์˜ ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ตœ๊ทผ ๊ตฌ๊ธ€์ด ์ถœ์‹œํ•œ ์Šคํƒœ๋””์•„(Stadia) ๋“ฑ ํด๋ผ์šฐ๋“œ ๊ฒŒ์ด๋ฐ(Cloud Gaming)์„ ๋งŒ๋“ค๋ ค๋Š” ์‹œ๋„๋Š” ์ด๋ฏธ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ์žˆ์—ˆ๋‹ค. ๊ฒฝ๊ธฐ์žฅ WebRTC๊ฐ€ ์ฒ˜์Œ์ด ์•„๋‹™๋‹ˆ๋‹ค, ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ WebRTC๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

Thanh Nguyen์€ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ CloudRetro์—์„œ ์ด ๊ธฐํšŒ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. CloudRetro๋Š” Pion์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ์ธ๊ธฐ์žˆ๋Š” Go ๊ธฐ๋ฐ˜ WebRTC ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์…”๋ˆ„ ์ด ๊ธฐ์‚ฌ๋ฅผ ์ค€๋น„ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค€ Pion ๊ฐœ๋ฐœ ํŒ€์œผ๋กœ๋ถ€ํ„ฐ). ์ด ๊ธฐ์‚ฌ์—์„œ Thanh์€ ์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ๊ฐœ์š”๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์ž‘์—… ์ค‘์— ๋ฐฐ์šด ์œ ์šฉํ•œ ๋‚ด์šฉ๊ณผ ์ง๋ฉดํ•œ ์–ด๋ ค์›€์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ž…

์ž‘๋…„์— Google์ด Stadia๋ฅผ ๋ฐœํ‘œํ–ˆ์„ ๋•Œ ์ •๋ง ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๊ฐ€ ๋„ˆ๋ฌด ๋…ํŠนํ•˜๊ณ  ํ˜์‹ ์ ์ด์–ด์„œ ๊ธฐ์กด ๊ธฐ์ˆ ๋กœ ์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ์ผ์ด ๊ฐ€๋Šฅํ•œ์ง€ ๋Š์ž„์—†์ด ๊ถ๊ธˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์ œ๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๋ ค๋Š” ์—ด๋ง์œผ๋กœ ์ธํ•ด ์ €๋Š” ์˜คํ”ˆ ์†Œ์Šค ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„์˜ ์ž์ฒด ๋ฒ„์ „์„ ๋งŒ๋“ค๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์ •๋ง ํ™˜์ƒ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ๋Š” ํ•œ ํ•ด ๋™์•ˆ์˜ ์ž‘์—… ๊ณผ์ •์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ.

TLDR: ํ•˜์ด๋ผ์ดํŠธ๊ฐ€ ํฌํ•จ๋œ ์งง์€ ์Šฌ๋ผ์ด๋“œ ๋ฒ„์ „

ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„์ด ๋ฏธ๋ž˜์ธ ์ด์œ 

์ €๋Š” ํด๋ผ์šฐ๋“œ ๊ฒŒ์ด๋ฐ์ด ๊ณง ๊ฒŒ์ž„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ปดํ“จํ„ฐ ๊ณผํ•™์˜ ๋‹ค๋ฅธ ๋ถ„์•ผ์—์„œ๋„ ์ฐจ์„ธ๋Œ€๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„์€ ํด๋ผ์ด์–ธํŠธ/์„œ๋ฒ„ ๋ชจ๋ธ์˜ ์ •์ ์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ์€ ์›๊ฒฉ ์„œ๋ฒ„์—์„œ ๊ฒŒ์ž„ ๋กœ์ง์„ ํ˜ธ์ŠคํŒ…ํ•˜๊ณ  ์ด๋ฏธ์ง€/์˜ค๋””์˜ค๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜์—ฌ ๋ฐฑ์—”๋“œ ๊ด€๋ฆฌ๋ฅผ ๊ทน๋Œ€ํ™”ํ•˜๊ณ  ํ”„๋ŸฐํŠธ์—”๋“œ ์ž‘์—…์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ๊ณผ๋„ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ๋Š” ๋” ์ด์ƒ ํ•˜๋“œ์›จ์–ด ์ œํ•œ์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Google Stadia๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฒŒ์ž„์„ ์ฆ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. AAA ๊ฒŒ์ž„ (์˜ˆ: ๊ณ ๊ธ‰ ๋ธ”๋ก๋ฒ„์Šคํ„ฐ ๊ฒŒ์ž„)์„ YouTube์™€ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์šด์˜ ์ฒด์ œ๋‚˜ 2D/3D ๊ทธ๋ž˜ํ”ฝ ๋””์ž์ธ ๋“ฑ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ฃผ์š” ์˜คํ”„๋ผ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋„ ๋™์ผํ•œ ๋ฐฉ๋ฒ•๋ก ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ์— ๊ฑธ์ณ ์ €์‚ฌ์–‘ ๊ธฐ๊ธฐ์—์„œ ์ผ๊ด€๋˜๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ง์ด์ฃ .

WebRTC์˜ ์˜คํ”ˆ ์†Œ์Šค ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„: p2p, ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด, ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์—†์Œ
์ด ๊ธฐ์ˆ ์˜ ๋ฏธ๋ž˜: Microsoft Windows 10์ด Chrome ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„์€ ๊ธฐ์ˆ ์ ์œผ๋กœ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๊ฒŒ์ž„์€ ์ง€์†์ ์ด๊ณ  ๋น ๋ฅธ ์‚ฌ์šฉ์ž ์‘๋‹ต์ด ํ•„์š”ํ•œ ๋“œ๋ฌธ ์˜์—ญ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๊ฐ€๋” ํŽ˜์ด์ง€๋ฅผ ํด๋ฆญํ•  ๋•Œ 2์ดˆ์˜ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์ด๋Š” ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ ๋น„๋””์˜ค ์ŠคํŠธ๋ฆผ์€ ๋ช‡ ์ดˆ ์ •๋„ ์ง€์—ฐ๋˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ํ•ฉ๋ฆฌ์ ์ธ ์œ ์šฉ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒŒ์ž„์ด ์ž์ฃผ 500ms์”ฉ ์ง€์—ฐ๋œ๋‹ค๋ฉด ๋‹จ์ˆœํžˆ ํ”Œ๋ ˆ์ด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•  ๋ฟ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ๊ทน๋„๋กœ ๋‚ฎ์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ๋‹ฌ์„ฑํ•˜์—ฌ ์ž…๋ ฅ๊ณผ ๋ฏธ๋””์–ด ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ๊ฐ€๋Šฅํ•œ ํ•œ ์ž‘๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋น„๋””์˜ค ์ŠคํŠธ๋ฆฌ๋ฐ์— ๋Œ€ํ•œ ์ „ํ†ต์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์—ฌ๊ธฐ์— ์ ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

WebRTC์˜ ์˜คํ”ˆ ์†Œ์Šค ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„: p2p, ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด, ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์—†์Œ
์ผ๋ฐ˜ ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„ ํ…œํ”Œ๋ฆฟ

์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ CloudRetro

์ €๋Š” ์ด๋ ‡๊ฒŒ ์—„๊ฒฉํ•œ ๋„คํŠธ์›Œํฌ ์ œํ•œ์œผ๋กœ ์ด ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„์˜ ํ…Œ์ŠคํŠธ ์ƒ˜ํ”Œ์„ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐœ๋… ์ฆ๋ช…์„ ์œ„ํ•ด Golang์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. Golang์€ ๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ์นœ์ˆ™ํ•œ ์–ธ์–ด์˜€๊ณ  ๋‚˜์ค‘์— ๋ฐœ๊ฒฌํ•œ ๋ฐ”์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ์ด ๊ตฌํ˜„์— ๋งค์šฐ ์ ํ•ฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Go๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋ฐœ์ „ํ•ฉ๋‹ˆ๋‹ค. Go์˜ ์ฑ„๋„์€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๊ณ„ํš CloudRetro.io ๋ ˆํŠธ๋กœ ๊ฒŒ์ž„์„ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ์˜ ๋ชฉํ‘œ๋Š” ์ „ํ†ต์ ์ธ ๋ณต๊ณ ํ’ ๊ฒŒ์ž„์— ๊ฐ€์žฅ ํŽธ์•ˆํ•œ ๊ฒŒ์ž„ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ณ  ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์—์„œ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/giongto35/cloud-game.

CloudRetro ๊ธฐ๋Šฅ

CloudRetro๋Š” ๋ณต๊ณ ํ’ ๊ฒŒ์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„์˜ ํž˜์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋งŽ์€ ๋…ํŠนํ•œ ๊ฒŒ์ž„ ๊ฒฝํ—˜์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฒŒ์ž„์˜ ์ด์‹์„ฑ
    • ํŽ˜์ด์ง€๋ฅผ ์—ด ๋•Œ ์ฆ‰์‹œ ์žฌ์ƒ; ๋‹ค์šด๋กœ๋“œ๋‚˜ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
    • ๋ชจ๋ฐ”์ผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๊ฒŒ์ž„ ์„ธ์…˜์€ ์—ฌ๋Ÿฌ ์žฅ์น˜์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค์Œ์— ๋กœ๊ทธ์ธํ•  ๋•Œ ํด๋ผ์šฐ๋“œ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฒŒ์ž„์€ ์ŠคํŠธ๋ฆฌ๋ฐ๋˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ํ”Œ๋ ˆ์ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • TwitchPlayPokemon๊ณผ ๊ฐ™์€ ํฌ๋ผ์šฐ๋“œํ”Œ๋ ˆ์ด, ํฌ๋กœ์Šค ํ”Œ๋žซํผ์ด ๋” ๋งŽ๊ณ  ์‹ค์‹œ๊ฐ„์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค.
    • ์˜จ๋ผ์ธ ์˜คํ”„๋ผ์ธ ๊ฒŒ์ž„. ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋„คํŠธ์›Œํฌ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ํ”Œ๋ ˆ์ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ CloudRetro ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด 2๋ช…์˜ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ Samurai Shodown์„ ํ”Œ๋ ˆ์ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    WebRTC์˜ ์˜คํ”ˆ ์†Œ์Šค ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„: p2p, ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด, ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์—†์Œ
    ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ์—์„œ ์‹คํ–‰๋˜๋Š” ์˜จ๋ผ์ธ ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด ๊ฒŒ์ž„์˜ ๋ฐ๋ชจ ๋ฒ„์ „

    ํ•˜๋ถ€ ๊ตฌ์กฐ

    ์š”๊ตฌ ์‚ฌํ•ญ ๋ฐ ๊ธฐ์ˆ  ์Šคํƒ

    ์•„๋ž˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์„ค์ •ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

    1. ํ•œ ๋ช…์˜ ํ”Œ๋ ˆ์ด์–ด
    ์ด ์š”๊ตฌ ์‚ฌํ•ญ์€ ์—ฌ๊ธฐ์„œ๋Š” ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ช…๋ฐฑํ•ด ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„์€ ๊ธฐ์กด ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค์—์„œ ์ตœ๋Œ€ํ•œ ๋ฉ€๋ฆฌ ๋จธ๋ฌผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ฑ๊ธ€ ํ”Œ๋ ˆ์ด์–ด ๊ฒŒ์ž„์— ์ง‘์ค‘ํ•œ๋‹ค๋ฉด ๋Œ€์ค‘์—๊ฒŒ ์ŠคํŠธ๋ฆฌ๋ฐํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์•™ ์ง‘์ค‘์‹ ์„œ๋ฒ„๋‚˜ CDN์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ฑํฌ ์„œ๋ฒ„์— ์ŠคํŠธ๋ฆผ์„ ์—…๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์ค‘์•™ ์ง‘์ค‘์‹ WebSocket ์„œ๋ฒ„์— ํŒจํ‚ท์„ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹  ์„œ๋น„์Šค ์ŠคํŠธ๋ฆผ์€ PXNUMXP WebRTC ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ง์ ‘ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

    2. ๋‚ฎ์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์˜ ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆผ
    Stadia์— ๋Œ€ํ•ด ์ฝ์œผ๋ฉด์„œ ์ผ๋ถ€ ๊ธฐ์‚ฌ์—์„œ WebRTC๊ฐ€ ์–ธ๊ธ‰๋˜๋Š” ๊ฒƒ์„ ์ž์ฃผ ๋ด…๋‹ˆ๋‹ค. WebRTC๊ฐ€ ๋›ฐ์–ด๋‚œ ๊ธฐ์ˆ ์ด๋ฉฐ ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„์— ์‚ฌ์šฉํ•˜๊ธฐ์— ์™„๋ฒฝํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. WebRTC๋Š” ๊ฐ„๋‹จํ•œ API๋ฅผ ํ†ตํ•ด ์›น ๋ธŒ๋ผ์šฐ์ €์™€ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. P8P ์—ฐ๊ฒฐ์„ ์ œ๊ณตํ•˜๊ณ  ๋ฏธ๋””์–ด์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ VP264 ๋ฐ HXNUMX์™€ ๊ฐ™์€ ํ‘œ์ค€ ์ฝ”๋ฑ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ €๋Š” ๊ณ ํ’ˆ์งˆ ๊ทธ๋ž˜ํ”ฝ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ตœ๊ณ ์˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์„ ์ตœ์šฐ์„ ์œผ๋กœ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์†์‹ค์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. Google Stadia์—๋Š” โ€‹โ€‹์„œ๋ฒ„์˜ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ์ถ”๊ฐ€ ๋‹จ๊ณ„๊ฐ€ ์žˆ์œผ๋ฉฐ, ํ”„๋ ˆ์ž„์€ ํ”ผ์–ด์—๊ฒŒ ์ „์†ก๋˜๊ธฐ ์ „์— ๋” ๋†’์€ ํ’ˆ์งˆ๋กœ ์—…์Šค์ผ€์ผ๋ง๋ฉ๋‹ˆ๋‹ค.

    3. ์ง€๋ฆฌ์  ๋ผ์šฐํŒ…์„ ๊ฐ–์ถ˜ ๋ถ„์‚ฐ ์ธํ”„๋ผ
    ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ฝ”๋“œ๊ฐ€ ์•„๋ฌด๋ฆฌ ์ตœ์ ํ™”๋˜์–ด ์žˆ๋”๋ผ๋„ ๋„คํŠธ์›Œํฌ๋Š” ์—ฌ์ „ํžˆ ๋Œ€๊ธฐ ์‹œ๊ฐ„์— ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฐ์ • ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์•„ํ‚คํ…์ฒ˜์—๋Š” ์™•๋ณต ์‹œ๊ฐ„(RTT)์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์„œ๋ฒ„๋ฅผ ํŽ˜์–ด๋งํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„ํ‚คํ…์ฒ˜์—๋Š” ๋ฏธ๊ตญ ์„œ๋ถ€, ๋ฏธ๊ตญ ๋™๋ถ€, ์œ ๋Ÿฝ, ์‹ฑ๊ฐ€ํฌ๋ฅด, ์ค‘๊ตญ ๋“ฑ ์ „ ์„ธ๊ณ„์— ๋ถ„์‚ฐ๋œ 1๊ฐœ์˜ ์ฝ”๋””๋„ค์ดํ„ฐ์™€ ์—ฌ๋Ÿฌ ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋ฒ„๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋ฒ„๋Š” ์™„์ „ํžˆ ๊ฒฉ๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๋„คํŠธ์›Œํฌ์— ์ฐธ์—ฌํ•˜๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ์—์„œ ๋‚˜๊ฐˆ ๋•Œ ์‹œ์Šคํ…œ์€ ๋ฐฐํฌ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์€ ๊ฒฝ์šฐ ์„œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ˆ˜ํ‰์  ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    4. ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ
    ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ตœ์†Œํ•œ์œผ๋กœ ์š”๊ตฌํ•  ๋•Œ ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ํŽธ์•ˆํ•˜๊ฒŒ ๊ฒŒ์ž„์„ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋ฏ€๋กœ ์†Œํ”„ํŠธ์›จ์–ด์™€ ํ•˜๋“œ์›จ์–ด๋ฅผ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ๋˜ํ•œ ๋ชจ๋ฐ”์ผ ๋ฒ„์ „๊ณผ ๋ฐ์Šคํฌํ†ฑ ๋ฒ„์ „ ๊ฐ„์˜ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ WebRTC๋Š” ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž˜ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

    5. ๊ฒŒ์ž„ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์„œ๋น„์Šค์˜ ๋ช…ํ™•ํ•œ ๋ถ„๋ฆฌ
    ๋‚˜๋Š” ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„ ์„œ๋น„์Šค๋ฅผ ํ”Œ๋žซํผ์œผ๋กœ ๋ณธ๋‹ค. ๋ˆ„๊ตฌ๋‚˜ ํ”Œ๋žซํผ์— ๋ฌด์—‡์ด๋“  ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ํ†ตํ•ฉํ–ˆ์–ด์š” LibRetro ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” LibRetro๊ฐ€ SNES, GBA, PS์™€ ๊ฐ™์€ ๋ณต๊ณ ํ’ ๊ฒŒ์ž„์„ ์œ„ํ•œ ์•„๋ฆ„๋‹ค์šด ๊ฒŒ์ž„ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

    6. ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด, ๊ตฐ์ค‘ ํ”Œ๋ ˆ์ด ๋ฐ ๊ฒŒ์ž„๊ณผ์˜ ์™ธ๋ถ€ ์—ฐ๊ฒฐ(๋”ฅ๋งํฌ)์„ ์œ„ํ•œ ๊ณต๊ฐ„
    CloudRetro๋Š” ๋ณต๊ณ ํ’ ๊ฒŒ์ž„์„ ์œ„ํ•œ CrowdPlay ๋ฐ Online MultiPlayer์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์ƒˆ๋กœ์šด ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์—์„œ ๋™์ผํ•œ ๋”ฅ ๋งํฌ๋ฅผ ์—ด๋ฉด ๋™์ผํ•œ ๊ฒŒ์ž„์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฒŒ์ž„์— ์ฐธ์—ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋˜ํ•œ ๊ฒŒ์ž„ ์ƒํƒœ๋Š” ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ์–ธ์ œ๋“ ์ง€ ๋‹ค๋ฅธ ์žฅ์น˜์—์„œ ๊ณ„์† ํ”Œ๋ ˆ์ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    7. ์ˆ˜ํ‰์  ์Šค์ผ€์ผ๋ง
    ์˜ค๋Š˜๋‚ ์˜ ๋ชจ๋“  SAAS์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„๋„ ์ˆ˜ํ‰ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋””๋„ค์ดํ„ฐ-์ž‘์—…์ž ์„ค๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๋งŽ์€ ์ž‘์—…์ž๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋” ๋งŽ์€ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    8. ํ•˜๋‚˜์˜ ํด๋ผ์šฐ๋“œ์— ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์Œ
    CloudRetro์˜ ์ธํ”„๋ผ๋Š” ๋‹ค์–‘ํ•œ ์ง€์—ญ์˜ ๋‹ค์–‘ํ•œ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด(Digital Ocean, Alibaba, ๋งž์ถคํ˜• ์ œ๊ณต์—…์ฒด)์—์„œ ํ˜ธ์ŠคํŒ…๋ฉ๋‹ˆ๋‹ค. ์ธํ”„๋ผ์šฉ Docker ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰์„ ํ™œ์„ฑํ™”ํ•˜๊ณ  bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ์„ค์ •์„ ๊ตฌ์„ฑํ•˜์—ฌ ๋‹จ์ผ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž์— ๊ฐ‡ํžˆ์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ WebRTC์˜ NAT Traversal๊ณผ ๊ฒฐํ•ฉํ•จ์œผ๋กœ์จ ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์€ ๋ฌผ๋ก  ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ ์ปดํ“จํ„ฐ์—๋„ CloudRetro๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๊ฑด์ถ• ์„ค๊ณ„

    ๋…ธ๋™์ž: (๋˜๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋ฒ„)๋Š” ๊ฒŒ์ž„์„ ๋Š˜๋ฆฌ๊ณ , ์ธ์ฝ”๋”ฉ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•˜๊ณ , ์ธ์ฝ”๋”ฉ๋œ ๋ฏธ๋””์–ด๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ŠคํŠธ๋ฆฌ๋ฐํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ž ์ธ์Šคํ„ด์Šค๋Š” ์ „ ์„ธ๊ณ„์— ๋ถ„์‚ฐ๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ฐ ์ž‘์—…์ž๋Š” ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž ์„ธ์…˜์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์กฐ์ •์ž: ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์ž‘์—…์ž์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋””๋„ค์ดํ„ฐ๋Š” WebSocket์„ ํ†ตํ•ด ์ž‘์—…์ž์™€ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.

    ๊ฒŒ์ž„ ์ƒํƒœ ์ €์žฅ: ๋ชจ๋“  ๊ฒŒ์ž„ ์ƒํƒœ์— ๋Œ€ํ•œ ์ค‘์•™ ์›๊ฒฉ ์ €์žฅ์†Œ. ์ด ์ €์žฅ์†Œ๋Š” ์›๊ฒฉ ์ €์žฅ/๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋“ฑ์˜ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    WebRTC์˜ ์˜คํ”ˆ ์†Œ์Šค ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„: p2p, ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด, ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์—†์Œ
    CloudRetro์˜ ์ตœ์ƒ์œ„ ์•„ํ‚คํ…์ฒ˜

    ์‚ฌ์šฉ์ž ์ •์˜ ์Šคํฌ๋ฆฝํŠธ

    ์•„๋ž˜ ๊ทธ๋ฆผ์— ํ‘œ์‹œ๋œ 1๋‹จ๊ณ„์™€ 2๋‹จ๊ณ„์—์„œ ์ƒˆ ์‚ฌ์šฉ์ž๊ฐ€ CloudRetro๋ฅผ ์—ด๋ฉด ์ฒซ ๋ฒˆ์งธ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ž‘์—…์ž ๋ชฉ๋ก๊ณผ ํ•จ๊ป˜ ์ฝ”๋””๋„ค์ดํ„ฐ๊ฐ€ ์š”์ฒญ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ 3๋‹จ๊ณ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋Š” HTTP ํ•‘ ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํ›„๋ณด์— ๋Œ€ํ•œ ์ง€์—ฐ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์ง€์—ฐ ๋ชฉ๋ก์€ ์ฝ”๋””๋„ค์ดํ„ฐ์—๊ฒŒ ๋‹ค์‹œ ์ „์†ก๋˜์–ด ์ฝ”๋””๋„ค์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์ž‘์—…์ž๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ 4๋‹จ๊ณ„์—์„œ๋Š” ๊ฒŒ์ž„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์™€ ํ• ๋‹น๋œ ์ž‘์—…์ž ๊ฐ„์— WebRTC ์ŠคํŠธ๋ฆฌ๋ฐ ์—ฐ๊ฒฐ์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
    WebRTC์˜ ์˜คํ”ˆ ์†Œ์Šค ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„: p2p, ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด, ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์—†์Œ
    ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์–ป์€ ํ›„์˜ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ

    ์ž‘์—…์ž ๋‚ด๋ถ€์—๋Š” ๋ฌด์—‡์ด ์žˆ์Šต๋‹ˆ๊นŒ?

    ๊ฒŒ์ž„ ๋ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ํŒŒ์ดํ”„๋ผ์ธ์€ ์ž‘์—…์ž ๋‚ด๋ถ€์— ๊ฒฉ๋ฆฌ๋˜์–ด ์ €์žฅ๋˜๋ฉฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด ํ†ต์‹ ์€ ๋‹ค์Œ์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. Golang ์ฑ„๋„ ๊ฐ™์€ ๊ณผ์ •์—์„œ. ๋‹ค์Œ ๋ชฉํ‘œ๋Š” ๋ถ„๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ ๊ฒŒ์ž„์„ ๋…๋ฆฝ์ ์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

    WebRTC์˜ ์˜คํ”ˆ ์†Œ์Šค ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„: p2p, ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด, ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์—†์Œ
    ์ž‘์—…์ž ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ƒํ˜ธ ์ž‘์šฉ

    ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ:

    • WebRTC : ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋ฐ›์•„๋“ค์ด๊ณ  ์„œ๋ฒ„์—์„œ ์ธ์ฝ”๋”ฉ๋œ ๋ฏธ๋””์–ด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค.
    • ๊ฒŒ์ž„ ์—๋ฎฌ๋ ˆ์ดํ„ฐ: ๊ฒŒ์ž„ ๊ตฌ์„ฑ ์š”์†Œ. Libretro ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋•๋ถ„์— ์‹œ์Šคํ…œ์€ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ๊ฒŒ์ž„์„ ์‹คํ–‰ํ•˜๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฏธ๋””์–ด ๋ฐ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์„ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ฒŒ์ž„ ๋‚ด ํ”„๋ ˆ์ž„์ด ์บก์ฒ˜๋˜์–ด ์ธ์ฝ”๋”๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฏธ์ง€/์˜ค๋””์˜ค ์ธ์ฝ”๋”: ๋ฏธ๋””์–ด ํ”„๋ ˆ์ž„์„ ๊ฐ€์ ธ์™€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ธ์ฝ”๋”ฉํ•˜๊ณ  ์ธ์ฝ”๋”ฉ๋œ ์ด๋ฏธ์ง€/์˜ค๋””์˜ค๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ธ์ฝ”๋”ฉ ํŒŒ์ดํ”„๋ผ์ธ์ž…๋‹ˆ๋‹ค.

    ะ ะตะฐะปะธะทะฐั†ะธั

    CloudRetro๋Š” WebRTC๋ฅผ ๋ฐฑ๋ณธ ๊ธฐ์ˆ ๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ Golang ๊ตฌํ˜„์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์‚ดํŽด๋ณด๊ธฐ ์ „์— WebRTC ์ž์ฒด์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด XNUMX์ดˆ ๋ฏธ๋งŒ์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋œ ๋†€๋ผ์šด ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

    WebRTC๊ฐ€

    WebRTC๋Š” ๊ฐ„๋‹จํ•œ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๋ชจ๋ฐ”์ผ ์•ฑ ๋ฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ณ ํ’ˆ์งˆ PXNUMXP ์—ฐ๊ฒฐ์„ ์ œ๊ณตํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    NAT ์ˆœํšŒ

    WebRTC๋Š” NAT Traversal ๊ธฐ๋Šฅ์œผ๋กœ ์œ ๋ช…ํ•ฉ๋‹ˆ๋‹ค. WebRTC๋Š” PXNUMXP ํ†ต์‹ ์„ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ชฉํ‘œ๋Š” PXNUMXP ํ†ต์‹ ์„ ์œ„ํ•ด NAT ๊ฒŒ์ดํŠธ์›จ์ด์™€ ๋ฐฉํ™”๋ฒฝ์„ ํ”ผํ•˜๊ณ  ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์ง์ ‘ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ICE. ์ด ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€๋กœ WebRTC API๋Š” STUN ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๊ฐœ IP ์ฃผ์†Œ๋ฅผ ์ฐพ์•„ ์ด๋ฅผ ๋ฆด๋ ˆ์ด ์„œ๋ฒ„(ํšŒ์ „) ์ง์ ‘ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ.

    ๊ทธ๋Ÿฌ๋‚˜ CloudRetro๋Š” ์ด ๊ธฐ๋Šฅ์„ ์™„์ „ํžˆ ํ™œ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. PXNUMXP ์—ฐ๊ฒฐ์€ ์‚ฌ์šฉ์ž ์‚ฌ์ด๊ฐ€ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž์™€ ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„ ์‚ฌ์ด์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ์˜ ์„œ๋ฒ„ ์ธก์€ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์ž ์žฅ์น˜๋ณด๋‹ค ์ง์ ‘ ํ†ต์‹  ์ œํ•œ์ด ์ ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ NAT ๋’ค์— ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์‹  ํฌํŠธ๋ฅผ ๋ฏธ๋ฆฌ ์—ด๊ฑฐ๋‚˜ ๊ณต์šฉ IP ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ด์ „์—๋Š” ์ด ํ”„๋กœ์ ํŠธ๋ฅผ Cloud Gaming์˜ ๊ฒŒ์ž„ ๋ฐฐํฌ ํ”Œ๋žซํผ์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” ๊ฒŒ์ž„ ์ œ์ž‘์ž๊ฐ€ ๊ฒŒ์ž„๊ณผ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž๋Š” ๊ณต๊ธ‰์ž์™€ ์ง์ ‘ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ„์‚ฐ ๋ฐฉ์‹์—์„œ CloudRetro๋Š” ํƒ€์‚ฌ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ผ ๋ฟ์ด๋ฏ€๋กœ ๋” ์ด์ƒ ํ˜ธ์ŠคํŒ…๋˜์ง€ ์•Š์„ ๋•Œ ํ™•์žฅ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ WebRTC NAT Traversal์˜ ์—ญํ• ์€ ํƒ€์‚ฌ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌ์†Œ์Šค์—์„œ PXNUMXP ์—ฐ๊ฒฐ ์ดˆ๊ธฐํ™”๋ฅผ ์ด‰์ง„ํ•˜์—ฌ ์ž‘์„ฑ์ž๊ฐ€ ๋„คํŠธ์›Œํฌ์— ๋” ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

    ๋น„๋””์˜ค ์••์ถ•

    ๋น„๋””์˜ค ์••์ถ•์€ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์—†์–ด์„œ๋Š” ์•ˆ๋  ๋ถ€๋ถ„์ด๋ฉฐ ์›ํ™œํ•œ ํ๋ฆ„์— ํฌ๊ฒŒ ๊ธฐ์—ฌํ•ฉ๋‹ˆ๋‹ค. VP8/H264 ๋น„๋””์˜ค ์ธ์ฝ”๋”ฉ์˜ ๋ชจ๋“  ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์•Œ ํ•„์š”๋Š” ์—†์ง€๋งŒ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋ฉด ์ŠคํŠธ๋ฆฌ๋ฐ ๋น„๋””์˜ค ์†๋„ ์˜ต์…˜์„ ์ดํ•ดํ•˜๊ณ  ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ๋””๋ฒ„๊น…ํ•˜๊ณ  ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์กฐ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค์šฉ ๋น„๋””์˜ค ์••์ถ•์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ด ์ธ์ฝ”๋”ฉ ์‹œ๊ฐ„ + ๋„คํŠธ์›Œํฌ ์ „์†ก ์‹œ๊ฐ„ + ๋””์ฝ”๋”ฉ ์‹œ๊ฐ„์„ ์ตœ๋Œ€ํ•œ ์งง๊ฒŒ ๋ณด์žฅํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฝ”๋”ฉ ํ”„๋กœ์„ธ์Šค๋Š” ์ผ๊ด€๋˜๊ณ  ์—ฐ์†์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ธ์ฝ”๋”ฉ ์žฅ๋‹จ์ ์€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž‘์€ ํŒŒ์ผ ํฌ๊ธฐ ๋ฐ ๋””์ฝ”๋”ฉ ์‹œ๊ฐ„๋ณด๋‹ค ๊ธด ์ธ์ฝ”๋”ฉ ์‹œ๊ฐ„์„ ์„ ํ˜ธํ•˜๊ฑฐ๋‚˜ ์ผ๊ด€๋˜์ง€ ์•Š์€ ์••์ถ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    ๋น„๋””์˜ค ์••์ถ•์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์€ ์‚ฌ์šฉ์ž๊ฐ€ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์˜ ์ •ํ™•๋„๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ถˆํ•„์š”ํ•œ ์ •๋ณด ๋น„ํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ •์  ์ด๋ฏธ์ง€ ํ”„๋ ˆ์ž„์„ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ด์ „ ํ”„๋ ˆ์ž„๊ณผ ๋‹ค์Œ ํ”„๋ ˆ์ž„์—์„œ ํ˜„์žฌ ํ”„๋ ˆ์ž„์„ ์ถ”๋ก ํ•˜๋ฏ€๋กœ ์ฐจ์ด์ ๋งŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. Pacman์˜ ์˜ˆ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์ฐจ๋“ฑ ํฌ์ธํŠธ๋งŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

    WebRTC์˜ ์˜คํ”ˆ ์†Œ์Šค ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„: p2p, ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด, ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์—†์Œ
    Pacman์„ ์˜ˆ๋กœ ์‚ฌ์šฉํ•œ ๋น„๋””์˜ค ํ”„๋ ˆ์ž„ ๋น„๊ต

    ์˜ค๋””์˜ค ์••์ถ•

    ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์˜ค๋””์˜ค ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ์‚ฌ๋žŒ์ด ์ธ์ง€ํ•  ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค. Opus๋Š” ํ˜„์žฌ ๊ฐ€์žฅ ์„ฑ๋Šฅ์ด ์ข‹์€ ์˜ค๋””์˜ค ์ฝ”๋ฑ์ž…๋‹ˆ๋‹ค. RTP(Real Time Transport Protocol)์™€ ๊ฐ™์€ ์ฃผ๋ฌธ๋œ ๋ฐ์ดํ„ฐ๊ทธ๋žจ ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ์˜ค๋””์˜ค ์›จ์ด๋ธŒ๋ฅผ ์ „์†กํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. mp3๋‚˜ aac๋ณด๋‹ค ์ง€์—ฐ ์‹œ๊ฐ„์€ ๋‚ฎ๊ณ  ํ’ˆ์งˆ์€ ๋” ๋†’์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ ์‹œ๊ฐ„์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์•ฝ 5~66,5ms์ž…๋‹ˆ๋‹ค.

    Pion, Golang์˜ WebRTC

    ํ”ผ์˜จ WebRTC๋ฅผ Golang์— ๋„์ž…ํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ C++ WebRTC ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ๋ฐ˜์ ์ธ ๋ž˜ํ•‘ ๋Œ€์‹  Pion์€ ๋” ๋‚˜์€ ์„ฑ๋Šฅ, Go ํ†ตํ•ฉ ๋ฐ WebRTC ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•œ ๋ฒ„์ „ ์ œ์–ด๋ฅผ ๊ฐ–์ถ˜ WebRTC์˜ ๋„ค์ดํ‹ฐ๋ธŒ Golang ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.

    ๋˜ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด XNUMX์ดˆ ๋ฏธ๋งŒ์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์œผ๋กœ ๋‹ค์–‘ํ•œ ๋‚ด์žฅ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. STUN, DTLS, SCTP ๋“ฑ์˜ ์ž์ฒด ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค. QUIC ๋ฐ WebAssembly๋ฅผ ์‚ฌ์šฉํ•œ ๋ช‡ ๊ฐ€์ง€ ์‹คํ—˜. ์ด ์˜คํ”ˆ ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด๋Š” ํ›Œ๋ฅญํ•œ ๋ฌธ์„œ, ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ ๊ตฌํ˜„ ๋ฐ ๋ฉ‹์ง„ ์˜ˆ์ œ๋ฅผ ๊ฐ–์ถ˜ ์ •๋ง ํ›Œ๋ฅญํ•œ ํ•™์Šต ๋ฆฌ์†Œ์Šค์ž…๋‹ˆ๋‹ค.

    ๋งค์šฐ ์—ด์ •์ ์ธ ์ œ์ž‘์ž๊ฐ€ ์ด๋„๋Š” Pion ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” WebRTC์— ๊ด€ํ•ด ๋งŽ์€ ์–‘์งˆ์˜ ํ† ๋ก ์ด ์ง„ํ–‰๋˜๋ฉด์„œ ๋งค์šฐ ํ™œ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์ฐธ์—ฌํ•˜์„ธ์š”. http://pion.ly/slack โ€“ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋งŽ์ด ๋ฐฐ์šฐ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    Golang์—์„œ CloudRetro ์ž‘์„ฑ

    WebRTC์˜ ์˜คํ”ˆ ์†Œ์Šค ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„: p2p, ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด, ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์—†์Œ
    Go์—์„œ ์ž‘์—…์ž ๊ตฌํ˜„

    Go ์ฑ„๋„ ์‹คํ–‰

    Go์˜ ์•„๋ฆ„๋‹ค์šด ์ฑ„๋„ ๋””์ž์ธ ๋•๋ถ„์— ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ์™€ ๊ฐ™์ด ๋‹ค์–‘ํ•œ GoRoutine์—๋Š” ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ฑ„๋„์„ ํ†ตํ•ด ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค. 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 ๋ฐ ๋‹ค์ค‘ ํ”Œ๋ ˆ์ด์–ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์™„๋ฒฝํ•˜๊ฒŒ ๋“ค์–ด๋งž์Šต๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์— ๋”ฐ๋ผ ํ•œ ๋ฐฉ์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ž…๋ ฅ์€ ์ค‘์•™ ์ž…๊ตฌ ์ฑ„๋„์— ๋‚ด์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฒŒ์ž„ ๋ฏธ๋””์–ด๊ฐ€ ๊ฐ™์€ ๋ฐฉ์— ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์—ฌ๋Ÿฌ ๊ฒŒ์ž„ ์„ธ์…˜ ๊ฐ„์— ๊ฒŒ์ž„ ์ƒํƒœ๋ฅผ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค.

    WebRTC์˜ ์˜คํ”ˆ ์†Œ์Šค ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„: p2p, ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด, ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์—†์Œ
    ์„œ๋กœ ๋‹ค๋ฅธ ์„ธ์…˜ ๊ฐ„์˜ ๋™๊ธฐํ™”

    Golang์˜ ๋‹จ์ 

    Golang์€ ์™„๋ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฑ„๋„์ด ๋Š๋ฆฝ๋‹ˆ๋‹ค. ์ฐจ๋‹จ์— ๋น„ํ•ด Go ์ฑ„๋„์€ ๋‹จ์ˆœํžˆ ๋™์‹œ ๋ฐ ์Šค๋ ˆ๋“œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์ฑ„๋„์€ ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฑ„๋„ ์•„๋ž˜์—๋Š” ๋ณต์žกํ•œ ์ฐจ๋‹จ ๋…ผ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ฑ„๋„์„ ๊ต์ฒดํ•  ๋•Œ ์ž ๊ธˆ ๋ฐ ์›์ž ๊ฐ’์„ ๋‹ค์‹œ ์ ์šฉํ•˜์—ฌ ๊ตฌํ˜„์„ ์ผ๋ถ€ ์กฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

    ๋˜ํ•œ Golang์˜ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๊ฐ€ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์•„ ์˜์‹ฌ์Šค๋Ÿฌ์šธ ์ •๋„๋กœ ๊ธด ์ผ์‹œ ์ค‘์ง€๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํฌ๊ฒŒ ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค.

    ์žฅ๋ถ€

    ์ด ํ”„๋กœ์ ํŠธ๋Š” ๋ฏธ๋””์–ด ์••์ถ•์„ ์œ„ํ•ด ๊ธฐ์กด ์˜คํ”ˆ ์†Œ์Šค Golang VP8/H264 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ฒŒ์ž„ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์œ„ํ•ด Libretro๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ชจ๋‘ Go์—์„œ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜๋Š” C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‹จ์ˆœํ•œ ๋ž˜ํผ์ž…๋‹ˆ๋‹ค. ์žฅ๋ถ€. ๋‹จ์  ์ค‘ ์ผ๋ถ€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. Dave Cheney์˜ ์ด ๊ฒŒ์‹œ๋ฌผ. ๋‚ด๊ฐ€ ๊ฒช์€ ๋ฌธ์ œ:

    • Golang RecoveryCrash๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ CGO์—์„œ ์ถฉ๋Œ์„ ํฌ์ฐฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • CGO์—์„œ ์„ธ๋ถ€์ ์ธ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์—†์„ ๋•Œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์‹๋ณ„ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ.

    ๊ฒฐ๋ก 

    ์ €๋Š” ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„ ์„œ๋น„์Šค๋ฅผ ์ดํ•ดํ•˜๊ณ  ์˜จ๋ผ์ธ์—์„œ ์นœ๊ตฌ๋“ค๊ณผ ํ–ฅ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ค๋Š” ๋ณต๊ณ ํ’ ๊ฒŒ์ž„์„ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ์„ ๋งŒ๋“ค๊ฒ ๋‹ค๋Š” ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” Pion ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ Pion ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ง€์›์ด ์—†์—ˆ๋‹ค๋ฉด ๋ถˆ๊ฐ€๋Šฅํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง‘์ค‘์ ์ธ ๊ฐœ๋ฐœ์— ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. WebRTC์™€ Pion์ด ์ œ๊ณตํ•˜๋Š” ๊ฐ„๋‹จํ•œ API๋Š” ์›ํ™œํ•œ ํ†ตํ•ฉ์„ ๋ณด์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. P2P(Peer-to-Peer) ํ†ต์‹ ์— ๋Œ€ํ•œ ์‚ฌ์ „ ์ง€์‹์ด ์—†์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ ๊ฐœ๋… ์ฆ๋ช…์ด ๊ฐ™์€ ์ฃผ์— ๋ฐœํ‘œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    ํ†ตํ•ฉ์ด ์šฉ์ดํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  P2P ์ŠคํŠธ๋ฆฌ๋ฐ์€ ์‹ค์ œ๋กœ ์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ ๋งค์šฐ ๋ณต์žกํ•œ ์˜์—ญ์ž…๋‹ˆ๋‹ค. ๊ทธ๋…€๋Š” P2P ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด IP ๋ฐ NAT์™€ ๊ฐ™์€ ์˜ค๋žœ ๋„คํŠธ์›Œํฌ ์•„ํ‚คํ…์ฒ˜์˜ ๋ณต์žก์„ฑ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋„คํŠธ์›Œํ‚น ๋ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋Œ€ํ•œ ๊ท€์ค‘ํ•œ ์ง€์‹์„ ๋งŽ์ด ์–ป์—ˆ์œผ๋ฏ€๋กœ ๋ชจ๋“  ์‚ฌ๋žŒ์ด WebRTC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PXNUMXP ์ œํ’ˆ์„ ๊ตฌ์ถ•ํ•ด ๋ณด๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

    CloudRetro๋Š” ๋ ˆํŠธ๋กœ ๊ฒŒ์ด๋จธ๋กœ์„œ์˜ ๊ด€์ ์—์„œ ๊ธฐ๋Œ€ํ–ˆ๋˜ ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ์—๋Š” ๋„คํŠธ์›Œํฌ์˜ ์•ˆ์ •์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ๋”์šฑ ํ–ฅ์ƒ์‹œํ‚ค๊ณ , ๋” ๋†’์€ ํ’ˆ์งˆ์˜ ๊ฒŒ์ž„ ๊ทธ๋ž˜ํ”ฝ์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž ๊ฐ„ ๊ฒŒ์ž„์„ ๊ณต์œ ํ•˜๋Š” ๊ธฐ๋Šฅ ๋“ฑ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์ด ๋งŽ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์— ์—ด์‹ฌํžˆ ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ”๋กœ์šฐํ•ด์ฃผ์„ธ์š” ํ”„๋กœ์ ํŠธ ๊ทธ๋ฆฌ๊ณ  ๋งˆ์Œ์— ๋“ค๋ฉด ์ง€์›ํ•˜์„ธ์š”.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€