如何解决使用 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 举报,一经查实,本站将立刻删除。