2012-05-13 3 views
1

저는 게임 객체의 "좌표 버퍼"를 300ms마다 클라이언트에 보내는 서버를 작성하고 있습니다. 하지만 매번 전체 데이터를 보내고 싶지는 않습니다.데이터 델타 계산

 
0 0 100 50 -100 -50 at time t 
0 10 100 51 -101 -50 at time t + 300ms 

에만 2 , 일 4 , 5 번째 요소가 변경된 것을 볼 수 있습니다 : 예를 들어, 내가 시간이 지남에 따라 변경 요소와 배열이 있다고 가정합니다.

모든 요소가 아니라 델타 만 전송하는 올바른 방법은 무엇입니까? 이상적으로는 변경 사항이 없을 때 처음에는 전체 데이터를 반환하고 빈 데이터는 반환하는 함수를 원합니다.

감사합니다.

답변

1

효율성을 위해 최적화하려는 사람입니까 아니면 이것이 학습용입니까? 일부의 생각 : 데이터의 많은 거기

  • 하지 않는 한, 그것은 때마다 모든 데이터를 전송, 아마 가장 쉬운, 그리고 정말 비효율적 아니다.

  • 매번 모든 데이터 포인트에 대해 델타를 전송하면 이전 값을 재전송하는 대신 변경되지 않은 포인트에 대해 0을 보내서 많이 절약하지 않습니다.

  • 변경되는 포인트에 대해서만 데이터를 보내면 각 값에 대한 색인을 제공해야합니다. 예를 들어, 포인트 3이 5 증가하고 포인트 8이 2 감소하면 3 5 8 -2을 보낼 수 있습니다. 그러나 이제는 두 개의 값이 변경되므로 각 포인트가 변경되면 반점 수가 절반 미만인 경우에만 이길 수 있습니다.

  • 업데이트를 전송하는 속도와 비교할 때 값이 상대적으로 느리게 변경되면 각 데이터 포인트에 대해 델타를 전송하지만 약간의 비트 만 사용하여 효율성을 높일 수 있습니다. 예를 들어, 4 비트로 -8에서 +7까지의 값을 전송할 수 있습니다. 델타가 그보다 크지 않은 한, 또는 델타가 실제 값을 따라 잡기 전에 여러 델타를 전송해도 괜찮습니다.

  • 두 가지 메커니즘, 즉 초기 값을 보내고 다른 하나는 델타를 보내는 것이 가치가 없을 수 있습니다. 지연을 용인 할 수 있다면 모든 점에 대해 일정한 초기 값을 가정하고 델타 만 전송하는 것이 더 적합 할 수 있습니다.

+0

실제 프로젝트에서 최적화되어야합니다. 나는 축구 경기에서 코디를 보낼거야. 클라이언트의 수는 약 10k입니다. 그래서 왜 몇 바이트라도 많이 최적화 될 것입니다. – Ockonal

+0

전체 목록에 몇 개의 좌표가 있습니까? 데이터를 압축하는 데는 여러 가지 좋은 방법이 있지만, 일반적으로 코드를 작동시킨 다음 벤치마킹하여 최적화 할 가치가 있는지 여부를 결정하는 것이 가장 좋습니다. –

+0

22 코드 + 20 기술 정보. – Ockonal

0

다양한 옵션이 있습니다. 대부분의 데이터가 변경되지 않으면 변경된 요소 쌍 (색인, 값)을 전송하십시오. 대부분의 값이 변경되었지만 변경 사항이 적 으면 델타 및 gzip을 계산 (또는 길이 인코딩, 또는 다른 많은 가능성)하여 결과를 얻습니다.