Image.cache有什么含义?

时间:2017-07-05 20:12:34

标签: image qt caching qml qtquick2

Image Qt Quick组件具有cache属性。但是,该财产的文件很少。特别是,它没有说明缓存的用途,以及从缓存加载图像的时间。

您能否告诉我将Image.cache设为真或假的含义?

我问,因为我很想通过在我的所有图像上设置cache: false来节省大量内存。

文档确实这样说:

  

图像在内部进行缓存和共享,因此如果多个图像项具有相同的源,则只会加载一个图像副本。

但这是否意味着cache: true只有几个Image项具有相同来源时才有一个点?这是否意味着cache: false无法获得任何收益?

注意:在我的测试中,当我禁用缓存时,〜1000张图像内存使用率从247MB降至237MB。此应用程序还有很多其他内容。所以我对这场胜利很满意。但我的问题仍然存在。

1 个答案:

答案 0 :(得分:0)

你所拥有的差异在于误差范围。 QML对内存管理非常粗心。在将其作为增益写下之前,请确保行为一致。

该文档实际上对Image.cache的说法是:

  

指定是否应缓存图像。默认值为   真正。在处理大图像时,将缓存设置为false很有用,   确保它们不会以小ui为代价进行缓存   元素'图像。

我假设图像将保留在(可能)GPU RAM中,而非缓存图像则根据需要传输到那里。据我所知,所有Images,可见或不可见,将占用系统RAM,这对我来说一直很奇怪,因为只有用于在GPU后端可视化的图像实际上可以省略RAM中的副本只保留VRAM中的图像。

你引用的doc条目看起来像是关于scenegraph,缓存是隐式的,这只是有意义的,因为没有理由存储两次相同的数据,它会重新计算每个图像url,以便在多次使用时它将解析为相同的单个数据包。 Image.cache与该缓存无关。

无论如何,我说唯一可行的解​​决方案是获得相当大的收益是延迟加载。使用矢量不会为您节省太多,因为图像是内部缓存的栅格化。使用更多压缩图像将减小二进制文件大小,但它们仍然在内存中缓存解码。

如果您的图像是灰度图标模板之类的东西,它们可以很好地呈现签名的距离场表示。在我的项目中,我设法将价值83 MB的这类图标减少到1.25 MB的SDF而不会降低质量,事实上使用SDF我能够扩大GUI甚至更多而不会出现锯齿状边缘。将SDF渲染成适当大小的光栅的着色器只比平面颜色着色器复杂一点,因此性能差异可以忽略不计,但由于这种情况在运行中发生,我也可以从两者中节省相同的内存量。 RAM和VRAM。