이 효과를 제거 할 수있는 아이디어 중 하나는 클라이언트에서 오류 예측 수정을 적용 할 때 평활화를 사용하는 것입니다..그 코드는 그 볼 위치와 클라이언트를 식별의 어느 시점에서
작동 방법
는 다르다. 대신 바로 클라이언트 코드 (당신이 그 점프를 볼 수있는 이유 중 하나 인)에 대한 보정으로 것을 적용
, 당신은 그 시간 동안, cl_smoothtime
예를 들어, 수행 500ms.
처음에는 프로그램에서 오류 감지 이벤트가 발생한 시간을 m_flPredictionErrorTime
으로 저장해야합니다.
public void onErrorDetected() {
this.m_flPredictionErrorTime = System.currentTimeMillis();
}
어딘가에 가까운 디스플레이 코드에 당신은 당신이 표시하려고 얼마나 많은 오류 계산합니다. 여기에 대한 몇 가지 의사 코드가 있습니다.
public void draw() {
Point preditctionError = this.clientPredictedBallCoordinates - this.serverCoordinates;
Point deltaToDisplay = calculateErrorVector(preditctionError);
Point positionToDisplay = clientPredictedBallCoordinates + deltaToDisplay;
// actually draw the ball here
}
public Point calculateErrorVector(Point coordinatesDelta) {
double errorAmount = (System.currentTimeMillis() - this.m_flPredictionErrorTime)/this.cl_smoothtime.
if (errorAmount > 1.0) {
// whole difference applied in full, so returning zero delta
return new Point(0,0);
}
if (errorAmount < 0) {
// no errors detected yet so return zero delta
return new Point(0,0);
}
Point delta = new Point(coordinates.x*errorAmount, coordinates.y*errorAmount);
return delta;
}
나는 Source Multiplayer Networking wiki에서이 아이디어를 포착했습니다. Cpp의 실제 코드 예제는 SDK에서 GetPredictionErrorSmoothingVector function 주위에 있습니다.
그런데 ping/fps를 측정 했습니까? – Ivan
@ 이반 나는 핑을 측정하고 있습니다. 그러나, 나는 그것을 지금 사용하지 않고있다. – Z0q
나는이 메트릭스에 대해 묻고 있는데, '약간 지체 된'것이 어떤 상황에 있는지를 정량화 할 수 있습니다. 예 : 핑이 900ms라면 기본적으로 어떤 경험도 괜찮습니다 – Ivan