https://developer.valvesoftware.com/wiki/Lag_Compensation
관련된 문서로 Yahn Bernier’s 2001 paper on game engine networking를 보려고 했을 수 있다.
렉 보정은 서버에서 유저 명령어를 수행할 때, 플레이어의 지연시간만큼 시간을 되돌리는 개념이다. 예측과 결합하면 렉 보정은 공격자의 시선에서 네트워크 지연을 방지하는데 도움이 된다. 보다 자세한 설명은 소스엔진 멀티플레이어 네트워크 참고.
기본적으로 플레이어만 뒤로 돌아가고 이들의 1초간 위치와 애니메이션 기록을 저장해둔다.
Note:
Tip: Left 4 Dead 2부터는CBasePlayer
에서 렉 보정을 하지 않는다. 구현은 상속된 클래스에서 해야하고 Valve의 네트워크에 연결된 플레이어 클래스들은 이미 작업을 해둔 상태다.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: 새로운 엔티티의 렉 보정 지원