繁体   English   中英

如何在存储速度很慢的系统上处理大型Qt资源文件?

[英]How to handle large Qt resource files on a system with a very slow storage?

嵌入式系统具有运行Qt Quick应用程序所需的硬件,具有良好的CPU和良好的GPU,但具有极慢的非易失性存储器。

由于GUI有很多图像,我有以下困境:

  • 如果我将图像放入qrc文件,它将被编译成可执行文件,因此应用程序加载速度非常慢。
  • 如果我按需将图像作为普通文件加载(并非所有图像都在每个菜单和对话框中都可见),只要打开这样的菜单或对话框,程序就会挂起一段时间,等待从闪存加载图像。
  • 手动管理单个图像(例如,在手动编写的后台线程中)似乎太费劲了,所以我希望有一个更优雅的解决方案。

有没有一种很好的方法来使用Qt资源管理系统在后台加载资源? 应该加载主GUI中使用的图像,同时启动画面显示一个很好的进度条,其余的可以在主应用程序启动后在后台静默加载。 如果我可以有选择地加载并释放某些资源文件(在应用程序的某些状态下不需要一些资源文件,那么一个很好的补充就是如此,如果我可以释放一些内存那就太好了)

有没有一种优雅的方法来解决这个Qt资源系统,或者我是否必须手动管理我的所有图像?

提一些笔记似乎很有帮助(根据我的经验):

  • 将用作接口资源(如图标)的资源图像应嵌入到默认的qrc资源文件中。 它们的尺寸应该很小。
  • 某些资源文件很大,不会经常加载。 这些资源可以作为外部文件动态加载。
  • 您应该加载异步大图像(使用asynchronous属性)。
  • 您应该使用Loader元素来加载大型/复杂组件。
  • 您可以使用UX解决方案/技巧使延迟不可见(如显示进度条,播放微动画,过渡......)。
  • 在我研究了几个小时之后,对于大型资源使用/不使用压缩的动态资源文件( rcc文件)或使用本机文件系统似乎是有帮助的。

因此,您不希望资源嵌入到应用程序中,因为这会使可执行文件膨胀并且加载速度太慢,并且您不希望应用程序外部的资源,因为它们加载速度太慢?

首先,作为可执行文件中的资源并不意味着您是准备在内存中使用的对象。 在大多数情况下,您仍然必须将该数据加载到Qt对象中,例如将图像文件加载到QImage 你仍然会得到那个延迟。 除非这部分数据在内存中分页,否则它不会比直接从磁盘读取更快。

你可以做的最好和最重要的事情是掩盖延迟。 只有在您知道每个应用程序状态需要哪些资源时才可以执行此操作,并且每次更改状态时,都会加载可以从当前状态进入的状态所需的所有数据。 这样就可以提前加载资源,希望在你进入需要的新状态之前。 缺点 - 您将不得不继续跟踪这些对象,并且您将有内存开销 - 因为您可能正在为多个状态加载数据但只输入一个。 好处 - 大多数加载可以对用户隐藏,并且您只预加载整个数据的子集,而不是所有数据。 当然,尽可能减少资源的占地面积是必须的。

除此之外,你无能为力。 如果您的存储速度很慢,那么最好的解决方案是升级它,如果可以的话,那就是第二好 - 对硬件的期望是切合实际的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM