본문 바로가기
프로그래밍/서버

온라인 게임의 이동처리 기법 - 데드 레커닝 2편 (보간 처리)

by 힝고니 2023. 6. 10.

지난번 글에서 데드 레커닝에 대한 개념에 대해 알아보았습니다.

2010.11.05 - [프로그래밍/서버] - 온라인 게임의 이동처리 기법 - 데드 레커닝

무려 13년 전쯤(...) 작성했던 글인데요

생각보다 읽어보신 분들이 많고 다음 글을 기다리시는 분들도 계셨는데

당시에 글을 작성하고 티스토리를 안하게 되는 바람에 이제서야 보게 되었습니다 ㅡㅡ;;;

 

게임 서버 프로그래머로 오래 일하다가 현재는 게임 업계를 떠나 웹 백엔드 개발자로 현업에 종사하고 있지만

지난 글에 관심을 가져주신 분들께 감사하는 마음에 오랜만에 기억을 떠올려 글을 작성해보겠습니다.

(게임쪽을 떠난지도 시간이 좀 되는지라 요즘 어떤 더 좋은 방법들이 쓰일 수 있는 점 참고 바랍니다.)

 

그럼 이번 글에서는 데드 레커닝 처리시 서버와 클라이언트의 캐릭터 위치가 조금씩 달라지는 문제에 대해 어떻게 처리해야 할지 알아보겠습니다.

 

 

보간 처리란?

게임에서 보간 처리(interpolation)는 주로 네트워크 지연을 해결하거나 더 매끄러운 애니메이션을 구현하기 위해 사용됩니다.

데드 레커닝 알고리즘을 사용하면 서버는 클라이언트가 보내는 이동 정보를 기반으로 각 플레이어의 미래의 위치를 예측합니다.

하지만 클라이언트의 변경된 행동을 서버가 인지하는데 무조건 지연 시간이 발생하므로 예측은 완벽하지 않기 때문에 예측치와 실제 위치 사이의 차이를 처리해야 합니다. 이 때 사용되는 것이 보간 처리입니다.

예를 들어, 서버는 플레이어 A가 현재 위치에서 일정한 방향과 속도로 움직일 것으로 예측할 수 있습니다.

그런데 예측과 실제 움직임 사이에 차이가 발생하면 사용자에게 최대한 자연스럽게 보일 수 있도록 보정하게 됩니다.

이 보정 과정이 바로 보간 처리입니다.

 

 

보간 처리의 종류

선형 보간

가장 간단한 형태의 보간 처리는 선형 보간(linear interpolation, 또는 lerp)입니다.

선형 보간은 두 점 사이의 어떤 중간 점을 계산하는 방법으로 각 축에 대한 비율을 사용합니다.

만약 두 점 A와 B 사이에서 중간 점을 찾으려면 다음과 같이 계산할 수 있습니다:

P = A + (B - A) * t

여기서 t는 0과 1 사이의 값으로, A와 B 사이의 비율을 나타냅니다.

t가 0이면 A를, 1이면 B를 반환합니다.

t가 0.5이면 A와 B 사이의 정중앙 지점을 반환합니다.

이러한 선형 보간은 간단하고 효율적이지만, 속도 변화나 방향 변화 등이 자연스럽지 않을 수 있습니다.

 

고차 보간법?

선형 보간으로 처리하였을 때의 결과가 아쉽다면, 스플라인 보간(spline interpolation)이나 베지어 곡선(Bezier curve)과 같은 고급 보간 기법을 사용할 수 있습니다. 이러한 기법은 선형 보간에 비해 움직임이 더 부드럽고 자연스럽게 보이도록 해줍니다. 다만 두 가지 방법 모두 계산 비용도 더 많이 든다는 단점이 있습니다.

베지어 곡선은 정의된 제어점의 수에 따라 차수가 결정됩니다. 제어점이 적으면(예: 2차 또는 3차 베지어 곡선), 계산 비용은 상대적으로 낮을 수 있습니다. 그러나 제어점이 많아질수록(즉, 차수가 높아질수록) 계산 비용은 급격히 증가하게 됩니다.

반면 스플라인 보간의 계산 비용은 사용하는 스플라인의 유형에 따라 다릅니다. 예를 들어 3차 스플라인 보간은 각 구간에 대해 3차 다항식을 계산해야 하므로 보간하려는 점의 수가 많을수록 계산 비용이 높아집니다.

일반적으로 두 방법 모두 선형 보간에 비해 움직임이 더 자연스럽지만 그 대가로 계산 비용이 더 높다는 점을 기억해야 합니다.

 

 

보간 처리를 어떻게 적용하지?

보간 처리를 통해 구한 값을 게임 캐릭터의 움직임에 적용하는 방법은 클라이언트 측에서 보간을 수행하는 방법과 서버 측에서 보간을 수행하는 방법이 있습니다.


1. 클라이언트 측에서 보간을 수행하는 경우


클라이언트 측에서 보간을 수행하는 경우 서버는 단순히 게임 상태의 업데이트를 주기적으로 클라이언트에게 보냅니다.

그리고 클라이언트는 이 업데이트를 기반으로 보간을 수행하여 캐릭터의 위치를 계산합니다.

예를 들어 선형 보간의 경우, 클라이언트는 두 시점 사이의 캐릭터 위치를 보간하여 캐릭터의 현재 위치를 결정합니다.


2. 서버 측에서 보간을 수행하는 경우


서버 측에서 보간을 수행하는 경우 서버는 클라이언트의 입력을 받아 게임 상태를 업데이트하, 이 업데이트된 게임 상태를 보간하여 캐릭터의 위치를 결정합니다.

그런 다음 서버는 이 보간된 캐릭터 위치를 클라이언트에게 보냅니다.

클라이언트는 이 위치 정보를 사용하여 캐릭터를 그립니다.


보간을 수행하는 위치(클라이언트 또는 서버)는 여러 요인에 따라 달라집니다.

예를 들어 네트워크 대기 시간이 긴 경우 클라이언트 측에서 보간을 수행하는 것이 더 효과적일 수 있습니다.

그러나 이 경우 클라이언트 간의 동기화가 문제가 될 수 있습니다.

반면에 네트워크 대기 시간이 짧고 서버의 처리 능력이 충분한 경우 서버 측에서 보간을 수행하는 것이 더 효과적일 수 있습니다.

그러나 이 경우는 서버의 부하가 증가할 수 있습니다.

일반적으로 실시간 온라인 게임에서는 클라이언트 측에서 보간을 수행하는 것이 더 일반적입니다.

이 방법은 네트워크 대기 시간의 영향을 최소화하고 클라이언트의 프레임레이트를 최대한 유지할 수 있습니다.

 

*제가 FPS 게임을 개발했을때는 데디케이트 서버에서 브로드캐스팅하는 udp 패킷에 항상 캐릭터들의 포지션 정보가 들어있는 업데이트 데이터를 포함했고 그걸 토대로 클라이언트에서 보간 처리 하였습니다.

(업데이트 데이터가 일정 시간동안 브로드캐스팅이 안되었다면 업데이트 데이터용 패킷을 만들어해서 브로드캐스팅 하여 동기화 하였음)

 

 

결론

여러 고려사항들을 통해 개발자 자신의 상황마다 어떤 방법이 가장 적합한지 고민해야 합니다.

어떠한 정답이 있다기보다 상황에 맞춰서 가장 효과적인 답안을 찾아 가시기 바랍니다.

'프로그래밍 > 서버' 카테고리의 다른 글

온라인 게임의 이동처리 기법 - 데드 레커닝  (2) 2010.11.05