소스엔진 멀티플레이어 네트워크 : 렉 보정


https://developer.valvesoftware.com/wiki/Lag_Compensation


관련된 문서로 Yahn Bernier’s 2001 paper on game engine networking를 보려고 했을 수 있다. 

클라이언트 히트박스 (빨간색), 서버 히트박스 (파란색)

렉 보정은 서버에서 유저 명령어를 수행할 때, 플레이어의 지연시간만큼 시간을 되돌리는 개념이다. 예측과 결합하면 렉 보정은 공격자의 시선에서 네트워크 지연을 방지하는데 도움이 된다. 보다 자세한 설명은 소스엔진 멀티플레이어 네트워크 참고.

기본적으로 플레이어만 뒤로 돌아가고 이들의 1초간 위치와 애니메이션 기록을 저장해둔다.

Note: CBasePlayer에서 렉 보정을 하지 않는다. 구현은 상속된 클래스에서 해야하고 Valve의 네트워크에 연결된 플레이어 클래스들은 이미 작업을 해둔 상태다.

Tip: Left 4 Dead 2부터는 LagCompensate !FGD keyvalue를 사용하는 모든 엔티티가 렉 보정 될 수 있게 되었다. 아껴서 쓸 것!

구성

cl_lagcompensation <boolean>
클라이언트가 서버에게 자신의 명령어를 렉 보정하지 않도록 전한다. 이건 치트는 아니다!

cl_lagcomp_errorcheck <integer>
더 이상 사용하지 않음? 원래는 주어진 플레이어 인덱스를 참조하여 오류 정보를 표시해야 하지만 실제로는 참조되지 않는다.

sv_lagcompensationforcerestore <boolean>
치트, 비활성화 할 경우에는 되감아진 위치를 현재 시점에 확보할 수 있는지 확인하고 안되는 경우에는 그 위치 대신에 마지막으로 유요한 위치로 되감기됨. To-do: 이런 현상을 원하는 이유?

sv_showlagcompensation <boolean>
치트, 렉 보정 된 플레이어의 되감기 된 히트박스를 표현한다. 렉 보정이 적용되지 않은 것도 표시되는 이전 sv_showhitboxes 역할 중 하나다. (?)

(ALLOW_DEVELOPMENT_CVARS로 컴파일 된) 개발자 서버 빌드에는 추가적인 명령어들도 있다.

sv_unlag <boolean>
렉 보정을 아예 활성/비활성화 한다.

sv_maxunlag <float>
몇 초 동안 플레이어의 위치를 저장할 지 정한다. 기본값(이자 최댓값)은 1초다.

Invocation

단순히 lagcompensation 오브젝트를 두 번 호출하는 사이의 코드를 래핑하면 된다.

#ifdef GAME_DLL

#include "..\server\ilagcompensationmanager.h"

void CMyPlayer::FireBullets ( const FireBulletsInfo_t &info )
{
	// Source 2007
	lagcompensation->StartLagCompensation( this, this->GetCurrentCommand() );

	// Alien Swarm and later (see also sub-section below)
	lagcompensation->StartLagCompensation( this, LAG_COMPENSATE_HITBOXES );

	BaseClass::FireBullets(info);

	lagcompensation->FinishLagCompensation( this );
}
#endif

시간은 StartLagCompensation()를 호출한 시점으로 되돌아간 후에 FinishLagCompensation()를 호출한 시점으로 돌아간다.

렉 보정 종류

Alien Swarm부터 아래의 설정으로 렉 보정을 최적화 할 수 있다:

LAG_COMPENSATE_BOUNDS
엔티티의 위치만 되돌아간다. (애니메이션 생략)

LAG_COMPENSATE_HITBOXES
위치와 히트박스 둘 다 되돌린다. (표준 설정)

LAG_COMPENSATE_HITBOXES_ALONG_RAY
오버로딩 된 StartLagCompensation()의 “weaponPos”로 선언된 레이가 적중된 경우, 히트박스를 되돌린다. 아닐 경우에는 바운드 박스만 되돌린다.

이 설정들은 모든 엔티티에 적용된다.

구현

Todo: 새로운 엔티티의 렉 보정 지원

, ,

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다