2

Uint8Arrays と ArrayBuffers を使用してバイナリ データを送信しています。毎回新しい Uint8Array と ArrayBuffer を作成することで、正常に送信できます。

パフォーマンス上の目的 (ガベージの削減など) のために、次のメッセージに同じ Uint8Array と ArrayBuffer を再利用したいと考えています。この場合、各メッセージには同じフィールドがあるため、バイト長は問題になりません。上書きするだけです。

ただし、再利用すると、送信されるデータが正しくなくなります。

私の最善の推測は、前のメッセージがまだ送信中である間に、次のメッセージの ArrayBuffer を変更していることです。これが問題ですか?もしそうなら、ArrayBuffer が WebSocket で使用されなくなったことを検出してプールできる方法はありますか? そうでない場合、他に何がこの動作を引き起こす可能性がありますか?

ありがとう!

4

1 に答える 1

0

どうやら、エラーは私の側の単なる論理エラーでした。

バイナリで送信するために、ビット シフトと整数加算を使用して Uint8Array を満たす Message オブジェクトを作成しました。リセット関数を作成したとき、その関数が配列を適切に上書きするという仮定の下で、配列値ではなく位置変数のみをリセットしました。

ただし、配列に新しい値を追加するには、セット (array[0] = newvalue) ではなく加算 (array[0] += newvalue) を使用したため、新しいデータは古い値によって破損していました。

私は今ちょっとばかげていると感じています。

Dhruv Chopra と Kanaka のコメントは、私を正しい方向に導くのに役立ちました。10 秒間隔の setTimeout 関数を使用してテストしましたが、それでも間違った値が返されました。彼らにクレジットを与えたいのですが、どうすればよいかわかりません。

それでも、助けてくれてありがとう!それは有り難いです。

編集: どうやら私は 8 時間後にのみ自分の質問に答えることができます。混乱を避けるため、明日にします。

EDIT 2:どうやら私は今コメントに賛成票を投じることができます。再度、感謝します。

于 2012-12-27T20:06:29.053 に答える