使用 ZMQ 流式传输图像,message_t 分配需要太多时间

Streaming images with ZMQ, message_t allocation takes too much time

我一直在尝试找出如何使用 zeromq 流式传输图像(我使用的是 cppzmq 包装器,但原始 API 答案很好)。天真地,我设置了

zmq::context_t ctx(4);
zmq::socket_t pub_image_socket(ctx, zmq::socket_type::pub);
pub_image_socket.bind("tcp://127.0.0.1:8001");

...

while(true){
     //render to image...
     zmq::message_t image_message(image_size.x*image_size.y*element_size);
     copy_image_to(image, image_message);
     pub_image_socket.send(image_message, zmq::send_flags::none);
}

我想也许 zmq 链的其他部分花费了很多时间,所以我做了以下(在调试版本中):

//zmq::context_t ctx(4);
//zmq::socket_t pub_image_socket(ctx, zmq::socket_type::pub);
//pub_image_socket.bind("tcp://127.0.0.1:8001");

...

while(true){
     //render to image...
     zmq::message_t image_message(image_size.x*image_size.y*element_size);
     //commented out so only message creation left
     //copy_image_to(image, image_message);
     //pub_image_socket.send(image_message, zmq::send_flags::none);
}

运行时没有移动(visual studio 分析器实际上无法告诉我减速的原因)。

所以我决定这样做:

zmq::context_t ctx(4);
zmq::socket_t pub_image_socket(ctx, zmq::socket_type::pub);
pub_image_socket.bind("tcp://127.0.0.1:8001");

...

while(true){
     //render to image...
     //zmq::message_t image_message(image_size.x*image_size.y*element_size);
     //commented out so only message creation left
     //copy_image_to(image, image_message);
     //pub_image_socket.send(image_message, zmq::send_flags::none);
}

注释掉 image_message 使我的运行时间增加了一倍多...不过我不确定我能做些什么来阻止它,理论上我可以通过在 message_t 但 。每帧分配兆字节需要太多时间。

由于这个限制,我开始认为 ZeroMQ 不可能进行数据流,我应该只使用 asio 和 tcp/udp 套接字。有没有办法在 ZMQ 中避免这种巨大的重新分配成本?

使用zmq_msg_init_data

http://api.zeromq.org/master:zmq-msg-init-data

您可以提供已分配内存的内存 pointer/size,zeromq 将获得所有权(跳过额外分配)。一旦它被处理并且不再需要,它将调用相关的自由函数,您自己的代码可以在其中清理。

我过去在内存池/循环缓冲区中使用过这种方法,效果很好。