我正在对标准 VCL TImage 控件和各种其他第三方替代品的性能进行一些比较。我正在使用 GetTickCount 来测量加载图像所需的时间。实际上大约需要 4 秒,但是 LoadFromFile() 几乎立即返回,令我惊讶!

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  FStart:= GetTickCount;
  imgStandard.Picture.LoadFromFile(txtFilename.Text);
  FEnd:= GetTickCount; //<-- Put a breakpoint here to observe immediate return in debug
  lblStandard.Caption:= IntToStr(FEnd-FStart)+' Msec';
end;

在两个图像控件中加载相同的 JPEG 文件在视觉上花费的时间与例如与 Graphics32 中的 TImage32 进行比较一样长。两者都按预期在此期间阻塞 UI,大约为 4 秒。例如,GR32 报告 3734 毫秒,而标准的仅报告 16 毫秒。

为什么会发生这种情况?如何准确测量图像真正加载到 TImage 所需的时间?

最佳答案



两个控件之间的区别在于如何处理减压。

  • 当你以这种方式使用VCL图像控件时,压缩数据是从文件中读取的,但实际的解压只是按需进行,当控件被绘制时。
  • 使用 graphics32 图像控件时,加载文件时会发生解压缩。

  • 几乎所有为您的图像花费的时间都用于解压缩步骤,这解释了您的时间差异。



    您可以在调用 imgStandard.Update 之后立即插入对 LoadFromFile 的调用,这将强制执行绘制循环,从而强制执行解压缩步骤。

    关于image - 为什么代码在调用 TImage.Picture.LoadFromFile 后继续?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59253927/

    10-10 16:56