2

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

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

所以你仍然不能发送任何长度的字节,而不是每次都创建新的 DataView。(由于 GC,这个想法很糟糕)。

任何想法如何通过 WebRTC 发送任意长度的字节,而无需每次都创建新的 DataView?

4

2 回答 2

0

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

是的,它会产生垃圾(但 JS 也会产生很多垃圾)。它并不大,因为它是一个浅拷贝(参考而不是实际拷贝)。如果您真的坚持避免垃圾,请创建您关心的所有尺寸的视图,然后选择 size >= 您要发送的尺寸的视图(并在对象中包含一个长度值,如果它不完全是合适的尺码)

于 2015-01-20T18:05:26.877 回答
0

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

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

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

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

于 2015-01-05T11:26:21.210 回答