6

対応するクライアント オブジェクトを持つサーバー オブジェクトがあります。同期を維持するデータは、サーバー オブジェクトのキー/値ディクショナリ内にあります。クライアント オブジェクトとサーバー オブジェクトの同期を保つために、サーバーが各オブジェクトのフレームごとにキー/値ディクショナリを送信するようにします。

最小ビット量を使用してキー/値辞書のリストを送信できるデータ構造/アルゴリズムは何ですか?

ボーナス制約 1: オブジェクトの種類ごとに、一部のキーの値が他のキーよりも頻繁に変更されます。ボーナス制約 2: サーバー側のメモリ使用量は比較的高価です。

4

2 に答える 2

4

辞書全体を送信する必要はありません。代わりに、変更されたものだけを送信してください。

フレームごとに送信する必要はありません。代わりに、フレーム レートとは関係のない定期的な間隔で送信します。

2 番目のポイントで覚えておくべき重要なアイデアは、クライアントがゲームの状態の変化を予測できるということです。サーバーから情報を受信する間にゲームをシミュレートすることができ、正式な情報を受信した後に間違いを修正するだけで済みます。再びサーバーから。

于 2012-10-22T11:17:05.017 に答える
0

特別なデータ構造やアルゴリズムはありません。区切られたデータを転送するだけで十分です。

サンプルデータ (C 文字列として、実際には "\" である "\\" に注意してください):key1;value1;key2;value2;key3\\;with delimiter inside it;value3;\0

送信するキーを選択できます。読み取り* と書き込み** が簡単で、メモリの消費量が少なく、圧縮も可能です (1 つのバイト ストリームであるため)。

*-読んだ:

while( peekbyte() != 0 )
{
    key = readuntil( ';' ); // checks if previous byte isn't "\" while looking for char.
    value = readuntil( ';' );
    add( key, value );
}

**-書く:

foreach( key in keylist )
{
    write( replace( ';', '\\;', key ) );
    write( replace( ';', '\\;', dict[ key ] ) );
}
write( '\0' );
于 2012-10-22T11:35:59.790 に答える