有人遇到了这个问题吗?:
Windows 10更新后出现以构建1709。一定的系统UP时间(几个小时(,位图负载,成像库项目添加的速度非常慢。256x256的BMP在10秒内加载...在这样做时,它占100%的CPU核心。因此,已编译的应用程序正常在几秒钟内启动,现在在几分钟内启动!
我定期使用休眠/简历。显示司机已经超过一年了,所以这不是问题。
对此有任何评论?
更新:我发现使用canvas.pixels的代码会发生这种情况,因此可以更改,仍然很放慢。
更新2:替换扫描线操作加快了速度。最近的Windows补丁必须制作了帆布。像素的使用量确实很慢。
-
gdi canvas
Pixels[x][y]
很慢。它执行许多您不知道的检查和颜色转换(实际上是数十个子电话,如果不是数百个(。这就是为什么它如此慢,以至于Win10都不重要。这种行为一直从Windows开始至少据我所知,这是 gdi not vcl 的问题(它与Borland/Embarcadero VCL无关(。因此,请勿大量使用
Pixels[x][y]
。即使清除1024x1024
图像,这种方式也可能是某些机器上的第二个问题... -
vcl/gdi bitmap
ScanLine[y]
这是 Borland/Embarcadero 特定(在Pure GDI 上,您需要使用位锁定(。每个位图都有此属性/函数,该属性/函数将指针返回到任何
y
的位图的原始数据。它与Pixels[y][x]
一样慢,但是如果您的位图不更改其像素格式,也没有调整大小,则指针仍然相同。这可以用于直接像素访问,而无需任何性能命中。您只需记住每个位图大小的所有线条/重新加载到自己的数组中。之后只使用它。通常,如果正确使用,则最大的
~10000x
倍,然后Pixels[x][y]
。我通常以 c 的方式将
ScanLine
指针复制到我自己的数组。// ok lests have some bitmap Graphics::TBitmap *bmp=new Graphics::TBitmap; bmp->Width=100; bmp->Height=100; // this is needed for direct pixel access after any LoadFromFile, Assign or resize bmp->HandleType=bmDIB; // allows use of ScanLine bmp->PixelFormat=pf32bit; // 32bit the same as int so we can use int* for pixels pointer DWORD **pyx=new DWORD*[bmp->Height]; for (int y=0;y<bmp->Height;y++) pyx[y]=(DWORD*)bmp->ScanLine[y]; // now we can render pixels fast like this: pyx[10][20]=0x0000FF00; // green dot at x=20, y=10 // and also read it back fast: DWORD col=pyx[10][20];
所以将其移植到Delphi。只需提防某些像素格式,颜色为 RGB 而不是 bgr (或VICE反之亦然(/strong>颜色顺序(尤其是预定义的颜色(。
由于没有检查,所以请勿访问位图外它很可能会违反访问权限。
,最后不要忘记在不再需要(或在新分配之前(释放
pyx
数组