微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 ZMQ 流式传输图像,message_t 分配花费太多时间

我一直在尝试找出如何使用 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,zmq::send_flags::none);
}

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

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

解决方法

使用zmq_msg_init_data

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

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

我过去曾将这种方法用于内存池/循环缓冲区,并且效果很好。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。