我们正在处理 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 上, [进程 3]
在计算机 B 上)。
[Process 1]
的输出大约为 3 MB
(即通常 > 300 个 9 KB 的巨型数据包),因此我们可以假设当我们调用 ZeroMQ
时:
socket->send(message); // message size is 3 MB
然后在库或操作系统的某个地方,数据被拆分成数据包,这些数据包按顺序发送。此函数假定消息已经完全形成。
当通过 UDP
发送大数据时,是否有一种方法(例如 API)可以让部分消息“正在构建”或“按需构建”?这在接收方是否也可能(即允许在消息的开头采取行动,因为消息的其余部分仍在传入)。或者.. 是我们自己手动将数据拆分成更小块的唯一方法吗?
注意:
网络连接是计算机 A 和 B 之间的直线 GigE 连接。
最佳答案
不,你不能现实地做到这一点。 API 不提供它,ZeroMQ promise 接收者将收到完整的消息(包括多部分消息)或根本没有消息,这意味着它不会将消息呈现给接收者,直到它完全传输.在这里,将数据自己拆分为单独的可操作 block ,作为单独的 ZeroMQ 消息发送是正确的做法。
关于c++ - 是否可以在通过 UDP 发送数据时将数据流式传输到 ZeroMQ 消息中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35285836/