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.mzph.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…