Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用ZMQ流式传输图像,消息分配花费太多时间_C++_Memory Management_Zeromq - Fatal编程技术网

C++ 使用ZMQ流式传输图像,消息分配花费太多时间

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...

我一直在尝试找出如何使用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链的其他部分可能需要花费大量时间,所以我做了以下工作(在调试构建中):

运行时中没有任何移动(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);
}