image - 为什么调用 TImage.Picture.LoadFromFile 后代码会继续?
问题描述
TImage
我正在对标准 VCL控件和各种其他第三方替代品的性能进行一些比较。我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;
TImage32
在两个图像控件中加载相同的 JPEG 文件在视觉上所花费的时间与例如与来自 Graphics32的比较所花费的时间一样长。两者都在此期间按预期阻止 UI,大约 4 秒。例如,GR32 报告 3734 毫秒,而标准版仅报告 16 毫秒。
为什么会这样?如何准确测量图像真正加载到TImage
.
解决方案
为什么会这样?
这两个控件的区别在于解压的处理方式。
- 当您以这种方式使用 VCL 图像控件时,会从文件中读取压缩数据,但实际解压缩仅在绘制控件时按需进行。
- 当您使用 graphics32 图像控件时,在加载文件时会发生解压缩。
为您的图像花费的几乎所有时间都用于解压缩步骤,这解释了您的时间差异。
如何准确测量图像真正加载到
TImage
.
imgStandard.Update
您可以在对 的调用之后立即插入对的调用LoadFromFile
,这将强制执行绘制周期,从而强制执行减压步骤。
推荐阅读
- html - 显示动态 HTML 表单元素,其中包含具有订单配置的数组对象
- azure - 使用应用程序洞察力的自定义应用程序仪表板
- google-data-studio - 使用 PATH_USER_PASS 的身份验证类型时不调用 getData()
- java - 结合使用 java 流的操作
- javascript - replaceText Google Apps 脚本将空白值传递给 Google Doc Merge
- python - 如何将'conans' python 包安装到系统中?
- react-native - React Native expo-cli 找不到模块 expo.js
- javascript - 如何跟踪单个 JavaScript 进程?
- reactjs - React 组件在“状态或道具变化”或“每个状态变化”上重新渲染,混淆官方文档
- r - 具有未知数量和变量名称的数据集上的多个 QQ 图