67.Harmonyos NEXT 圖片預覽組件之性能優化策略

溫馨提示:本篇博客的詳細代碼已發布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下載運行哦!

Harmonyos NEXT 圖片預覽組件之性能優化策略

文章目錄

  • Harmonyos NEXT 圖片預覽組件之性能優化策略
    • 效果預覽
    • 一、性能優化概述
      • 1. 性能優化的關鍵指標
    • 二、懶加載實現
      • 1. CommonLazyDataSourceModel實現原理
      • 2. LazyForEach組件的應用
      • 3. 緩存控制策略
    • 三、渲染優化
      • 1. 矩陣變換優化
      • 2. 圖片適配策略
      • 3. 渲染屬性優化
    • 四、內存管理
      • 1. 資源釋放策略
      • 2. 圖片加載優化
    • 五、交互性能優化
      • 1. 事件處理優化
      • 2. 動畫性能優化
    • 六、性能優化建議
      • 1. 圖片資源優化
      • 2. 組件配置優化
      • 3. 監控與調優
    • 七、總結

效果預覽

一、性能優化概述

圖片預覽組件在處理大量高清圖片時,性能優化顯得尤為重要。本文將詳細介紹圖片預覽組件中采用的性能優化策略,包括懶加載實現、內存管理、渲染優化等方面,幫助開發者構建高性能的圖片預覽功能。

1. 性能優化的關鍵指標

在圖片預覽組件中,我們主要關注以下性能指標:

性能指標說明優化方向
內存占用圖片加載和緩存占用的內存懶加載、資源釋放
渲染性能圖片顯示和交互的流暢度矩陣變換、渲染優化
加載速度圖片加載和切換的速度預加載、緩存策略
交互響應手勢操作的響應速度事件處理優化

二、懶加載實現

1. CommonLazyDataSourceModel實現原理

圖片預覽組件使用CommonLazyDataSourceModel實現圖片的懶加載,其核心原理是:

export class CommonLazyDataSourceModel<T> extends BasicDataSource<T> {private dataArray: T[] = [];public totalCount(): number {return this.dataArray.length;}public getData(index: number): T {return this.dataArray[index];}public clearAndPushAll(data: T[]): void {this.dataArray = [];this.dataArray.push(...data);this.notifyDataReload();}
}

懶加載數據源模型繼承自BasicDataSource,實現了IDataSource接口,提供了數據變化通知機制。當數據發生變化時,會通知LazyForEach組件更新UI。

2. LazyForEach組件的應用

