HarmonyOS 性能優化

如何合理使用動效來獲得更好的性能

  1. 組件轉場動畫使用 transition

    • 推薦使用轉場動畫(transition)而不是組件動畫(animateTo),因爲 transition 只需要在條件改變時更新一次,而 animateTo 需要在動畫前後做兩次屬性更新,導致性能開銷更大。
    • 反例:通過改變透明度屬性並使用 animateTo 來隱藏和顯示組件。
    • 正例:直接使用 transition 動畫,通過改變透明度實現組件的出現與消失。
 
  1. 組件佈局改動時使用圖形變換屬性動畫

    • 當需要改動組件的佈局顯示時,推薦使用圖形變換屬性(如平移、旋轉、縮放)而不是改動佈局屬性(如 width、height、layoutWeight),因爲圖形變換不會重新觸發佈局,從而減少性能開銷。
    • 反例:通過設置佈局屬性 width 和 height 來改變組件大小。
    • 正例:通過設置圖形變換屬性 scale 來改變組件大小。
 
  1. 動畫參數相同時使用同一個 animateTo

    • 如果多個屬性需要使用相同的動畫參數進行動畫處理,應該將它們合併到一個 animateTo 閉包中,以減少組件更新的次數。
    • 反例:將相同動畫參數的狀態變量更新放在不同的動畫閉包中。
    • 正例:將相同動畫參數的動畫合併在一個動畫閉包中。
 
  1. 多次 animateTo 時統一更新狀態變量

    • 在執行多個 animateTo 之前,應該統一更新狀態變量,避免在執行動畫之間產生冗餘的狀態更新。
    • 反例:在兩個 animateTo 之間更新狀態變量。
    • 正例 1:在 animateTo 之前使用原始狀態,讓動畫從原始狀態過渡到指定狀態。
    • 正例 2:在 animateTo 之前顯式指定所有需要動畫的屬性初值,統一更新到節點中,然後再執行動畫。

應用性能提升

1. 使用數據懶加載

 
在處理長列表數據時,傳統的循環渲染方式會一次性加載所有列表元素,這會導致頁面啓動時間過長,影響用戶體驗,並增加服務器壓力。爲了解決這個問題,推薦使用 DataSource 來實現數據懶加載技術。通過懶加載,只有當數據進入可視區域時才加載和渲染,這樣可以顯著提高頁面的響應速度和性能。
 

2. 設置 List 組件的寬高

 
在使用 Scroll 容器組件嵌套 List 組件加載長列表時,如果沒有指定 List 的寬高尺寸,List 將會佈局其所有子組件,這會導致性能問題。通過設置 List 的寬高,可以確保只佈局 List 顯示區域內的子組件,從而提高性能。
Scroll 嵌套 List 時:
  • List 沒有設置寬高,會佈局 List 的所有子組件。
  • List 設置寬高,會佈局 List 顯示區域內的子組件。
  • List 使用 ForEach 加載子組件時,無論是否設置 List 的寬高,都會加載所有子組件。
  • List 使用 LazyForEach 加載子組件時,沒有設置 List 的寬高,會加載所有子組件,設置了 List 的寬高,會加載 List 顯示區域內的子組件。

3. 使用條件渲染替代顯隱控制

 
使用 visibility 屬性控制組件的顯隱狀態時,即使組件不可見,它仍然會被重新創建,這會造成性能損耗。通過使用 if 條件渲染,可以避免組件的重新創建過程,從而提升性能。
 

4. 使用 Column/Row 替代 Flex

 
Flex 容器組件在默認情況下存在 shrink 屬性,這可能導致二次佈局,影響頁面渲染性能。通過使用 Column 和 Row 組件替代 Flex,可以避免二次佈局帶來的性能問題。
 

5. 減少應用滑動白塊

 
在應用中,滑動白塊是一個常見的性能問題。通過增大 List/Grid 控件的 cachedCount 參數,可以預加載更多的 item,減少白塊的出現。同時,如果需要請求網絡圖片,可以提前下載內容,以減少滑動時的白塊現象。

狀態管理優化

以下是文檔中提到的一些關鍵點:
 
  1. 使用@ObjectLink 代替@Prop 減少不必要的深拷貝
在父子組件間傳遞數值時,如果子組件不需要改變狀態變量的值,使用@ObjectLink 比@Prop 更優,因爲@Prop 會導致深拷貝,增加性能開銷。
 
  1. 不使用狀態變量強行更新非狀態變量關聯組件:開發者應避免通過改變自定義的 UI 狀態變量來帶動常規變量的更新,而應將相關成員變量用@State 裝飾,以便框架能夠檢測狀態變化並觸發 UI 更新。
 
  1. 精準控制狀態變量關聯的組件數:建議每個狀態變量關聯的組件數少於 20 個,以減少不必要的組件刷新,提高效率。
 
  1. 合理控制對象類型狀態變量關聯的組件數量:如果一個複雜對象被定義爲狀態變量,需要合理控制其關聯的組件數,避免“冗餘刷新”。
 
  1. 查詢狀態變量關聯的組件數:可以使用 HiDumper 工具查看狀態變量關聯的組件數,進行性能優化。
 
  1. 避免在 for、while 等循環邏輯中頻繁讀取狀態變量:應該在循環外面讀取狀態變量,避免在循環邏輯中頻繁讀取,以提高性能。
 

避免冗餘操作

 
  1. 避免在高頻回調中進行冗餘操作:在處理如滾動事件、觸摸事件等高頻回調時,應避免在回調函數內部執行冗餘的日誌記錄、Trace追蹤和耗時操作。這些操作會嚴重影響應用的性能和響應速度。
 
  1. 刪除冗餘Trace和日誌打印:在開發階段,日誌和Trace追蹤是重要的輔助工具,但在發佈版本中應移除這些冗餘的輸出,以避免不必要的性能開銷。
 
  1. 避免設置冗餘的系統回調監聽:如果回調函數體內不包含任何業務邏輯代碼,應將其刪除。註冊但未使用的回調會消耗系統資源,影響程序運行效率。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章