中国开发网: 论坛: 程序员情感CBD: 贴子 578910
bjwf
仔细看了一下resize的部分,简单优化一下就能快很多.
1.前后分别有一个类似的循环:
for iy:=0 to aSrcBitmapHeight - 1 do
begin
aPointer := aSrcBitmap.ScanLine[iy];

for ix:=0 to aSrcBitmapWidth - 1 do
begin
aSrcBitmapBuf[iy*aSrcBitmapWidth + ix].B := aPointer[ix*3 + 0];
aSrcBitmapBuf[iy*aSrcBitmapWidth + ix].G := aPointer[ix*3 + 1];
aSrcBitmapBuf[iy*aSrcBitmapWidth + ix].R := aPointer[ix*3 + 2];
end;
end;

这两个循环看起来好象没有实际的意义,只是为中间计算时取值方便应该可以优化掉,而且也可以优化掉aSrcBitmapBuf和aTarBitmapBuf这两个不小的临时内存空间.

2.内层循环里有不少这样的语句:
if (syi < aSrcIY) and (syi > Trunc(aSrcIY + ScaleY ) - 1) then
begin
my := ScaleY
end else
if syi < aSrcIY then
begin
my := Trunc(aSrcIY) + 1 - aSrcIY;
end else
if syi > Trunc(aSrcIY + ScaleY ) - 1 then
begin
my := aSrcIY + ScaleY - Trunc(aSrcIY + ScaleY);
end else
begin
my := 1;
end;

其中 Trunc(aSrcIY+ScaleY),Trunc(aSrcIY)这样的函数调用 完全可以移到循环外面用临时变量只算一次.

3. colorR := colorR + ((srcColor ) and $FF) * mx * my / ScaleX / ScaleY;
colorG := colorG + ((srcColor shr 8) and $FF) * mx * my / ScaleX / ScaleY;
colorB := colorB + ((srcColor shr 16) and $FF) * mx * my / ScaleX / ScaleY;
这三语话里的 mx*my/ScaleX/ScaleY应该只算一次,存在临时变量里

4.上面三句话用行嵌入汇编的话,可以用一个SSE指令完成.

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录