여전히 멀티 플레이어 구현 강의를 듣고 있다.
직장과 공부를 병행하는 건 너무 힘든 것 같다.
그래도 거의 다 들었다!
오늘은 클라이언트 예측에 대해 배운 걸 정리해보겠다.
리슨 서버로 멀티 플레이어를 구현해보는 강의므로 클라이언트 예측에 관련된 강의도 구성되어있다.
클라이언트가 어떤 행동을 취하길 원하면 그에 따른 패킷을 보낸다. 조준을 예시로 들어보자. 클라이언트가 우클릭을 입력하면 '나 조준시켜주세요' 하고 서버에 요청한다. 서버는 그 패킷을 받아 자신을 포함한(리슨 서버니까) 모든 클라이언트들에게 다시 패킷을 뿌려준다. 그럼 패킷을 보냈던 클라이언트의 캐릭터가 조준하는 모습을 모두가 보게 된다.
왜 이렇게 할까?
'검증' 때문이다. 언리얼에선 HasAuthority()로 어떤 액터에 대해 누가 권한을 갖고 있는지 쉽게 확인할 수 있다. 권한이 없는데도 조준, 장전, 사격 등이 가능하게 만들면 클라이언트를 해킹해 게임 플레이에 쉽게 영향을 줄 수 있고, 이는 혼란을 야기한다. 말도 안 되는 데미지를 한 번에 준다던가 하는 문제 말이다. 검증이 잘되어있다면 클라이언트를 해킹하는 데에 성공해도 게임 플레이에 영향을 줄 수 없다. 결국 데미지를 주거나 캐릭터를 사망시켜 그 결과를 다른 클라이언트들에게 표현시켜주는 건 서버기 때문이다. 하지만 이 방법은 치명적인 문제가 있다. 바로 조작의 반응성으로 인한 불편함이다. 핑이 100이라면, 클라이언트는 입력 후 최소 0.1초 이후에 반응하게 된다.
이런 쉣!
다들 접게 생겼다.
그래서 등장한 게 클라이언트 예측이다.
클라이언트는 입력 즉시 자신의 캐릭터를 조준하게 만든 뒤 서버에 요청한다. 그럼 서버는 그 요청을 받아 다른 클라이언트들에게 뿌려준다. 이러면 조작의 딜레이도 없고, 서버가 검증도 가능하다. 한 가지 문제가 있을 수 있는데, 그건 자신이 보낸 패킷이 되돌아오면서 생기는 문제다. 예를 들어 조준을 '따닥' 입력하면 조준이 된 뒤 즉시 풀리는데, 서버를 다녀온 '조준시켜주세요'와 '조준 풀게 해주세요'가 다시 조준을 '따닥' 하게 만든다. 그래서 패킷을 보낸 클라이언트는 스킵하거나, 받았을 때 적절히 조치해야 한다.
(위 그림은 1번의 입력으로 2번의 조작이 나타나는 이유)
강의 막바지에 이런 개념을 학습한다. 그런데!!!
https://velog.io/@jiyunkim/RPC-Remote-Procedure-Call
난 이미 구현해놨다.
클라이언트 예측이라는 걸 모르는 상태였는데도 구현해냈다!
사실 이미 개발자로 근무 중인데도 이걸 몰랐다는 게 부끄럽지만.. 그래도 개념 자체는 알고 있었다. 용어를 몰랐을 뿐. 강의가 알려주기 전에 구현에 성공했다는 것도 나름 뿌듯하다.