List({ scroller: this.listScroll, space: this.listSpace }) {LazyForEach(this.lazyImageList, (imageUrl: string, index: number) => {ListItem() {PicturePreviewImage({imageUrl: imageUrl,// 其他參數...})}.width("100%")})
}

LazyForEach組件只會渲染當前可見的圖片項,而不是一次性加載所有圖片,大大減少了內存占用和初始加載時間。

3. 緩存控制策略

.cachedCount(1)

通過設置List組件的cachedCount屬性,控制緩存的圖片數量,避免過多的內存占用。在實際應用中,可以根據設備性能和圖片大小調整這個值。

三、渲染優化

1. 矩陣變換優化

圖片預覽組件使用matrix4矩陣變換實現圖片的縮放和旋轉,而不是直接修改圖片尺寸,這種方式具有以下優勢:

this.matrix = matrix4.identity().scale({x: this.imageScaleInfo.scaleValue,y: this.imageScaleInfo.scaleValue,
}).rotate({x: 0,y: 0,z: 1,angle: this.imageRotateInfo.currentRotate,
}).copy();
  1. 高效渲染:矩陣變換由GPU加速,性能更高
  2. 內存節約:不需要創建多個不同尺寸的圖片實例
  3. 精確控制:可以實現精確的縮放和旋轉效果

2. 圖片適配策略

calcImageDefaultSize(imageWHRatio: number, windowSize: window.Size): image.Size {let width = 0let height = 0;if (imageWHRatio > windowSize.width / windowSize.height) {// 圖片寬高比大于屏幕寬高比,圖片默認以屏幕寬度進行顯示width = windowSize.width;height = windowSize.width / imageWHRatio;} else {height = windowSize.height;width = windowSize.height * imageWHRatio;}return { width: width, height: height };
}

組件會根據圖片和屏幕的寬高比,計算最適合的顯示尺寸,避免不必要的縮放操作,提高渲染性能。

3. 渲染屬性優化

Image(this.imageUrl).width(this.imageWH === ImageFitType.TYPE_WIDTH ? $r("app.string.imageviewer_image_default_width") : undefined).height(this.imageWH === ImageFitType.TYPE_HEIGHT ? $r("app.string.imageviewer_image_default_height") : undefined).aspectRatio(this.imageWHRatio).objectFit(ImageFit.Cover).autoResize(false).transform(this.matrix).offset({x: this.imageOffsetInfo.currentX,y: this.imageOffsetInfo.currentY})

組件使用了多種渲染優化技術:

  1. 按需設置寬高:只設置一個維度,另一個通過aspectRatio自動計算
  2. 禁用自動調整大小:設置autoResize為false,避免不必要的布局計算
  3. 適當的objectFit模式:使用Cover模式確保圖片能夠正確顯示

四、內存管理

1. 資源釋放策略

resetCurrentImageInfo(): void {animateTo({duration: this.restImageAnimation}, () => {this.imageScaleInfo.reset();this.imageOffsetInfo.reset();this.imageRotateInfo.reset();this.matrix = matrix4.identity().copy();})
}

當圖片切換時,組件會重置前一張圖片的狀態,釋放不必要的資源,避免內存泄漏。

2. 圖片加載優化

.onComplete((event: ImageLoadResult) => {if (event) {this.initCurrentImageInfo(event)}
})

組件在圖片加載完成后才初始化相關信息,避免在加載過程中進行不必要的計算,提高性能。

五、交互性能優化

1. 事件處理優化

PanGesture({ fingers: 1 }).onActionUpdate((event: GestureEvent) => {if (this.imageWH != ImageFitType.TYPE_DEFAULT) {if (this.eventOffsetX != event.offsetX || event.offsetY != this.eventOffsetY) {this.eventOffsetX = event.offsetX;this.eventOffsetY = event.offsetY;this.setCrossAxis(event);this.setPrincipalAxis(event);}}})

組件通過比較前后事件的偏移量,避免處理重復的事件,減少不必要的計算和渲染。

2. 動畫性能優化

export function runWithAnimation(fn: Function, duration: number = 300) {animateTo({duration: duration,curve: Curve.Ease,iterations: 1,playMode: PlayMode.Normal,}, fn);
}

組件使用animateTo API實現平滑的動畫效果,該API由系統優化,性能更高。同時,通過設置合理的動畫參數,避免過于復雜的動畫效果。

六、性能優化建議

1. 圖片資源優化

在使用圖片預覽組件時,建議對圖片資源進行優化:

  1. 合適的分辨率:根據顯示需求選擇合適的圖片分辨率,避免過大的圖片
  2. 圖片壓縮:使用適當的壓縮算法減小圖片文件大小
  3. 圖片格式:選擇高效的圖片格式,如WebP、HEIF等

2. 組件配置優化

根據實際需求調整組件配置,提高性能:

  1. 緩存數量:根據設備性能和內存情況調整cachedCount值
  2. 預加載策略:根據用戶行為預測可能查看的圖片,提前加載
  3. 動畫參數:調整動畫持續時間和曲線,平衡流暢度和性能

3. 監控與調優

在實際應用中,建議進行性能監控和調優:

  1. 內存監控:監控應用內存使用情況,及時發現內存泄漏
  2. 性能分析:使用性能分析工具找出性能瓶頸
  3. 用戶反饋:收集用戶反饋,針對性地進行優化

七、總結

圖片預覽組件通過懶加載實現、矩陣變換優化、內存管理和交互性能優化等策略,實現了高性能的圖片預覽功能。這些優化策略不僅提高了組件的性能,還改善了用戶體驗。

在實際應用中,開發者可以根據具體需求和設備性能,調整組件配置和優化策略,進一步提高性能。同時,持續的性能監控和調優也是保持組件高性能的關鍵。

通過本文介紹的性能優化策略,開發者可以更好地理解和使用圖片預覽組件,構建高性能的圖片預覽功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/73359.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73359.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73359.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言中的字符串與數組的關系

在C語言中,字符串和數組之間有著緊密的關系。理解它們的區別和聯系對于編寫高效且可靠的代碼至關重要。在本篇博文中,我們將詳細分析字符串和數組在C語言中的概念、它們的關系以及如何在編程中應用它們。 一、字符串與數組的基礎知識 1.1 數組概念 在C語言中,數組是一組相…

56.HarmonyOS NEXT 登錄模塊開發教程(十):總結與展望

溫馨提示&#xff1a;本篇博客的詳細代碼已發布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下載運行哦&#xff01; HarmonyOS NEXT 登錄模塊開發教程&#xff08;十&#xff09;&#xff1a;總結與展望 文章目錄 HarmonyOS NEXT 登錄模塊開發教程&#xff08;十&a…

添加 ChatGPT/Grok/Gemini 到瀏覽器搜索引擎

添加 ChatGPT/Grok/Gemini 到瀏覽器搜索引擎 添加 ChatGPT/Grok/Gemini 到瀏覽器搜索引擎如何添加步驟 1: 打開瀏覽器設置步驟 2: 添加新搜索引擎步驟 3: 保存設置 注意事項 添加 ChatGPT/Grok/Gemini 到瀏覽器搜索引擎 在使用 ChatGPT/Grok/Gemini 進行對話時&#xff0c;每次…

【數據分享】2000—2024年我國省市縣三級逐月歸一化植被指數(NDVI)數據(Shp/Excel格式)

之前我們分享過2000—2024年逐月歸一化植被指數&#xff08;NDVI&#xff09;柵格數據&#xff08;可查看之前的文章獲悉詳情&#xff09;&#xff0c;該數據來源于NASA定期發布的MOD13A3數據集&#xff01;很多小伙伴拿到數據后反饋柵格數據不太方便使用&#xff0c;問我們能不…

oracle中OS BLOCK的含義

在Oracle數據庫中&#xff0c;OS BLOCK&#xff08;操作系統數據塊&#xff09;是指操作系統層面上的數據塊&#xff0c;它與Oracle數據庫內部的邏輯存儲單元BLOCK&#xff08;數據塊&#xff09;有所區別但密切相關。以下是對OS BLOCK的詳細解釋&#xff1a; 定義與概念 OS BL…

深入理解Linux網絡隨筆(七):容器網絡虛擬化--Veth設備對

深入理解Linux網絡隨筆&#xff08;七&#xff09;&#xff1a;容器網絡虛擬化 微服務架構中服務被拆分成多個獨立的容器&#xff0c;docker網絡虛擬化的核心技術為&#xff1a;Veth設備對、Network Namespace、Bridg。 Veth設備對 veth設備是一種 成對 出現的虛擬網絡接口&…

電氣制作行業

電氣制作是一個涉及多種技能和工藝的領域&#xff0c;主要包括電氣設備的組裝、布線、調試等工作。以下是電氣制作的一般流程和相關要點&#xff1a; 設計與規劃 - 需求分析&#xff1a;明確電氣設備的功能、性能要求&#xff0c;以及使用環境、安全標準等因素。 - 電路設計…

【Flutter】數據庫實體類構造函數加密注意事項

源代碼&#xff1a; AccountEntity( {required String account, required String password,}) : account encrypter.encrypt(account,iv: iv).base64, password encrypter.encrypt(password,iv: iv).base64,; 解密代碼&#xff1a; static final encrypter Encrypter(AES…

PMP沖刺每日一題(30)

試題1 標題&#xff1a;在項目執行期間&#xff0c;一名團隊成員識別到由以前未被識別為項目相關方的職能經理提交了新需求。項目經理應該怎么做? A、與項目發起人開會&#xff0c;獲得反饋 B、啟動實施整體變更控制過程 C、對需求執行成本效益分析 D、將該職能經理添加進溝通…

一文講通鎖標記對象std::adopt_lock盲點

一文講通鎖標記對象std::adopt_lock盲點 1. 核心概念2. 代碼詳解1. 單個鎖2. 多重鎖(可以用來預防死鎖)3. 條件變量的互斥控制4. 復雜示例: 多生產者-多消費者模型(超綱了&#xff0c; 可不看&#xff0c;哈哈哈哈) 3. 小結 1. 核心概念 在C中&#xff0c; std::adopt_lock是一…

LVI-SAM、VINS-Mono、LIO-SAM算法的閱讀參考和m2dgr數據集上的復現(留作學習使用)

ROS一鍵安裝參考&#xff1a; ROS的最簡單安裝——魚香一鍵安裝_魚香ros一鍵安裝-CSDN博客 opencv官網下載4.2.0參考&#xff1a;https://opencv.org/releases/page/3/ nvidia驅動安裝:ubuntu18.04 安裝顯卡驅動 - 開始戰斗 - 博客園 cuda搭配使用12 cuda安裝1&#xff1a;Ub…

基于jspm校園安全管理系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 隨著信息時代的來臨&#xff0c;過去信息校園安全管理方式的缺點逐漸暴露&#xff0c;本次對過去的校園安全管理方式的缺點進行分析&#xff0c;采取計算機方式構建校園安全管理系統。本文通過閱讀相關文獻&#xff0c;研究國內外相關技術&#xff0c;提出了一種集安全教…

基于NXP+FPGA軌道交通3U機箱結構牽引控制單元

基于NXPFPGA軌道交通異步電機牽引控制單元(TCU-IM) 異步電機牽引控制單元&#xff08;TCU-IM&#xff09;用于牽引逆變器-異步電機構成的牽引電傳動系統&#xff0c;可采用車控或架控方式。執行高性能異步電機復矢量控制策略&#xff0c;具有響應迅速、有效可靠的防空轉滑行控制…

《CircleCI:CircleCI:解鎖軟件開發持續集成(CI)和持續部署(CD)高效密碼》:此文為AI自動生成

《CircleCI&#xff1a;CircleCI&#xff1a;解鎖軟件開發持續集成&#xff08;CI&#xff09;和持續部署&#xff08;CD&#xff09;高效密碼》&#xff1a;此文為AI自動生成 一、CircleCI 初印象 在當今軟件開發的快節奏賽道上&#xff0c;持續集成&#xff08;CI&#xff…

基于MySQL有用戶管理的音樂播放器

基于MySQL的音樂器 帶有用戶登錄功能驗證用戶身份&#xff0c;用戶注冊等操作還有用戶音樂列表&#xff0c;以及增刪查改操作 INSERT into users(username,passwd,phone_number,created_time,role) VALUES(‘張三’,‘123456’,‘123’,‘2025-3-11’,‘1’) 三張表&#xf…

差分專題練習 ——基于羅勇軍老師的《藍橋杯算法入門C/C++》

一、1.重新排序 - 藍橋云課 算法代碼&#xff1a; #include <bits/stdc.h> using namespace std; const int N 1e5 3;int a[N], d[N], cnt[N];int main() {int n; scanf("%d", &n);for (int i 1; i < n; i) scanf("%d", &a[i]);int m…

AI+視頻監控電力巡檢:EasyCVR視頻中臺方案如何賦能電力行業智能化轉型

隨著電力行業的快速發展&#xff0c;電力設施的安全性、穩定性和運維效率變得至關重要。傳統視頻監控系統在實時性、智能化及多系統協同等方面面臨嚴峻挑戰。EasyCVR視頻中臺解決方案作為一種先進的技術手段&#xff0c;在電力行業中得到了廣泛應用&#xff0c;為電力設施的監控…

【哈希表與字符串的算法之路:思路與實現】—— LeetCode

文章目錄 兩數之和面試題01.02.判定是否為字符重排存在重復元素存在重復元素||字母異位詞分組最長公共前綴和最長回文子串二進制求和字符串相乘 兩數之和 這題的思路很簡單&#xff0c;在讀完題目之后&#xff0c;便可以想到暴力枚舉&#xff0c;直接遍歷整個數組兩遍即可&…

RabbitMQ入門:從安裝到高級消息模式

文章目錄 一. RabbitMQ概述1.1 同步/異步1.1.1 同步調用1.1.2 異步調用 1.2 消息中間件1.2.1 概念1.2.2 作用1.2.3 常見的消息中間件1.2.4 其他中間件 1.3 RabbitMQ1.3.1 簡介1.3.2 特點1.3.3 方式1.3.4 架構1.3.5 運行流程 二. 安裝2.1 Docker 安裝 RabbitMQ 三. 簡單隊列&…

kernel與modules解耦

一、耦合&#xff1a; linux的kernel與modules存在耦合版本匹配&#xff0c;在版本不匹配&#xff08;內核重新編譯后&#xff0c;或者驅動模塊編譯依賴的內核版本跟運行版本不匹配&#xff09;時候&#xff0c;會存在insmod 驅動模塊失敗的情形&#xff1b; 二、解耦&#xff…