1

ゲーム オブジェクトの「座標バッファ」を 300 ミリ秒ごとにクライアントに送信するサーバーを作成しています。しかし、毎回完全なデータを送信したくありません。たとえば、時間の経過とともに変化する要素を持つ配列があるとします。

0 0 100 50 -100 -50 時刻t   
0 10 100 51 -101 -50 時刻t + 300ms

2番目、4番目、5番目の要素だけが変更されていることがわかります。

すべての要素ではなく、デルタのみを送信する正しい方法は何ですか? 理想的には、最初は完全なデータを返し、変更がない場合は空のデータを返す関数が必要です。

ありがとう。

4

2 に答える 2

1

効率を最適化することを検討していますか、それともこれは学習演習ですか?いくつかの考え:

  • 大量のデータがない限り、毎回すべてのデータを送信するのがおそらく最も簡単で、ひどく非効率的ではありません。

  • 毎回すべてのデータポイントにデルタを送信する場合、前の値を再送信する代わりに、変更されていないポイントにゼロを送信しても、それほど節約にはなりません。

  • 変更されたポイントのみのデータを送信する場合は、値ごとにインデックスを指定する必要があります。たとえば、ポイント3が5増加し、ポイント8が2減少した場合、を送信できます3 5 8 -2ただし、変更されるポイントごとに2つの値を送信するため、変更されるポイントが半分未満の場合にのみ勝ちます。

  • 更新を送信する速度と比較して、値の変化が比較的遅い場合は、データポイントごとにデルタを送信することで効率を上げることができますが、使用するビットはわずかです。たとえば、4ビットを使用すると、-8から+7までの値を送信できます。デルタがそれより大きくならない限り、または実際の値に「追いつく」前にいくつかのデルタを送信しても問題がない場合は、これで機能します。

  • 2つの異なるメカニズムを持つことは価値がないかもしれません。1つは初期値を送信するためのもので、もう1つはデルタを送信するためのものです。ラグを許容できる場合は、すべてのポイントに対して一定の初期値を想定してから、デルタのみを送信する方が理にかなっている場合があります。

于 2012-05-13T20:08:33.427 に答える
0

多くのオプションがあります。ほとんどのデータが変更されていない場合は、変更された要素の (index,value) ペアを送信するだけです。ほとんどの値が変化するが変化が小さい場合は、デルタと gzip (またはランレングス エンコード、またはその他の多くの可能性) を計算して結果を求めます。

于 2012-05-13T19:55:26.807 に答える