WebRTC和DataView。如何发送动态字节数?

时间:2014-12-29 13:27:10

标签: javascript webrtc arraybuffer typed-arrays rtcdatachannel

您可以通过WebRTC DataChannel发送DataView。资源: https://groups.google.com/forum/#!topic/discuss-webrtc/JlU2ItCJuZU

这很好,因为从那以后就没有必要总是发送整个ArrayBuffer。但.. 你不能动态地改变DataView的byteLength(这对我来说是个大惊喜,因为DataView就像一个指向ArrayBuffer的指针,只有专门的API)。

因此,每次创建新的DataView时,您都无法发送任何长度的字节。 (因为GC的可怕想法)。

如何通过WebRTC发送任何长度的字节,而不是每次都创建新的DataView?

2 个答案:

答案 0 :(得分:0)

没有办法做到这一点。如果要发送x字节的消息,则必须有一个DataView或ArrayBufferView,或者只是一个长度为x个字节的ArrayBuffer。

DataViews和ArrayBufferViews重量很轻。创建两个,三个甚至20个DataView对GC来说并不是一个真正的挑战。我无法想象需要创建大量DataView(例如在紧密循环中)然后通过DataChannel发送它们的情况。

但是如果你在发送之前创建了很多DataView来修改底层ArrayBuffer,我建议使用ArrayBufferView(例如Uint8Array或Uint32Array等),因为它更容易使用。例如,您可以使用[]运算符直接访问元素。

如果您想通过数据通道一次发送大量小消息,那么您应该在一个大缓冲区(使用ArrayBuffer或ArrayBufferView)中收集它们,然后一次性发送它们。这具有额外的优点,即保护数据通道本身需要处理所有这些小消息。换句话说,数据通道将更快地传输消息,应用程序将更具响应性。

答案 1 :(得分:0)

简单的答案是使用UInt8Array(或者你有什么 - 某种形式的ArrayBufferView),然后在确定要发送的大小后,使用.slice(0,N)创建一个预期大小的对象

是的,它会产生垃圾(但JS做的很多)。它不是很大,因为它是浅拷贝(参考而不是实际拷贝)。如果您真的坚持要避免垃圾,请创建您关注的所有尺寸的视图,然后选择尺寸为> =您要发送的尺寸的视图(并在对象中包含长度值,如果它& #39; s尺寸不正确)