0

我有一个 C++ 对象 (Vision.cpp),它在其构造函数中获取一堆图像。该对象对这些图像执行一些图像处理并返回结果。这发生在服务器端。图像由客户端拍摄并发送到服务器,如下所示:

客户端获取图像 --> 服务端接收图像 --> 服务端实例化 Vision.cpp 并传入图像序列

正如预期的那样,图像序列占用了大量内存。我应该设计 Vision.cpp 类来制作图像的副本,还是应该只保留指向图像的指针并强制服务器在 Vision.cpp 完成处理之前不释放为图像分配的内存?我想制作副本以避免强制服务器保持其指针有效,但图像复制也需要时间。有没有好的解决方案?

4

2 回答 2

0

使用引用或指针,并确保图像的生命周期超过处理的持续时间。除非Vision对象需要在处理调用后保留对图像数据的访问权限,否则这应该相对简单。制作所有这些副本会对您的表现造成可怕的影响(并且副本会比您意识到的要多)。您将需要习惯于仔细考虑 C++ 中的对象所有权和生命周期,因为您将根本无法使用副本处理更多问题。

于 2013-07-09T06:29:52.650 回答
0

在这些情况下,我通常使用:

  • 不可变的数据(如果您重用/共享输入图像很好)。这可以是参考,也可以是std::shared_ptr<const Image>. 对于渲染管道,您还可以使用目标缓冲区(例如渲染目标),然后 Vision 只是不拥有任何输入或输出图像的处理器集合。所以这里的一个场景是你有一堆输入图像——服务器为所有创建的 Vision 提供对图像的不可变引用。然后 RenderDestination 要求 Vision 渲染到 RenderDestination 的位图。如果您重复使用图像,这通常是一个胜利。这可能会导致在渲染期间复制(各种),但如果目标被重用,您可以减少分配。

  • 或者,您可以转移位图的所有权并使用就地处理形式,将(可变)位图表示从一个处理器传递到下一个处理器,直到处理完成。如果您不重用图像,这通常是一个胜利,但是当/如果输入图像被重用时,服务器生成/复制/重新打开这些图像可能会很昂贵。

但是有几种方法可以解决这个问题——这取决于你如何使用输入以及你如何处理。

于 2013-07-09T07:02:41.997 回答