클라우드 게이밍이란? 서버에서 만들어진 그래픽을 보면서 게이머는 게임을 할 수 있는 방식이다.
넷플릭스처럼 vod 장치나 블루레이 디스크 없이도 영화나 드라마를 볼 수 있는 방식이랑 비슷해서 게임기랑 게임 소프트웨어 없이도 게임을 스마트폰, 데스크탑 등 클라우드 게이밍 소프트웨어가 허용하는 어느 장치에서든 게임을 돌릴 수 있다는 것이 장점이다.
대표적으로 엑박 클라우드 게이밍이 있다.
다른 점이 있다면, 넷플릭스에서 영상 쏴줄 때 처럼 스토리지에 있는 영상 데이터만 딸깍하고 보내는 것이 아닌
서버에서 돌아가는 게임의 화면을 직접 찍어 보내고 심지어 사용자가 보내는 입력 값도 계속해서 처리해야 한다는 점에서 리소스를 보다 많이 소모한다는 점에서 비용이 많이 들 것이다.
내가 생각한 구조
1. 유저가 처음 접속하면 컨테이너를 생성함
2. ws로 컨테이너 - 영상 -> 유저 - 키 -> 컨테이너
3. 유저가 떠나면 컨테이너에 저장한 데이터를 받아서 DB나 스토리지에 저장하고 컨테이너 삭제
4. 다시 접속할 경우 해당 데이터를 기반으로 컨테이너를 생성함.
필요한 것들을 나열해 보겠다.
요즘 게임들을 보면 최적화는 거지같이 되어있는 데 높은 사양을 요구하는 것들이 많아 졌다.
그래서 게이머들은 기본적으로 좋은 사양을 가진 기기를 가지는 것이 필수가 되었다.
하지만 이는 모든 게임이 다 적용되는 사항은 아니다.
최적화가 잘 되어 있어 그 만한 리소스가 없어도 되는 게임이 있을 경우에는 운영하는 입장에선 과자 하나 포장하는 데 비싼 상자에 포장하는 격이다. 굳이 필요 없는 데 같이 쓸 없다.
서비스하는 데에 있어서 게임마다 최적화 해서 컨테이너를 사용하는 방식이면 리소스를 아낄 수 있을 것이다.
추가로 게임을 구동하고 있을 때에만 컨테이너를 사용하는 방식이면 더 아낄 수 있다.
게이머마다 환경을 맞춰야 한다.
요금제: 기간제로 사용하고 있는지, 가입되어 있는 지, 다른 회사와 제휴하는 상품을 사용하는지, 특정 플랫폼에서만 사용 가능한 요금제인지 구분해야 한다.
시간: 게이머가 언제 게임을 하고 있느냐에 따라서 게임의 진행이 달라지는 경우도 있기에 게이머의 시간대를 가져와 구동해야 한다.
언어: 게이머가 주로 어떤 언어로 게임을 즐기는 지, 만약 정발이 되어 있지 않다면 대체 언어로 어떤 언어를 사용해야 하는 지 알아야 한다.
게임 진행 사항 저장: 요즘 게임들은 세이브 & 로드가 기본이다. 보통이라면 기기에 저장을 하겠지만 지금은 할 수 없다. 진행 사항은 DB나 스토리지에 저장하고, 게임을 구동할 때마다 거기에서 데이터를 가져와야 한다.
게임 버전: 완성된 것이 아닌 중간 중간 패치를 하는 게임의 경우 호환이 되지 않는 경우도 있으므로 한 번쯤은 고려 해야 한다. 대부분은 게임사에서 패치를 하기 전 신중하게 해서 딱히 필요 없을 지도 모른다.
이러한 환경을 vm으로 실행하게 된다면 이러한 모든 요소를 운영체제를 세팅하고 필요한 라이브러리를 불러오고 하는 시간이 꽤나 오래 걸리므로 컨테이너를 활용하는 게 훨씬 낫다.
서버에서 죽어라 게임을 구동하면 뭐하나 안 보이면 게임을 못하는 데.
서버에서 만들어진 그래픽을 클라이언트에게 보여주고 클라이언트의 입력을 전달할 어플리케이션이 필요하다.
어플리케이션에서 가장 먼저 계정 만들고 로그인하는 건 너무 기초적이니 넘어가고
어떻게 그래픽을 처리하고 입력을 받아들일 건지 결정해야 한다.
https://www.youtube.com/watch?v=7AMRfNKwuYo (How Does Live Streaming Platform Work? (YouTube live, Twitch, TikTok Live) 에서 가져옴
기초적으로는 컨테이너에서 만들어진 그래픽을 인코딩해서 뿌리고 클라이언트 앱에서 디코딩해 그래픽을 보여주는 식이다.
문제는 게임은 속도가 중요하다.
컨테이너에서 어떻게든 그래픽을 만드는 속도를 늘릴 수는 있지만 클라이언트가 제 시간 안에 게임을 받지 못하면 최악의 경험이 만들어 질 것이다.
최고의 환경을 만들기 위해서,
네트워크 인프라를 최고의 환경으로 구축해 놓는 것이 필수적일 것이고, 빠르게 전달할 수 있는 프로토콜도 필요하다.
가장 빠르고 안정적인 프로토콜에서는 SRT 프로토콜이 있다.
srt는 h.264나 h.265로 인코딩해 인터넷을 통해 전송하고 버퍼를 통해 디코딩해 영상을 보여주는 방식이다.
장점으로는 저렴하고 대륙간 전송에서 1.5초가 될 정도로 빠르다.
사용하기 위해서는 영상 품질을 유지해주는 인코더의 성능이 중요하다.
우리는 ZOOM을 통해 실시간으로 화면을 공유할 수 있다는 것을 알고 있다.
컨테이너 하나가 입력을 받아 게임을 구동시키고 영상을 처리할 수 있는 프로토콜을 알았다.
운영하는 입장에서 수 백만 대의 컨테이너가 수 백만 개의 유저의 요청을 일일히 구분한다면 컨테이너의 성능이 안 좋아 질 것은 물론, 사용자 경험은 최악이 될 것이다.
컨테이너가 본질의 능력을 발휘할 수 있도록
한 컨테이너와 한 유저를 연결하는 중개 서버를 하나 두는 것이 성능 향상과 비용 절감을 얻을 수 있을 것이다.
인터넷으로 중개를 해주는 프로토콜인 Websocket(이하 ws)를 사용해 유저와 컨테이너간 연결을 유지 해보면 어떨까?
컨테이너를 생성할 때와 삭제할 때도 ws 쓰면 세이브 & 로드 기능을 사용할 수 있을 것 같았다.
물론 연결을 계속해서 유지시키는 방법이 ws 뿐만은 아니지만 내가 잘 아는 게 ws 밖에 없어서 ws 기준으로 설명을 하겠다.
1. 클라이언트는 ws 서버를 사용해 컨테이너 생성 요청한다. (OPEN)
1. 서버는 저장된 데이터를 기반으로 컨테이너를 생성하거나 없으면 초기 상태로 컨테이너를 생성하고 유저와 클라이언트를 연결한다.
2. 연결 중인 동안 클라이언트는 컨테이너로 키 입력을, 컨테이너는 인코딩 영상을 계속해서 보낸다.
3. 클라이언트가 ws 서버와 연결을 종료한다. (CLOSE)
1. 서버는 컨테이너에게 저장한 데이터를 가져와 DB 또는 스토리지에 데이터를 저장하고 컨테이너를 종료한다.
이런 방법으로 중개 서버로 1:1로 매칭 시켜준다면 컨테이너와 클라이언트는 필터링할 리소스가 필요 없어질 것이다.
이제 수 백만 개의 컨테이너와 수 백만 개의 클라이언트 어플리케이션이 중개 서버와 연결이 되었다.
사람이 많이 모이면 5명 중 한 명은 쓰레기가 있는 법
유저들의 정보와 게임을 조작할 쓰레기 해커가 나타났다.
이 해커는 기존 사용자로 위장해 온라인 게임의 재화를 가져와서 쌀먹을 할 예정이다.
이런 피해를 막기 위해 중개 서버를 운영하는 입장에서는 보안은 굉장히 신경써야 한다.
데이터 암호화를 꼼꼼히 해서 이러한 일이 없도록 하자.
이렇게 클라우드 게이밍이 어떻게 동작해야 하는 지 알아봤다.
관련 블로그가 있더라도 정보가 너무 부족해서 스스로 여러 방법을 찾아보았다.
나름 공부도 되고 배경도 알게 되고 삽질도 하고 보다 잘 알 수 있게 되어서 괜찮은 경험이었다.
엑박 사랑해요 근데 기술 블로그는 좀 올려주세요 돈도 잘 버는 데
https://www.youtube.com/watch?v=7AMRfNKwuYo
https://www.youtube.com/watch?v=2BkTLnHvH_g
https://www.youtube.com/watch?v=5EhsjtBE7I4