【发布时间】:2016-02-09 07:03:46
【问题描述】:
我们正在通过 30fps 处理延迟关键型应用程序,该应用程序包含多个阶段(例如压缩、网络发送、图像处理、3D 计算、纹理共享等)。
通常我们可以像这样实现这些多个阶段:
[Process 1][Process 2][Process 3]
---------------time------------->
但是,如果我们可以堆叠这些进程,那么[Process 1] 可能会在处理数据时不断将其结果传递给[Process 2]。这类似于iostream 在 c++ 中的工作方式,即“流式传输”。使用线程,这可以减少延迟:
[Process 1]
[Process 2]
[Process 3]
<------time------->
假设[Process 2] 是我们的UDP 通信(即[Process 1] 在计算机A 上,[Process 3] 在计算机B 上)。
[Process 1] 的输出大约是 3 MB(即通常 > 300 个巨型数据包,每个 9 KB),因此我们可以假设当我们调用 ZeroMQ强>的:
socket->send(message); // message size is 3 MB
然后在库或操作系统的某个地方,数据被分成按顺序发送的数据包。该函数假定消息已经完全形成。
在通过UDP 发送大数据时,是否有办法(例如 API)使部分消息“正在构建”或“按需构建”?这在接收方是否也是可能的(即允许在消息的开头采取行动,因为消息的其余部分仍在传入)。或者..是我们自己手动将数据分成更小的块的唯一方法吗?
Note:
网络连接是计算机 A 和 B 之间的直线 GigE 连接。
【问题讨论】:
-
请注意,我们最终使用了 ASIO UDP 数据包而不是 ZeroMQ(因为我们需要打包才能流式传输)。实施见github.com/elliotwoods/ofxSquashBuddies
标签: c++ zeromq iostream low-latency