2017-07-05 34 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。