Java의 멀티 플레이어 프로젝트에서 작업하고 있으며 대기 시간 측정 결과를 수집하는 방법을 세분화하려고합니다.측정 대기 시간
현재 나의 설정은 일정한 간격으로 서버가 타임 스탬프를 받아 반환 된 일괄 UDP 패킷을 보내어 대기 시간을 계산하고 기록하는 것입니다. 나는 샘플 수를 취한 다음 대기 시간을 얻기 위해 평균을 계산한다.
클라이언트 측에서 대기 시간을 조정하는 것이 합리적인 해결책으로 보입니까?
Java의 멀티 플레이어 프로젝트에서 작업하고 있으며 대기 시간 측정 결과를 수집하는 방법을 세분화하려고합니다.측정 대기 시간
현재 나의 설정은 일정한 간격으로 서버가 타임 스탬프를 받아 반환 된 일괄 UDP 패킷을 보내어 대기 시간을 계산하고 기록하는 것입니다. 나는 샘플 수를 취한 다음 대기 시간을 얻기 위해 평균을 계산한다.
클라이언트 측에서 대기 시간을 조정하는 것이 합리적인 해결책으로 보입니까?
게임 프로토콜에 사용되는 패킷의 타임 스탬프를 설정할 수도 있습니다. 따라서 통계를 통합하는 데 더 많은 데이터가 필요합니다. (이 방법은 추가 데이터 버스트로 인한 오버 헤드를 피하기 위해 유용합니다. 통계를 처리하기 위해 이미 교환 한 데이터를 사용했습니다)
다른 메트릭 (예 : 분산)을 사용할 수도 있습니다. 연결 품질을보다 정확하게 예측할 수 있습니다.
안녕하세요, 저는이 아이디어가 마음에 들지만, 모든 패킷이 내가 추측하는 트래픽을 두 배로 늘리는 응답을 요구할 것이라고 생각합니다. – TechyAdam
@TechyAdam : 수집하는 "타임 스탬프"가 많을수록 통계가 정확합니다. 물론 통계를 수집하기 위해 많은 양의 사용되지 않은 패킷을 보내는 것은 좋은 생각이 아닙니다. 예, 물론 패킷을 사용하면 즉각적인 응답이 유용 할 것입니다. 어쨌든 그것은 단지 클라이언트에게 보내진 ack 패킷 일 수 있습니다. 작은 차원에는 타임 스탬프, 패킷 시퀀스 번호 및 그와 같은 몇 가지 데이터 만 들어 있습니다. – Heisenbug
@TechyAdam :하지만 당신에게 대답 할 때 UDP가 신뢰할 수 없기 때문에 이미 클라이언트에게 어떤 종류의 UDP ACK 데이터 그램을 보냈다 고 생각했습니다. 그래서 패킷이 목적지에 도달하기 전에 전송되었는지 확인해야합니다 . – Heisenbug
나가는 패킷에 클라이언트가 타임 스탬프를 보내고 응답에 원래 타임 스탬프가 보존됩니다. 이렇게하면 서버와 클라이언트 클록이 정확하게 동기화되지 않아서 발생하는 문제를 밟을 때 왕복 지연 시간을 계산할 수 있습니다.
. 시간 동기화가 내 문제였다. 내 두 창문 OS 시계는 인터넷 시계와 동기화되었지만 몇 가지 이유로 그들은 약 3 초 정도 떨어져있어 편도 레이턴시를 찾지 못했습니다. 당신의 방식은 매력처럼 작동합니다. –
프로젝트를 아직 시작하지 않은 경우 KryoNet과 같은 네트워킹 프레임 워크를 사용하십시오.이 프레임 워크는 RMI와 효율적인 직렬화가 있으며 UDP를 사용하여 자동으로 ping 요청을 전송합니다. 핑 시간 값을 쉽게 얻을 수 있습니다.
왕복 지연 시간을 측정하는 경우 시계 드리프트, HW 클록 및 OS API의 정밀도와 같은 요소가 측정에 영향을 미칩니다. 하드웨어에 돈을 들이지 않고 얻을 수있는 가장 가까운 것은 RDTSC 명령어를 사용하는 것입니다. 그러나 RDTSC는 자체 문제없이 진행되지 않습니다. 어떻게 호출하는지주의해야합니다.
모든 통신이 UDP를 사용하여 이루어진 것으로 가정합니다. – biziclop
사실, 맞습니다. 덕분에 – TechyAdam