我有colorBuffer Color[width*height]
(最有可能是800 * 600)
在光栅化期间我打电话:
void setPixel(int x, int y, Color & color)
{
colorBuffer[y * width + x] = color;
}
事实证明,这种对颜色缓冲区的随机访问实际上是无效的,并且会减慢我的应用程序。
我认为这是我使用它的方式。我计算一些像素(使用光栅化算法)并调用setPixel 所以我认为我的缓冲区不在缓存中,这是主要问题。当尝试一次写入整个缓冲区时,速度要快得多。
有什么办法,如何优化这个?
修改
我不使用它来填充两个循环的缓冲区 我用它来画“随机”像素 例如,当栅格化线时我就像
一样使用它setPixel(10,10);
calculate next point
setPixel(10,11);
calculate next point
setPixel(next point)
...
答案 0 :(得分:2)
我认为,缓冲区的访问模式取决于算法处理像素的顺序。您是否可以简单地更改该顺序,以便为缓冲区创建顺序访问方案?
答案 1 :(得分:1)
首先要注意的是,处理像素的方式会对速度产生巨大影响。如果你这样做
for (int x = 0; x < width;++x)
{
for (int y = 0; y < height; ++y)
{
setPixel(x,y,Color());
}
}
这对于性能来说真的很糟糕,因为你实际上是在宽度方面在内存中跳转(注意你做y * width + x)。
如果您只是将处理顺序更改为
for (int y = 0; y < height;++y)
{
for (int x = 0; x < width; ++x)
{
setPixel(x,y,Color());
}
}
你已经注意到性能提升,因为处理器现在有机会缓存内存访问(之前没有)。
此外,您应该检查在实际设置内存之前是否可以确定整个像素块将具有相同的颜色值。然后,您可以将这些常量颜色值逐块复制到图像阵列,这样可以为您节省大量的性能。
答案 2 :(得分:1)
是的,你应该尝试缓存友好, 但我要做的第一件事就是找出需要时间的事情。
这很简单。只需暂停几次,看看它在做什么。
如果它主要在calculate next point
,你应该看到它在那里做了什么,因为那是时间的流逝。
(我假设你明白,通过“in”我的意思是“在堆栈上”。)
如果它主要在SetPixel
中,当你暂停它时,请查看反汇编窗口。
如果它花了很多时间在例程的序言/后记中,那么应该内联。
如果它花了很多时间在colorBuffer
的实际移动指令中,那么你就会遇到缓存问题。
如果它花费了很多时间在索引计算的代码中y * width + x
,那么你可能想看看你是否可以某种方式使用你步入的初始化指针。
如果你做了什么,你应该再做一遍,因为你可能已经发现了另一个机会来进一步加快它。