【发布时间】:2009-07-09 09:04:36
【问题描述】:
我正在使用 c++,我想使用以下代码进行 alpha 混合。
#define CLAMPTOBYTE(color) \
if ((color) & (~255)) { \
color = (BYTE)((-(color)) >> 31); \
} else { \
color = (BYTE)(color); \
}
#define GET_BYTE(accessPixel, x, y, scanline, bpp) \
((BYTE*)((accessPixel) + (y) * (scanline) + (x) * (bpp)))
for (int y = top ; y < bottom; ++y)
{
BYTE* resultByte = GET_BYTE(resultBits, left, y, stride, bytepp);
BYTE* srcByte = GET_BYTE(srcBits, left, y, stride, bytepp);
BYTE* srcByteTop = GET_BYTE(srcBitsTop, left, y, stride, bytepp);
BYTE* maskCurrent = GET_GREY(maskSrc, left, y, width);
int alpha = 0;
int red = 0;
int green = 0;
int blue = 0;
for (int x = left; x < right; ++x)
{
alpha = *maskCurrent;
red = (srcByteTop[R] * alpha + srcByte[R] * (255 - alpha)) / 255;
green = (srcByteTop[G] * alpha + srcByte[G] * (255 - alpha)) / 255;
blue = (srcByteTop[B] * alpha + srcByte[B] * (255 - alpha)) / 255;
CLAMPTOBYTE(red);
CLAMPTOBYTE(green);
CLAMPTOBYTE(blue);
resultByte[R] = red;
resultByte[G] = green;
resultByte[B] = blue;
srcByte += bytepp;
srcByteTop += bytepp;
resultByte += bytepp;
++maskCurrent;
}
}
但是我发现它仍然很慢,合成两个 600 * 600 图像大约需要 40 - 60 毫秒。 有什么方法可以将速度提高到16ms以下?
任何机构可以帮助我加快这段代码的速度吗?非常感谢!
【问题讨论】:
-
你用的是什么编译器?你为什么平台开发这个软件?您愿意使用现成的工具吗?
-
我用的是VS2005,软件是为windows平台设计的。我愿意使用任何方法来加速这段代码。我想也许它可以加速很多
-
如果您在我的解决方案中编码其余 SIMD 指令时遇到问题,请告诉我
标签: c++ performance