경일 메타버스 20220715 15주차 5일 수업내용. 멀티플레이어 게임 이론, 유니티 애니메이션
로컬 멀티플레이어 게임
초기 네트워크 멀티플레이어 게임
MUD
LAN 게임
온라인 게임
MMO 게임
모바일 네트워크 게임
여러 컴퓨터가 네트워크 상 연결되어 있는 양태를 말한다.
즉, 컴퓨터끼리 어떻게 연결시킬 건지를 말하는 것이다.
이론 상으로는 버스형, 링형 등 여러가지가 있지만 여기서는 온라인 게임에서 쓰이는 토폴로지만 알아본다.
클라이언트-서버(Client-Server)
가장 대중적인 구조로 CS 구조라고 불린다.
하나의 컴퓨터에 여러 컴퓨터가 접속하는 방식이다.
토폴로지로서는 성형, Star형이다.
권한 집중형(Authoritative)으로 서버라고 불리는 컴퓨터가 모든 행동에 대한 판정을 내린다.
데디케이티드 서버(Dedicated Server)와 리스닝 서버(Listening Server)가 있다.
데디케이티드 서버(Dedicated Server) :
게임 서비스를 제공하는 업체가 고성능의 컴퓨터를 이용해 서비스를 하는 방식
리스닝 서버(Listening Server) :
플레이어가 게임에서 제공하는 프로그램을 이용해 직접 서비스하는 방식.
리스닝 서버는 피어 호스팅(Peer Hosting)이라고도 한다.
피어 투 피어(Peer To Peer)
P2P라고도 한다. 게임에 참여하는 모든 컴퓨터끼리 서로 접속하는 방식이다.
토폴로지로서는 Fully Connected이다.
CS와 달리 판정 권한이 어디 있는지 불분명하며, 보편적으로 각 피어마다 입력을 서로 공유해 각자가 이들 입력을 스스로 시뮬레이션 한다.
→ 락스텝(Lock Step) 동기화 알고리즘
모든 연산을 서버가 부담
가장 고전적인 방법으로 클라이언트는 단순히 입력 전달과 화면 출력만 하고, 서버에서 게임 로직 연산, 화면 렌더링, 송출까지 하는 방법
예전 MUD형 게임에서 주로 했던 방식인데, 요즘 게임은 그래픽 품질이 매우 높아 비용이 비싸므로 최근까지만 하더라도 사용하지 않았다.
하지만 기술이 발전하면서 스테디아, 지포스 나우 등 클라우드 게이밍으로 재탄생 하게 되었다.
렌더링을 클라이언트에서 하기
가장 보편적인 방법으로 서버가 클라이언트에 게임 월드 상태를 보내어 렌더링하게 하는 것이다.
채팅이나 캐릭터 이동 같은 게임 월드의 업데이트는 서버가 클라이언트로부터 메시지를 받아 진행한다.
이상적인 건 게임이 목표한 프레임률만큼 업데이트를 하는 것이겠지만 네트워크란 것이 워낙 변수가 많으므로 그렇게 하기란 쉽지 않다.
그래서 업데이트 주기를 늘리게 되는데, 이를 플레이어가 못 느끼게 하기 위해 추측항법(Dead Reckonning)과 같은 레이턴시 마스킹(Latency Masking)을 이용하거나 플레이어 가시 영역 부분만을 전달하거나 락스텝(Lockstep) 동기화 같은 여러 방법을 사용하게 된다.
객체의 상태를 한 호스트에서 다른 호스트로 복제, 전달하는 행위
리플리케이션을 위해선 먼저 직렬화를 해야한다.
직렬화(Serialize) :
서로 다른 컴퓨터 간에 데이터 전송을 위한 기법으로 데이터를 일련의 바이트열로 바꾸는 것을 말한다.
얼핏 생각하면 그냥 메모리 그대로 보내주면 되는 것 아닌가 싶지만, 데이터가 다른 메모리 주소인 경우나 긴 데이터를 압축하기 위해서도 필요하다.
직렬화에는 보통 json 형식이 많이 쓰이며, 구글이 만든 프로토콜 버퍼 라이브러리도 많이 사용된다.
RPC(Remote Procedure Call) :
객체의 메소드를 호출할 때 사용한다.
다른 호스트의 특정 프로시저가 원격 수행되도록 지시하는 것을 말한다.
이를 엄밀하게 RMI(Remote Method Invocation)으로 구분하기도 한다.
자료 : https://docs.google.com/document/d/1a8TbfG0FoSqat8b58ZkQ_QC8O03oTz2-g8j4kupZwYo/edit#
애니메이션 클립 :
실제로 어떤 이미지를 얼마나 재생할지 결정
애니메이터 :
애니메이션을 언제 전환할지 결정 → 관리자