- 本篇針對 Sweetshot 這個 App 的開發經驗做分享 -

(Develop with Windows Phone SDK 8.0 on Visual Studio 2013 Ultimate)

Visual Studio 有很棒的效能檢測工具讓開發者使用 :

App profiling  

但剛開始開發 App 的時候都沒有用, 直到 App 近乎完成在做大量的整合測試的時候發現會一直發生 OOM (Out of Memory) Exception.

問題來了, 是什麼原因導致 OOM ?! 可能因素非常多..  有可能是 Memory Leak, 有可能是一瞬間載入太多的 Data ..

因為 Sweetshot 是一款照片上傳, 呈現的 App, 會用到很多的 BitmapImage ..

Sweetshot  

BitmapImage 又是非常的吃記憶體, 因此 Alan 便開始展開漫長的 Performance Tuning (效能調教) 的過程 :

1. 分別測試單一功能運行時的效能

2. 測試功能串接後的效能

後來發現問題在於 :

1. Server 端沒有存照片的縮圖, 所以當我向 Server 要圖的時候都是給我原始解析度而不是我畫面上顯示所需要的 100*100 之類的小圖, 導致一次載入多張圖檔的時候瞬間就頂到單一 App 的記憶體上限 (512MB 的裝置上限為 150MB, 1GB 的裝置上限為 300MB)

2. 當在使用 Image control with BitmapImage 的時候, 當 Image control 被消滅但其 Source : BitmapImage 不會馬上被消滅

解決方案 :

1. 從 Server 下載原圖, 然後存成兩張.. 一張小張的縮圖和一張原圖, 在上傳照片到 Server 的時候也是, 存小張的圖和縮過的圖在 local 端, 並上傳需要雲端分享的 Copy 到伺服器上保存 (short term solution)

2. 在 release Image 的時候要對其 Source 做特殊的 Dispose 處理

心得 :

效能調教最好在前期就開始進行, 這樣在有發生 Memory Leak 的時候可以及早發現並解決, 假如等到 App 都架構完成了, 會比較不容易找到問題並解決問題, 專案時程上也會因為效能這程咬金變得棘手導致加班爆肝的機率變高

------------------

Thinking.jpg 

筆者:Alan Feng

大學由資管系畢業後便投入職場,先後擔任程式設計師,系統設計師,系統分析師,專案管理師等職務。

曾服務於資訊服務業,筆電代工設計公司,和遊戲公司的專案管理師/程式設計師~目前在廣告行銷公關業擔任系統分析師。

持有國際 PMP 證照並持續努力累積社會大學的經驗中。

 


, , , ,
創作者介紹

專案管理,獨立開發,禪。

Alan Feng 發表在 痞客邦 PIXNET 留言(3) 人氣()


留言列表 (3)

發表留言
  • Pou Mason
  • 謝謝分享,很棒的觀念。
    很想知道
    「2. 在 release Image 的時候要對其 Source 做特殊的 Dispose 處理. 」
    這個作法要怎麼用呢?謝謝。
  • 假設有一個 Image image 已經 assign 了一個 BitmapImage 作為 Source,

    1. 取回 Image 的 Source
    BitmapImage bi = image.Source;

    2. 將 BitmapImage 的 UriSource 設為 null 然後再將 BitmapImage 設為 null
    bi.UriSource = null;
    bi = null;

    3. 最後將 Image 設為 null
    image = null;

    如此在 GC.Collect() 的時候才會馬上被回收, 以上為多次測試的結論.. 不一定是完全正確的作法, 請參考

    假如您有更好的做法也請不吝分享 :)

    Alan Feng 於 2013/12/27 17:15 回覆

  • EliteGroupPM
  • 感謝! 有機會可多交流