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

标签 delphi delphi-xe

概述

我正在填充 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/

相关文章:

delphi - 用于Delphi XE2的Windows和Mac XML库

sqlite - FireDac 获取受 FDQuery.execsql 命令影响的行数

delphi - 如何防止TStrings.SaveToStream写入BOM?

delphi - 如何在Delphi中有效地使用接口(interface)进行内存管理

delphi - 使用Delphi windows api获取文件信息

delphi - 如何允许表单接受文件删除而不处理 Windows 消息?

delphi - 为什么CREATE TABLE看似成功,但在DBX下却失败?

delphi - 如何增加外部调试器可视化工具可以显示的字符串的大小?

delphi - 记录在记录中(无法初始化)

delphi - Delphi DCU 文件保存在哪里?