編輯:原始問題仍包含在下面,但我決定重新標題的形式,將在開發人員在各種情況下更有用,其中一些描述在我的回答如下,因爲原來問題的解決方案竟然提供了更廣泛的應用領域。使用任意QML項目作爲緩存圖像源
我有一組應用程序的灰度圖標,並且要求用戶可以更改圖標顏色。
因此,顯而易見的解決方案是使用QtGraphicalEffects
中的股票Colorize
元素。
該效果本身有一個cached
屬性 - 緩存該特定效果的結果,以便它不被連續計算。但是,這僅適用於特定的效果實例,這意味着如果有多個圖標實例,並且每個實例都具有着色效果,則不會在不同實例之間共享此緩存。
顯然,考慮到所有圖標的大小和顏色都相同,因此可以重複使用一個緩存,從而節省VRAM和GPU時間。
所以最大的問題是如何重用單一緩存的單一效果並多次顯示它而沒有任何開銷。
此外,前面的問題是關於我用彩色圖標拍攝的當前課程。但是,我可能會缺少另一種方法。當然,效率是關鍵,但簡單也是我們想要的,我的意思是我可以想到幾種低效率的方法可以非常有效地做到這一點,但它們都需要更復雜的低級別實現,它們不可能在QML中實現。
在我的情況下,兩個圖標的顏色和大小可以改變在運行期間,所以我將不得不查看是否可以使用綁定來自動化該過程。但我不得不承認,這種解決方案並不理想,因爲它不會保留在VRAM中 - 從''grabToImage()'從VRAM複製到RAM,只有在用作圖像源時,才能將其複製回VRAM。最好省略那些實際上不必要的,並且已知是相對較慢的轉移。 – dtech
@ddriver尼斯,你是對的。如果您需要另一種方法,我只能推薦我在Docs中找到的有關'Item.grabToImage()'的內容:_注意:該函數會將項目渲染到離屏表面並將該表面從GPU內存複製到CPU內存中,這可能相當昂貴。對於「實時」預覽,使用圖層或ShaderEffectSource._ –
昨天晚上睡覺後,我實際上想出了一個使用ShaderEffectSource的可能解決方案,但尚未測試它是否可用。如果成功,我會在獲得空閒時間後發佈測試。 – dtech