2

Вы можете отправить DataView через WebRTC DataChannel. Источник: https://groups.google.com/forum/#!topic/discuss-webrtc/JlU2ItCJuZUWebRTC и DataView. Как отправить динамическое количество байтов?

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

Таким образом, вы не можете отправлять длину байтов без создания нового DataView каждый раз. (ужасная идея из-за GC).

Любые идеи о том, как отправлять любую длину байтов через WebRTC, без создания нового DataView каждый раз?

ответ

0

Невозможно это сделать. Если вы хотите отправить сообщение из x байт, тогда вы должны иметь DataView или ArrayBufferView или просто ArrayBuffer, длина которого составляет x.

DataViews и ArrayBufferViews очень легкие. Создание двух, трех или даже 20 DataViews не является реальной проблемой для GC. Я не могу представить ситуацию, когда нужно было бы создать много DataViews (например, в узком цикле), а затем отправить их через DataChannel.

Однако, если вы создаете много DataViews только для того, чтобы изменить базовый ArrayBuffer перед отправкой, я бы рекомендовал использовать ArrayBufferView (например, Uint8Array или Uint32Array и т. Д.), Потому что это проще в использовании. Например, вы можете напрямую обращаться к элементам с помощью оператора [].

Если вы хотите отправить много мелких сообщений сразу через канал данных, вам необходимо собрать их в большом буфере (используя ArrayBuffer или ArrayBufferView), а затем отправить их сразу. Это имеет дополнительное преимущество, избавляя канал данных от необходимости обрабатывать все эти небольшие сообщения. Другими словами, канал передачи данных будет быстрее передавать сообщения, и приложение будет более восприимчивым.

+0

Дело в том, что речь идет о быстро развивающейся многопользовательской игре, где мир имеет несколько объектов и количество этих объектов можно динамически изменять в процессе игры. Хост отправляет моментальный снимок объектов каждые 50 или 100 мс, и каждый снимок может содержать 10, 58, 128, 500 или более или менее объектных данных для отправки, поэтому иногда ему потребуется 2000 байт, а иногда и 100, поэтому ему нужен гибкий способ , – ElSajko

+1

Хорошо, если производительность действительно такая проблема, тогда единственное, что приходит мне на ум, - предварительно выделить все возможные размеры сообщений, которые могут быть отправлены (100, 200, 2000), если размеры сообщений известны заранее. Однако, как я уже сказал, создание и сбор мусора DataView не является серьезной проблемой. Но все же теперь есть способ изменить длину DataView после его создания. –

0

Простой ответ заключается в использовании UInt8Array (или у вас есть какая-либо форма ArrayBufferView), а затем после определения размера, который вы хотите отправить, используйте .slice (0, N) для создания объекта предполагаемого размер.

Да, он генерирует мусор (но так много делает JS). Он невелик, так как это мелкая копия (ссылка вместо фактической копии). Если вы действительно настаиваете на том, чтобы избегать мусора, создавайте представления обо всех размерах, о которых вы беспокоитесь, а затем выберите тот, у которого размер> = размер, который вы хотите отправить (и укажите значение длины в объекте, если это не совсем правый размер)