bjwf:
仔细看了一下resize的部分,简单优化一下就能快很多.
[阅读: 938] 2007-11-07 08:28:09
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指令完成.
试图在互联网上划出国界的举动是愚蠢的!!!
把人当成猪羊圈养,草料永远都不够!把人当人待,人有无限的创造力! “人口减少一半,人们两倍富有”的观念为“一种非常糟糕的自甘堕落—这背后的潜台词是,似乎中国人是封闭围栏中的动物,对周围那些自己赖以生存的资源,除了咀嚼,别无办法。”
我的像册:
http://picasaweb.google.com/bjwf2000/
我的主页:
http://bjwf2000.googlepages.com/