【问题标题】:WebRTC and DataView. How to send dynamic amount of bytes?WebRTC 和数据视图。如何发送动态字节数?
【发布时间】:2015-02-25 16:41:09
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript webrtc arraybuffer typed-arrays rtcdatachannel


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 重点是,它是关于快节奏的多人游戏,其中世界有多个对象,并且这些对象的数量可以在游戏过程中动态改变。主机每 50 或 100 毫秒发送对象快照,每个快照可能有 10、58、128、500 或更多或更少的对象数据要发送,因此有时需要 2000 字节,有时需要 100 字节,这就是它需要灵活方式的原因.
    • 好吧,如果性能真的是个问题,那么我唯一想到的就是预先分配所有可能发送的消息大小(100、200、2000),如果消息大小是提前知道的。然而,正如我所说,创建和垃圾收集 DataView 并不是一个主要问题。但是现在仍然有办法在创建 DataView 后更改其长度。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-09
      • 2012-06-05
      • 2017-07-15
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多