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