Flutter快学快用24讲--23 架构原理:为什么 Flutter 性能更佳

这篇博客探讨了Flutter的性能优势,对比了Flutter与其他跨端技术框架如ReactNative和Weex的渲染原理。Flutter通过自渲染机制,实现与原生平台性能接近的体验。文章详细介绍了Flutter的渲染流程,包括vsync、渲染流程和关键函数,并提出了性能优化的建议,重点关注markNeedsPaint和markNeedsLayout函数的使用。

本课时将继续深入源码,学习 Flutter 渲染原理,特别是为什么 Flutter 可以保持比较好的性能体验。

性能优势

在这之前,业内一直都说 Flutter 的性能优于其他的跨端技术框架,并且基本与原生平台体验几乎一样。那么具体是怎么做到的呢?在了解 Flutter的自渲染原理之前,我们就先来看看原生平台 Android 与 iOS 是如何渲染 UI 的。经过前后对比之后,更能体现出其性能与原生几乎无差异的特点。

UI 渲染基本原理

我们先来讲解一个最基础的知识点,日常我们所看到的 UI 交互界面,操作系统是如何实现的,参考下图 1 的渲染过程。

Drawing 0.png

图1 系统 UI 界面绘制原理

从图 1 我们可以看到,一个界面显示出来,首先是经过了 CPU 的数据计算,然后将数据发送给到 GPU, GPU 再根据相应的数据绘制成像素界面,然后放入帧缓存区中,最终显示器定时从帧缓存区获取帧数据显示在显示器上。

在上面的渲染实现过程中,需要进行 CPU 和 GPU 之间的通信。因此,如何调度 GPU 是一个比较关键的点,目前有一套规范叫作 OpenGL,开发者可以通过这套规范,更方便、更高效地调用 GPU进行界面渲染。Android 和iOS 系统都在系统层面实现了这套功能,将其分别封装成 SDK API。而在 Flutter 中也实现了这套规则,也就是应用 OpenGL 规范封装了一套 Dart API,因此 Flutter 的渲染原理和 Android 以及 iOS 是一致的,所以在性能上基本没有区别。

了解了 Flutter 渲染原理以后,我们再来看看目前比较常用的两个跨端框架的渲染原理。

其他跨端技术框架渲染原理

目前比较常见的两个跨端技术框架,分别是 ReactNative 和 Weex。它们在原理上非常相近,因此这里单独介绍 ReactNative 的原理。我们先来看下图 2 的一个技术架构。

Drawing 2.png

图2 ReactNative 技术架构图

从图 2 ,我们可以非常清晰地看到一点,ReactNative 完全是基于原生平台来进行渲染的,而这之间主要是通过 JSbridge 来通信,将需要渲染的数据通过 JSbridge 传递给原生平台。这样的通信方式在 Flutter 中也有,在我们第 20 课时“原生通信:应用原生平台交互扩充 Flutter 基础能力”中有介绍到,这部分和 ReactNative 比较相近。而两者的最大的区别就在于, Flutter UI 界面是自渲染的,而 ReactNative 则是通过通信的方式告知原生平台,然后原生平台再绘制出界面。。

我们再回到最原始的跨端技术框架 Hybrid ,它是界面上使用 H5 ,其他功能则使用 JSbridge 来调用原生服务,因此并不会使用原生绘制界面,而仅仅只使用了原生平台能力。

以上就是三种技术框架的对比说明,我们再来总结下三种框架突出解决的问题点,其次也说明当前框架存在的问题点。

  • Hybrid 是在图 2 中仅仅支持了原生能力,例如相机、存储、日历等,而 UI 交互界面则还是H5,因此不管是体验和性能都是相对较差的。

  • ReactNative为了解决页面性能问题,同样应用 JSbridge 通信方式,将虚拟 DOM 以及页面渲染相关数据,传递给到原生平台,原生平台则根据虚拟 DOM 以及渲染相关数据,绘制出原生体验的界面,这样用户感知上就是原生的界面,但是这个过程中需要进行 J

