2017-07-05 241 views
-1

Image Qt Quick组件具有cache属性。然而,该财产的文件是非常少的。特别是,它没有说明缓存的用途,以及何时从缓存中加载图像。Image.cache有什么含义?

你能告诉我将Image.cache设置为true还是false的含义?

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

的文档做这样说:

图像缓存和共享的内部,所以如果几个图像项目具有相同的源,只有一个图像的副本将被加载。

但这是否意味着cache: true只有几个图像项目具有相同的来源时才有一个点?那么这是否意味着cache: false没有任何收益?

注意:在我测试的~1000张图片中,当我禁用缓存时,mem使用率从247MB下降到237MB。而这个应用程序也有很多其他的东西。所以我对这次胜利感到高兴。但我的问题站得住脚。

回答

0

您的差异在于误差范围。 QML对内存管理非常不方便。确保行为是一致的,然后再将其作为收益写出来。

什么文档实际上说,大约Image.cache是:图像

指定是否应该被缓存。默认值为 true。将缓存设置为false在处理大图像时非常有用,以确保它们不会以牺牲小图像为代价来缓存。

我认为这个图像将被保存在(假定)GPU RAM中,而非缓存图像则在需要时被传输。据我所知,所有Images,可见或不可见,都会占用系统RAM,这对我来说一直很奇怪,因为有一个图像仅用于在GPU后端进行可视化,实际上可以省略RAM中的副本并只将图像保存在VRAM中。

您引用的文档条目看起来像它涉及的场景图,该缓存是隐含的,这只是有意义的,因为没有理由存储相同的数据两次,它会refcount每个图像url,如果它使用多个它会解析为相同的单个数据包。 Image.cache与该缓存无关。

无论如何,我认为唯一可行的解​​决方案是赚取可观的收益,是做懒惰加载。使用矢量并不会节省很多,因为图像在内部被缓存为栅格化。使用更多的压缩图像会减少二进制大小,但它们仍然在内存中缓存解码。

如果你的图像是像灰度图标模板一样的东西,它们渲染效果非常好,用于有符号的距离场表示。在我的项目中,我设法将83 MB的图标减少到1。25 MB的SDF,没有质量损失,事实上,使用SDF,我可以更加放大GUI而不会出现锯齿边缘。而将SDF渲染为合适大小的栅格的着色器仅比平面着色器复杂一点,因此性能差异可以忽略不计,但由于这种情况在飞行中发生,因此我也可以从两者中获得相同数量的内存RAM和VRAM。