gpt4 book ai didi

delphi - 如何在同时处理多个位图的同时提高性能?

转载 作者:行者123 更新时间:2023-12-03 15:50:38 29 4
gpt4 key购买 nike

概述

我正在填充 TListView,并将 ViewStyle 设置为 vsIcon。 Listview 连接到 TImageList,其中添加到 Listview 的每个项目都有其自己的图像,由相应的索引指定。

这个想法是能够自动化同时操作一系列位图的过程。每个位图都不同,但大小始终相同。

由于其工作方式的本质,向 ImageList 添加多少位图从来没有固定的大小或限制,唯一的限制是可用的系统内存。

问题

我遇到的问题与这些位图的操作性能有关。我所说的操作是指在位图上执行不同的图像处理技术,例如灰度、交换颜色、调整亮度等。

现在假设调整 1Mb 大小的位图的亮度需要 3 秒。如果 ImageList 总共有 10 个位图,那么此过程现在大约需要 30 秒。

(注意:我没有使用 GetTickCount 或其他方法测试速度,这些只是示例)。

考虑到这一事实,尽管正如我之前所说,此 ImageList 可以是任何大小,但处理时间可能会持续很长时间。

当我对这些位图执行任何操作时,我在循环内使用 GetBitmap 将每个位图发送到屏幕外缓冲区位图以执行操作,如下所示:

var
Bmp: TBitmap;
i: Integer;
begin
Bmp := TBitmap.Create;
try
ImageList1.BeginUpdate;
try
for i := 0 to ImageList1.Count - 1 do
begin
ImageList1.GetBitmap(i, Bmp);
Bmp.PixelFormat := pf24Bit;
// perform manipulation to Bmp here
ImageList1.Replace(i, Bmp, nil);
end;
finally
ImageList1.EndUpdate;
end;
finally
Bmp.Free;
end;
end;

在可以包含任何大小或数量的图像的 ImageList 上运行它,您也许可以理解这可能会很慢。

我正在寻找优化和改进执行此操作的方法,因为目前性能方面还远未达到可接受的程度。 BeginUpdateEndUpdate 在这里没有提供有值(value)的解决方案。我并不是在寻找任何奇迹,因为我知道大多数计算都需要很长的处理时间,我只需要在您可能提供的任何帮助和建议下尽可能减少这个时间。

最佳答案

就我个人而言,我会做一些事情:

0) 在分析代码之前不要执行任何操作,以确保这确实是速度变慢的原因。

1) 我不使用 TImageList,而是使用 TList 后代来存储图像。我不确定这是否会对性能产生直接影响,但 IIRC、TImageList 很大程度上依赖于内置的 Windows 图像处理,这可能会更慢。

2) 如果可能的话,按需更新图像而不是一起更新图像。

3) 将转​​换过程线程化,而不是在主线程中运行。如果您还使用 TList,这非常简单,因为您只需将列表项传递给线程(或线程队列)即可。这具有使用多个处理器(如果可用)的额外好处。

线程最有可能提高应用程序的感知性能,即使它实际上可能不会花费更少的时间。将其与按需转换相结合,您应该会看到巨大的改进。

预计到达时间:正如 Jerry 在评论中提到的,线程池是一个好主意。有some examples of this on the Embarcadero site ,如果您搜索他们的博客。

关于delphi - 如何在同时处理多个位图的同时提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10808241/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com