我有一个C ++对象(Vision.cpp),它在构造函数中包含一堆图像。对象对这些图像执行一些图像处理并返回结果。这发生在服务器端。这些图像由客户端拍摄并发送到服务器,如下所示:
客户端拍摄图片 - >服务器接收图像 - >服务器实例化Vision.cpp并传递图像序列
正如预期的那样,图像序列对内存很重要。我是否应该设计Vision.cpp类来制作图像的副本,或者我应该只保留指向图像的指针并强制服务器在Vision.cpp处理完之前不释放为图像分配的内存?我想制作副本以避免强制服务器保持其指针有效,但图像复制也需要时间。对此有一个很好的解决方案吗?
答案 0 :(得分:0)
使用references或指针,并确保图像的生命周期超出处理的持续时间。除非Vision
对象需要在处理调用之后保持对图像数据的访问,否则这应该相对简单。制作所有这些副本对你的表现来说太可怕了(而且会有比你意识到的更多的副本)。您将需要习惯于仔细考虑C ++中的对象所有权和生命周期,因为根本不会有更多问题需要处理。
答案 1 :(得分:0)
在这些情况下,我通常使用:
不可变数据(如果您重复使用/共享输入图像,则效果很好)。这可以是参考,也可以是std::shared_ptr<const Image>
。对于渲染管道,您还可以使用目标缓冲区(例如渲染目标),然后Vision只是一组处理器,它们不拥有任何输入或输出图像。所以这里有一个场景是你有一堆输入图像 - 服务器为所有创建的Visions提供了对图像的不可变引用。然后RenderDestination要求Vision渲染到RenderDestination的位图。如果您重复使用图像,这通常是一个胜利。这可能导致渲染期间的副本(排序),但如果重用目标,则可以减少分配。
或者您可以传输位图的所有权并使用原位进程,将(可变)位图表示从一个处理器传递到下一个处理器,直到处理完成。如果您不重复使用图像,这通常是一个胜利,但是当输入图像被重复使用时,服务器生成/复制/重新打开这些图像的成本可能很高。
但是有几种方法可以解决这个问题 - 这取决于你如何使用输入以及如何处理。