본문 바로가기
카테고리 없음

메모용 - 240126

by 보안매크로 2024. 1. 26.
728x90

네트워크 지연 또는 레이턴시(Latency)를 다루기 위해 클라이언트 측에서 보간(Interpolation)과 예측(Prediction)을 사용하는 것은 네트워크 게임에서 매우 중요한 부분입니다. 이러한 기술들은 게임플레이가 자연스럽게 느껴지도록 하는 데 필수적입니다.

보간 (Interpolation)

보간은 이전 프레임과 현재 프레임 사이의 움직임을 부드럽게 연결하는 기술입니다. 예를 들어, 서버에서 전송된 두 위치 사이에서 클라이언트는 이전 위치에서 새 위치로 부드럽게 전환되는 애니메이션을 보여주어야 합니다.

cppCopy code
// 이전 위치와 새 위치 간의 보간 FVector InterpolatedLocation = FMath::Lerp(PreviousLocation, NewLocation, Alpha); // 이전 회전과 새 회전 간의 보간 FRotator InterpolatedRotation = FMath::Lerp(PreviousRotation, NewRotation, Alpha); // Alpha 값은 0과 1 사이의 값이며, 보간 정도를 결정합니다. // 일반적으로 경과된 시간과 원하는 보간 속도를 기반으로 계산됩니다.

예측 (Prediction)

예측은 클라이언트가 서버로부터의 업데이트를 받기 전에 캐릭터의 움직임을 예상하는 기술입니다. 클라이언트는 플레이어의 입력을 기반으로 캐릭터의 움직임을 예측하고, 서버로부터의 새로운 데이터를 받으면 이를 적용합니다.

cppCopy code
// 플레이어 입력에 따른 캐릭터의 예상 위치 계산 FVector PredictedLocation = CurrentLocation + (Velocity * DeltaTime);

네트워크 지연 처리

서버로부터의 업데이트가 도착하면, 클라이언트는 수신된 데이터와 예측된 데이터를 비교하여 차이를 조정합니다. 이러한 '재조정(Reconciliation)' 과정은 캐릭터가 자연스럽게 움직이도록 합니다.

예시 구현

클라이언트 측에서 보간과 예측을 위한 간단한 구현 예시는 다음과 같습니다:

cppCopy code
void AMyGameCharacter::Tick(float DeltaTime) { Super::Tick(DeltaTime); if (!IsLocallyControlled()) { // 서버로부터 받은 위치와 로컬의 위치 사이를 보간 FVector TargetLocation = FMath::Lerp(GetActorLocation(), ReceivedLocation, InterpolationSpeed * DeltaTime); SetActorLocation(TargetLocation); // 서버로부터 받은 회전과 로컬의 회전 사이를 보간 FRotator TargetRotation = FMath::Lerp(GetActorRotation(), ReceivedRotation, InterpolationSpeed * DeltaTime); SetActorRotation(TargetRotation); } else { // 예측 로직을 여기에 구현합니다. // 예를 들어, 사용자의 입력을 받아 현재 위치를 업데이트합니다. } }

여기서 ReceivedLocation과 ReceivedRotation은 서버로부터 받은 최신 위치와 회전값입니다. InterpolationSpeed는 보간 속도를 조정하는 변수입니다.

이 예시는 매우 기본적인 보간과 예측 로직을 보여줍니다. 실제 게임에서는 네트워크 지연, 패킷 손실, 가변 프레임 속도 등의 다양한 네트워크 조건을 고려하여 더 복잡한 로직을 구현해야 할 수도 있습니다.

728x90