0

我的应用程序有问题,它需要大量内存优化,但现在我必须交付应用程序的测试版本,我需要类似“ramrush”的东西,因为 api 可以从我的应用程序调用而无需任何可执行文件,Ramrush 正在解决我的问题现在神奇地出现了,但我无法用我的应用程序提供它。

4

1 回答 1

1

解决 OP 的迫切需求(即使今天有点晚了)


图像处理代码中有两个级别的内存优化。

  • 在更简单的层面上,程序员尽可能频繁和尽早地(即在每一行代码之后)尝试删除不再需要的图像对象。
  • 更困难的级别需要将一些图像处理步骤实现为内存高效的管道。

一个例子:

class RgbToGray : ImageSource
{
    private ImageSource m_src;
    public RgbToGray(ImageSource src)
    {
        m_src = src;
    }
    public void GetPixels(int x0, int y0, int rectWidth, int rectHeight, out Pixel[,] result)
    {
        // omitted: validate parameters
        Pixel[,] temp = new Pixel[rectHeight, rectWidth];
        m_src.GetPixels(x0, y0, rectWidth, rectHeight, out temp);
        for (int y = y0; y < y0 + rectHeight; ++y)
        {
            for (int x = x0; x < x0 + rectWidth; ++x)
            {
                result[y,x] = SomeCalculation(temp[y,x]);
            }
        }
    }
};

在此示例中,RgbToGray按需执行图像处理,无需使用自己的永久内存,而是依赖于临时缓冲区。为了使这个实现工作,调用者必须GetPixels以特定的“缓冲区粒度”调用,该粒度必须小于完整的图像大小,以达到节省内存的效果。

(我想到的特定框架是Windows Imaging Component,但类似的想法可以在许多其他框架中找到,例如OpenCV 的MatExpr模板。)

显然,并非所有框架都允许这种优化。

于 2012-08-25T04:54:02.877 回答