WebSockets и повторное использование ArrayBuffers при отправке

Я отправляю двоичные данные, используя Uint8Arrays и ArrayBuffers. Я могу успешно отправить его, каждый раз создавая новый Uint8Array и ArrayBuffer.

В целях повышения производительности (уменьшение количества мусора и т. д.) я хотел бы повторно использовать те же Uint8Array и ArrayBuffer для следующего сообщения. В этом случае каждое сообщение имеет одинаковые поля, поэтому длина в байтах не является проблемой. Я просто перезаписываю это.

Однако повторное использование приводит к тому, что отправляемые данные оказываются неверными.

Мое лучшее предположение состоит в том, что я изменяю ArrayBuffer для следующего сообщения, в то время как предыдущее сообщение все еще находится в процессе отправки. Это проблема? Если да, то есть ли способ определить, когда ArrayBuffer больше не используется WebSocket, чтобы я мог объединить его? Если нет, что еще может вызвать такое поведение?

Спасибо!


person n a    schedule 26.12.2012    source источник
comment
можете поделиться фрагментом кода?   -  person dhruv chopra    schedule 26.12.2012
comment
У вас такая же проблема в Chrome и Firefox? Вы вызываете send и сразу же изменяете ArrayBuffer в том же контексте выполнения? Как насчет установки очень короткого setTimeout (т.е. 1), а затем его изменения.   -  person kanaka    schedule 27.12.2012


Ответы (1)


Очевидно, ошибка была просто логической ошибкой с моей стороны.

Чтобы отправлять вещи в двоичном виде, я написал объект Message, который использовал сдвиг битов и целочисленное сложение для заполнения Uint8Array. Когда я писал свою функцию сброса, я сбрасывал только переменную позиции, а не значения массива, предполагая, что ее функции просто правильно перезапишут массив.

Однако, поскольку при добавлении новых значений в массив использовалось сложение (массив [0] += новое значение), а не наборы (массив [0] = новое значение), любые новые данные искажались старыми значениями.

Я чувствую себя немного глупо прямо сейчас.

Комментарии Друва Чопры и Канаки помогли мне выбрать правильное направление. Я тестировал с использованием функции setTimeout с 10-секундным интервалом, и она все еще давала мне неправильные значения, что заставило меня понять, что это была просто моя глупая ошибка. Я хотел бы отдать им должное, но я не знаю, как это сделать.

Тем не менее большое спасибо за помощь! Я ценю его.

РЕДАКТИРОВАТЬ: Видимо, я могу ответить на свой вопрос только через 8 часов. Я сделаю это завтра, чтобы избежать путаницы.

РЕДАКТИРОВАТЬ 2: По-видимому, теперь я могу голосовать за комментарии. Спасибо еще раз.

person n a    schedule 27.12.2012