0

Javascript ゲームで型付き配列を使用して、クライアント (ブラウザーで実行中) とサーバー (node.js を実行中) の間でデータを送信しています。問題なくメッセージを送受信できますが、メッセージを送信するたびに新しい配列を作成するのではなく、型指定された配列を再利用することに関心があります。

これが私のsendMessageコードです:

function sendMessage(socket, data) {

    // data is JSON
    var encoded = BISON.encode(data);
    if (socket.isBinary) {
        var len = encoded.length,
            bytes = new Uint32Array(len);

        for (var i = 0; i < len; ++i) {
            bytes[i] = encoded.charCodeAt(i);
        }
    }

    if (server && socket.isBinary) {
        socket.send(bytes, { binary: true, mask: false });
    } else {
        socket.send(encoded);
    }

}

ここに私のreadMessageコードがあります:

function readMessage(data) {

    if (data instanceof ArrayBuffer) {
        var bytes = new Uint32Array(data);
        data = String.fromCharCode.apply(null, bytes);
    }
    var message = JSON.stringify(BISON.decode(data));
    return JSON.parse(message);
}

メッセージを送信するたびに、新しい Uint32Array を作成し、送信するメッセージの長さに初期化します。毎回新しい配列を作成するのではなく、メッセージごとにこの配列を再利用したいと思います。

これに関する私の現在の考え方は、 my を決定maxMessageSizeし、この長さで配列を初期化することです。maxMessageSizeソケットを介して送信できる最大の許容メッセージになります。

質問)

ほとんどのメッセージは、正確 maxMessageSizeなサイズではない可能性があります。このような場合、メッセージの長さに何らかの値 ( null?) を埋め込む必要があります。ソケットの反対側の値を読み取るときに、このパディングがいつ開始されたかをどのように知ることができますか?

これをすべて書き出すと、別の質問が私に浮かびました。これは努力する価値があるのでしょうか?

使用ライブラリ

  • node.js の websocket のws
  • json のバイナリ エンコーディング用のBISON 。
4

1 に答える 1

1

私の知る限り、 Uint*Arrayが構築された後にその長さを変更する方法はなく、それらからサブ配列のみを取得できます。

nullを使用しようとした場合、パディングは 32 ビット整数で行う必要ToInt(null)があるため、そのエントリ0に a が含まれます。0このようにパディングしたい場合は、長さの値 (配列の最初または最後のエントリ) を渡す必要があります。これは、データをトリミングするタイミングを知るために受信側で確認する必要があり、maxMessageSizeつまり1つ少ない。

ただし、部分配列を使用することが必要な場合があります。最大長の配列を構築し、それを埋めてから、.subarray(0, len)必要な実際の配列を取得するために使用します。これが毎回新しいものを構築するよりも利点があるかどうかはわかりません。

于 2013-01-16T20:45:33.963 に答える