Delphi / C 构建器Windows 10 1709位图操作非常慢



有人遇到了这个问题吗?:

Windows 10更新后出现以构建1709。一定的系统UP时间(几个小时(,位图负载,成像库项目添加的速度非常慢。256x256的BMP在10秒内加载...在这样做时,它占100%的CPU核心。因此,已编译的应用程序正常在几秒钟内启动,现在在几分钟内启动!

我定期使用休眠/简历。显示司机已经超过一年了,所以这不是问题。

对此有任何评论?

更新:我发现使用canvas.pixels的代码会发生这种情况,因此可以更改,仍然很放慢。

更新2:替换扫描线操作加快了速度。最近的Windows补丁必须制作了帆布。像素的使用量确实很慢。

  1. gdi canvas Pixels[x][y]很慢。

    它执行许多您不知道的检查和颜色转换(实际上是数十个子电话,如果不是数百个(。这就是为什么它如此慢,以至于Win10都不重要。这种行为一直从Windows开始至少据我所知,这是 gdi not vcl 的问题(它与Borland/Embarcadero VCL无关(。因此,请勿大量使用Pixels[x][y]。即使清除1024x1024图像,这种方式也可能是某些机器上的第二个问题...

  2. 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数组

相关内容

  • 没有找到相关文章

最新更新