C++ 使用ZMQ流式传输图像,消息分配花费太多时间
我一直在尝试找出如何使用zeromq流式传输图像(我使用的是cppzmq包装器,但原始API答案很好)。天真地,我建立了C++ 使用ZMQ流式传输图像,消息分配花费太多时间,c++,memory-management,zeromq,C++,Memory Management,Zeromq,我一直在尝试找出如何使用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::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链的其他部分可能需要花费大量时间,所以我做了以下工作(在调试构建中):
运行时中没有任何移动(VisualStudio探查器也无法实际告诉我减速是什么)
于是我决定这样做:
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\u消息
使我的运行时间增加了一倍多。。。我不确定我能做些什么来阻止它,理论上我可以通过在消息中重新使用分配的内存来阻止它。每帧分配兆字节的时间太长了
由于这个限制,我开始认为ZeroMQ不可能进行数据流传输,我应该使用asio和tcp/udp套接字。有没有办法避免ZMQ中的这种大规模重新分配成本?使用
ZMQ\u msg\u init\u data
您可以提供已分配内存的内存指针/大小,zeromq将获得所有权(跳过额外分配)。一旦它被处理并且不再需要,它将调用相关的free函数,在这里您自己的代码可以清理
我以前在内存池/循环缓冲区中使用过这种方法,效果很好。流和消息队列并不完全匹配。有趣的是,我已经开始直接使用TCP,但我已经不得不使用循环缓冲区,我以前见过这种情况,但我的思维一直在思考“我必须先使用消息”。这样,消息仍然在循环中创建,但没有分配巨大的缓冲区。我想我应该使用析构函数让代码知道其中一个缓冲区可用。
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);
}