Performance

- https://www.udacity.com/course/android-performance--ud825

App使用時,感覺畫面不流暢,或有lag情況發生是,因為人類大腦和眼睛對動態感知是有一定範圍的。在看電影時,是以24fps(frame per seconds)來讓腦和眼感到有連續流暢的畫面。

而Android流暢的定義為60fps, 換算為16ms\/frame。所以當畫面(view)經過手機上CPU and GPU calculate, draw and render view layout and action需在此範圍內,否則就會產生所謂的lag現象。 歸納起來,可能是以下狀況:

  • ANR(Application Not Responding):最常見,在通常情形下,當Main Thread(或稱為UI Thread)長期被占用,就會觸發此事件。

    • 在activity下,預設是5秒;BroadcastReceiver預設是10秒。
  • memory leak:常見,當某些錯誤的機制(程式碼),導致內部記憶體被長期占用(此記憶體暫存之內容,可能不在被程式碼所refreence使用),而不能即時被GC(Garbage Collection)。造成手機中可用記憶體越來越少,最後導致記憶體不足,Performance下降。

    • 限制每個Process內部暫存記憶體(Memory Cache)只有16M,超過就會跳出異常,俗稱的OOM(Out Of Memory)。在處理大量Bitmap時要注意此狀況,可使用弱引用(Weak Preference)。
    • 但也要避免GC過度操作(在同個frame頻繁create多次memory cache's data),導致OOM,影響到Main Thread操作。
  • 畫面(view)巢狀階層的深度太深【View Hierarchy】或是過度重疊畫面(Overdraw):

    • 在追求UI上炫麗的效果,常會在同一個區塊使用大量的重疊畫面。這樣的狀況會照成CPU和GPU需要經過大量的運算,而去繪製同樣的區塊。
    • 盡量使用RelativeLayout來取代LinearLayout達到相同的畫面效果。畫面階層盡量扁平化,避免使用重複的layout。
    • 若有重複的layout可使用<include>或是<merge>標籤達到 re-usable layout。
  • 避免多次 WakeLock手機,以節省手機電量消耗。做工具類App的要注意。

    • 可使用 Job Scheduler,將一些較不緊急的任務藉由 Job Scheduler 機制,集合所有不緊急的任務,在適當時間和網路下,一併處理,減少手機休眠時,被polling的次數。
  • 待補充!

results matching ""

    No results matching ""