USE shixun; -- 先删除外键约束(如果表存在) DROP TABLE IF EXISTS reviews; DROP TABLE IF EXISTS courses; -- 然后创建表 CREATE TABLE courses ( id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, cover_path VARCHAR(255), intro TEXT, sort INT, video_path VARCHAR(255), author VARCHAR(100), status ENUM('DRAFT', 'SUBMITTED', 'APPROVED', 'REJECTED', 'PUBLISHED'), create_time DATETIME, update_time DATETIME ); DROP TABLE IF EXISTS reviews; CREATE TABLE reviews ( id BIGINT AUTO_INCREMENT PRIMARY KEY, course_id BIGINT NOT NULL, reviewer_name VARCHAR(100) NOT NULL, review_content TEXT, rating INT CHECK (rating BETWEEN 1 AND 5), status ENUM('PENDING', 'APPROVED', 'REJECTED') DEFAULT 'PENDING', review_time DATETIME, FOREIGN KEY (course_id) REFERENCES courses(id) ); INSERT INTO courses (name, cover_path, intro, sort, video_path, author, status, create_time, update_time) VALUES ('Java编程基础', '/uploads/covers/java-basic.jpg', '从零开始学习Java编程语言', 1, '/uploads/videos/java-basic.mp4', '张老师', 'PUBLISHED', '2025-01-01 00:00:00', '2025-01-01 00:00:00'), ('Spring Boot实战', '/uploads/covers/jspring-boot.jpg', '速构建企业级Spring应用', 2, '/uploads/videos/spring-boot.mp4', '李老师', 'PUBLISHED', '2025-01-02 00:00:00', '2025-01-02 00:00:00'), ('Vue.js前端开发', '/uploads/covers/jvuejs.jpg', '现代前端框架Vue.js入门到精通', 3, '/uploads/videos/vuejs.mp4', '王老师', 'PUBLISHED', '2025-01-03 00:00:00', '2025-01-03 00:00:00'), ('数据库设计与优化', '/uploads/covers/jdatabase.jpg', '关系型数据库设计与性能优化', 4, '/uploads/videos/database.mp4', '赵老师', 'PUBLISHED', '2025-01-04 00:00:00', '2025-01-04 00:00:00'), ('微服务架构', '/uploads/covers/jmicroservice.jpg', '基于Spring Cloud的微服务架构', 5, '/uploads/videos/microservice.mp4', '陈老师', 'PUBLISHED', '2025-01-05 00:00:00', '2025-01-05 00:00:00'), ('Python数据分析', '/uploads/covers/jpython.jpg', '使用Python进行数据分析和可视化', 6, '/uploads/videos/python.mp4', '钱老师', 'APPROVED', '2025-01-06 00:00:00', '2025-01-06 00:00:00'), ('Docker容器技术', '/uploads/covers/jdocker.jpg', '容器化应用部署与管理', 7, '/uploads/videos/docker.mp4', '孙老师', 'SUBMITTED', '2025-01-07 00:00:00', '2025-01-07 00:00:00'), ('React高级开发', '/uploads/covers/jreact.jpg', 'React高级模式与最佳实践', 8, '/uploads/videos/react.mp4', '周老师', 'DRAFT', '2025-01-08 00:00:00', '2025-01-08 00:00:00'), ('Kubernetes实战', '/uploads/covers/jk8s.jpg', '云原生应用编排与管理', 9, '/uploads/videos/k8s.mp4', '吴老师', 'REJECTED', '2025-01-09 00:00:00', '2025-01-09 00:00:00'), ('人工智能基础', '/uploads/covers/jai.jpg', '机器学习与深度学习入门', 10, '/uploads/videos/ai.mp4', '郑老师', 'PUBLISHED', '2025-01-10 00:00:00', '2025-01-10 00:00:00'), ('DevOps实践', '/uploads/covers/jdevops.jpg', '持续集成与持续交付', 11, '/uploads/videos/devops.mp4', '王老师', 'PUBLISHED', '2025-01-11 00:00:00', '2025-01-11 00:00:00'), ('区块链技术', '/uploads/covers/jblockchain.jpg', '区块链原理与应用开发', 12, '/uploads/videos/blockchain.mp4', '林老师', 'DRAFT', '2025-01-12 00:00:00', '2025-01-12 00:00:00'), ('大数据处理', '/uploads/covers/jbigdata.jpg', 'Hadoop与Spark实战', 13, '/uploads/videos/bigdata.mp4', '黄老师', 'SUBMITTED', '2025-01-13 00:00:00', '2025-01-13 00:00:00'), ('网络安全', '/uploads/covers/jsecurity.jpg', 'Web安全与渗透测试', 14, '/uploads/videos/security.mp4', '徐老师', 'APPROVED', '2025-01-14 00:00:00', '2025-01-14 00:00:00'), ('移动应用开发', '/uploads/covers/jmobile.jpg', 'Flutter跨平台开发', 15, '/uploads/videos/mobile.mp4', '马老师', 'PUBLISHED', '2025-01-15 00:00:00', '2025-01-15 00:00:00'); INSERT INTO reviews (course_id, reviewer_name, review_content, rating, status, review_time) VALUES (1, '张老师', '课程内容全面,适合初学者入门', 5, 'APPROVED', '2025-01-16 10:00:00'), (1, '李老师', '解清晰,但部分示例代码可以优化', 4, 'APPROVED', '2025-01-16 11:30:00'), (2, '王老师', '实战性强,建议增加更多案例', 4, 'APPROVED', '2025-01-17 09:15:00'), (3, '赵老师', '前端框架解深入浅出', 5, 'APPROVED', '2025-01-17 14:20:00'), (4, '陈老师', '数据库设计部分需要更新', 3, 'REJECTED', '2025-01-18 16:45:00'), (5, '钱老师', '微服务架构解非常专业', 5, 'APPROVED', '2025-01-19 10:30:00'), (6, '孙老师', 'Python数据分析内容实用', 4, 'PENDING', '2025-01-20 13:15:00'), (7, '周老师', 'Docker内容需要补充新特性', 3, 'PENDING', '2025-01-21 15:00:00'); 我现在的数据库是mysql,叫eshop,应该怎么修改
07-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值