Image
Qt Quick组件具有cache
属性。但是,该财产的文件很少。特别是,它没有说明缓存的用途,以及从缓存加载图像的时间。
您能否告诉我将Image.cache
设为真或假的含义?
我问,因为我很想通过在我的所有图像上设置cache: false
来节省大量内存。
文档确实这样说:
图像在内部进行缓存和共享,因此如果多个图像项具有相同的源,则只会加载一个图像副本。
但这是否意味着cache: true
只有几个Image项具有相同来源时才有一个点?这是否意味着cache: false
无法获得任何收益?
注意:在我的测试中,当我禁用缓存时,〜1000张图像内存使用率从247MB降至237MB。此应用程序还有很多其他内容。所以我对这场胜利很满意。但我的问题仍然存在。
答案 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。