2014-04-17 45 views
0

我在Wp8(MVVM Light)上有一個Messenger應用程序。人們可以創建羣組對話並將圖像分配給該對話。除對話概述中的對話標題,對話本身以及對話詳情之外,還會顯示這些圖像。做高性能圖像更新

這些圖像被緩存。這是一個使用弱內存緩存和隔離內存緩存的雙層緩存。會話組的成員可以更改圖像。他們通過將新圖像上傳到服務器並將對話圖像更改消息發送到其他組消息來完成此操作。

現在我正在尋找一種性能優雅的方式來改變所有的圖像。我可以接收這些更新消息,並且可以輕鬆清除緩存,因此如果圖像重新綁定,它會加載新圖像,但問題在於導航返回堆棧中視圖中的已綁定圖像。當我導航回來時,我不想重置該視圖中的所有圖像,但只是那些過時的圖像。

我目前使用從緩存中檢索的ImageSource直接綁定圖像。我正在考慮一種imagecontainer,它擁有圖像源,並擁有一個全局imagecontainer管理器,用於保存容器的弱引用併爲圖像源提供可綁定屬性。每當我收到一個圖像更新時,我會檢查容器是否仍然存在對該圖像的弱引用,並在圖像源屬性中引發屬性更改事件。

有沒有其他的或更好的想法或者可能已經實現類似的東西的圖書館?

回答

0

您可以通過Artem來試用JetImageLoader。有一個blog post關於這個以及

+0

謝謝你。但是我已經知道這個庫(我的實現實際上是基於它的),但它不是一個緩存問題,它更像是一個通知 - 所有視圖 - 圖像 - 必須得到 - 反彈 - 問題。 – esskar

+0

好吧,現在我正試圖想象這個問題,你的對話圖像發生了變化,它被髮送到整個組中,它更新了每個成員/客戶端的緩存,現在只有更改後的圖像應該從緩存中更新,而不是其他對話的圖像一個成員可能已經發生並且僅在您可以看到所有對話的頁面中發生這種情況? – Abhilash

+0

爲了讓事情變得簡單,讓我們假設我只有在小組對話中。我從對話概覽導航到對話,再到對話細節。所有三個視圖都顯示對話圖像。現在有人更改圖像並通知到達。 現在我必須通知每個視圖(當前的視圖,實際上也是我的後臺中的視圖,特定的對話圖像已更改),因爲圖像不會自動重新加載。我可以在每個視圖/視圖模型中訂閱相同類型的事件,但可能會變得很難看。 – esskar

1

我對FFImageLoading庫(https://github.com/molinch/FFImageLoading)執行Windows(WinRT,UWP)實現時有這種操作的一些經驗。你也可以嘗試它 - 它有轉換支持(也是自定義)。

基本上你不想使用像WriteableBitmap這樣的東西,因爲它強制你在做一些像素/數據更新時使用UI線程。您想要使用byte[]int[]像素數據。經過所有像素數據處理後,您只需簡單地將其轉換爲WriteableBitmap即可。

大幫手如何做到這一點是在這裏:https://github.com/teichgraf/WriteableBitmapEx/(BitmapContext類)

你可以叫WriteableBitmap.Invalidate()以通知它的數據變化。您也可以爲多個視圖使用相同的WriteableBitmap圖像。它會加快速度(FFImageLoading的確如此)。

+0

謝謝,我會研究一下 – esskar