我正在写一个文件管理器。当它打开时,UI会冻结一段时间。我对它进行了分析,发现缓慢的函数是SHGetFileInfo
。
SHFILEINFO shinfo;
SHGetFileInfo(FullPath.c_str(), NULL, &shinfo, sizeof(shinfo),
SHGFI_ICON | SHGFI_LARGEICON))
此外,即使有数百个文件夹,程序运行得足够快,但当至少有一个可执行文件时,程序变得非常慢。我认为从这些文件加载图标是一项繁重的任务,因为必须加载资源。
我看到当Windows资源管理器加载文件夹时,除可执行文件之外的所有图标都是正确的,可执行文件具有默认图标(命令行实用程序的图标)。然后他们的图标会在几秒钟内变得正确。
我的问题是资源管理器如何确定哪些图标加载速度快,哪些图标速度慢?我认为检查扩展程序.exe
是不可靠的,因为可能会assoc .foo=exefile
或将另一个扩展程序的图标设置为%1
等。
答案 0 :(得分:2)
Windows shell使用了几种机制来处理这种性能损失:
我认为如果您希望文件管理器与Explorer一样可用,那么您需要实现类似的优化。或许SHGetFileInfo
已经利用了系统图标缓存。
这些与shell图标性能相关的文章可能对您有用: