图像缓存的含义是什么?

3
Image Qt Quick组件有一个cache属性。然而,该属性的文档非常简略。特别是它没有说明缓存用于什么以及何时从缓存中加载图像。
你能告诉我将Image.cache设置为true或false的影响吗?
我之所以问这个问题,是因为我想通过在所有图片上设置cache: false来节省大量内存。
文档确实说过:
图像被缓存并在内部共享,所以如果几个Image项目具有相同的源,则只会加载一份图像副本。
但这是否意味着只有当几个Image项目具有相同的源时,cache: true才有意义?这是否意味着cache: false根本没有任何收益?
注意:在我的测试中,禁用缓存后,使用~1000张图片的内存使用量从247MB降至237MB。此应用程序还有很多其他内容。所以我对这个胜利感到满意。但我的问题仍然存在。
1个回答

1
你们之间的区别在于误差范围。QML对内存管理非常粗心大意。在将其视为利润之前,请确保行为一致。
文档实际上关于Image.cache的说明是:
指定图像是否应该被缓存。默认值为true。当处理大型图像时,将cache设置为false很有用,以确保它们不会以小的'ui元素'图像的代价被缓存。
我认为这意味着图像将在(可能是)GPU RAM中保留,而非缓存的图像则在需要时传输到那里。据我所知,所有的Images,无论可见与否,都会占用系统RAM,这对我来说一直很奇怪,因为仅用于在GPU后端上可视化的图像实际上可以省略RAM中的副本,并且仅将图像保留在VRAM中。
您引用的文档条目似乎涉及场景图,其中缓存是隐含的。这只有意义,因为没有理由存储相同的数据两次,它将对每个图像网址进行refcount,因此如果多次使用它,则会解决为相同的单个数据包。 Image.cache与该缓存无关。
无论如何,我认为唯一可行的解决方案是使用懒加载。使用向量图不会节省太多空间,因为图像在内部被缓存成光栅化格式。使用更压缩的图像可以减少二进制文件大小,但它们仍然会在内存中被缓存解码。
如果你的图像是灰度图标模板之类的东西,那么将它们渲染成有符号距离场表示形式非常好。在我的项目中,我将83 MB的这样的图标减少到了1.25 MB的SDF,而且没有损失质量,事实上,使用SDF,我能够将GUI扩大更多,而不会出现锯齿状的边缘。将SDF渲染成适当大小的光栅的着色器只比纯色着色器复杂一点点,所以性能差异可以忽略不计,但由于这是即时发生的,我也从RAM和VRAM中节省了同样数量的内存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接