Skia已经非常好了,为什么Flutter还要开发Impeller?

哈喽,我是老刘

前几天有朋友联系到我,希望帮忙用Flutter开发一个linux上的应用。
他们的需求比较特别的一点就是程序最终运行在一个基于树莓派的Ubuntu系统上。
所以需求中有非常明确的性能优化的部分。
因为项目中某些页面有大量的图表,在树莓派上测试发现这类Flutter页面会比较卡顿。
接下来我解释一下为什么树莓派运行Flutter程序会卡顿,以及Impeller能带来哪些优化。

其实Flutter在低性能平台的卡顿现象,一方面因为Flutter设计的主要目标场景就不是低性能平台。
另一方面Flutter的渲染引擎skia也有承担一定的责任。
这一点在后续的Impeller引擎中会得到一定程度的优化。
接下来我们就来看看Skia的问题。

Skia是一个通用渲染引擎

Skia作为Android的官方渲染引擎,经过了这么多年的发展和优化,应该已经非常的成熟和稳定了。
那为啥还会有很多性能瓶颈,需要Flutter专门开发一款渲染引擎呢?
我觉得最根本的问题就是Skia是一款通用的2D图形库。

Skia 的设计初衷是为了服务于广泛的应用和平台,而不是专门为某个特定的框架或应用定制。
这就造成了以下的一些问题:
通用性带来的损失
由于 Skia 需要支持多种不同的应用和平台,它必须包含丰富、全面的功能。
为了实现这种丰富和全面每个功能的增加和修改都必须要考虑非常多的场景。
因此就必然带来代码实现上的复杂性,这会很大程度上影响开发和维护的效率。
另一方面是会带来性能的影响。
在一个平台上比较好的算法,在另一个平台上可能效果就不理想。
因此skia的开发者必须要找到一个在不同平台、框架下都表现不错的选择。
因此就不可能针对某一个平台或者框架做优化。

资源和优先级分配
Skia 的开发团队可能需要将资源和优先级分配给更广泛的用户群体和需求。
那么当Flutter需要底层的引擎提供某些功能,或者尽快修复某些bug的时候,Skia开发团队可能无法提供快速的响应。

技术栈和架构限制
Skia 的现有技术栈和架构可能限制了它在特定优化方面的灵活性。
例如,动态着色器编译可能是 Skia 的一个固有特性。Flutter可能希望它提供预热类的功能。
但是因为前面说过的资源分配问题和自身架构,迟迟得不到开发。

总的来说,Skia 面临的挑战在于它需要平衡广泛的应用需求和特定框架的优化需求,这可能导致它在某些方面难以完全满足 Flutter 的特定需求。
而这些也是Flutter 团队开发 Impeller的主要原因。
他们可以更自由地进行优化,以满足 Flutter 的特定需求,从而提供更好的性能和用户体验。

那么Impeller都带来了哪些优化呢?下面就简单盘点一下。

Impeller相对Skia的优势

  1. 专门针对 Flutter 优化
    Impeller 是专门为 Flutter 设计的渲染引擎,与通用的 Skia 图形库相比,可以更有效地针对 Flutter 的需求进行优化。
  2. GPU 利用效率更高
    Impeller 能够更有效地利用 GPU 资源,减少渲染动画和复杂 UI 元素所需的工作量,从而提高渲染速度。
  3. 图形渲染优化
    采用 tessellation 和着色器编译技术,提前优化图形渲染,减少设备上的硬件工作负载,实现更快的帧速率和更流畅的动画。
  4. 预编译着色器
    与 Skia 动态编译着色器不同,Impeller 会提前编译大部分着色器,减少渲染延迟,降低动画过程中的卡顿。
  5. 简化的分层架构
    Impeller 采用新的分层架构,简化渲染过程,允许每个组件以最大效率执行特定任务,减少转换 Flutter Widget 到像素的步骤。
  6. 硬件抽象层(HAL)
    提供统一的接口,抽象不同图形 API 的细节,确保 Impeller 的跨平台能力,同时在性能上扮演重要角色。
  7. 抗锯齿和裁剪优化
    Impeller 通过多重采样抗锯齿 (MSAA) 技术优化抗锯齿效果,使用模板缓冲区优化裁剪操作,提高执行效率。
  8. 应用大小和启动时间
    尽管预编译着色器可能会增加应用大小和启动时间,但 Impeller 设计的着色器相对简单,有助于保持应用的启动时间和整体大小。
  9. 底层优化
    在底层对昂贵的操作如抗锯齿和裁剪进行了优化,提高了整体的渲染性能。
  10. 易于维护和更新
    分层结构的设计使得引擎更加高效,并且更易于维护和更新,因为不同的关注点被分离。

总结

总之,Impeller作为专门为 Flutter 定制的渲染引擎,提供了更高效的 GPU 利用、优化的渲染流程、预编译着色器以及针对性能和用户体验的底层优化。
这些优化一方面能帮助Flutter提供更好的用户体验,另一方面也能让Flutter更顺利的应用到树莓派这类低性能的平台上。

如果看到这里的同学有学习Flutter的兴趣,欢迎联系老刘,我们互相学习。
点击免费领老刘整理的《Flutter开发手册》,覆盖90%应用开发场景。
可以作为Flutter学习的知识地图。
覆盖90%开发场景的《Flutter开发手册》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/386586.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

APT 安装软件详细教程

文章目录 APT 安装软件详细教程APT 概述APT 的基本命令APT 命令详解安装软件包更新和升级软件包删除软件包搜索和查找软件包管理软件包依赖清理软件包缓存APT 配置软件源配置自定义软件源常见问题及解决方案解决软件包依赖问题处理软件源错误其他常见问题使用 APT 的最佳实践总…

在Postman中引用JS库

前言 在做接口测试时,出于安全因素,请求参数需要做加密或者加上签名才能正常请求,例如:根据填写的请求参数进行hash计算进行签名。postman作为主流的接口调试工具也是支持请求预处理的,即在请求前使用JavaScript脚本对…

昇思MindSpore学习入门-自动混合精度

混合精度(Mix Precision)训练是指在训练时,对神经网络不同的运算采用不同的数值精度的运算策略。在神经网络运算中,部分运算对数值精度不敏感,此时使用较低精度可以达到明显的加速效果(如conv、matmul等&am…

OSI七层模型详解

OSI七层模型 OSI(Open System Interconnect),即开放式系统互连。 一般都叫OSI参考模型,是ISO组织在1985年研究的网络互连模型。该体系结构标准定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、…

[玄机]流量特征分析-常见攻击事件 tomcat

[玄机]流量特征分析-常见攻击事件 tomcat 题目做法及思路解析(个人分享) Tomcat是一个开源的Java Servlet容器,它实现了Java Servlet和JavaServer Pages (JSP) 技术,提供了一个运行这些应用程序的Web服务器环境。Tomcat由A…

go程序在windows服务中优雅开启和关闭

本篇主要是讲述一个go程序,如何在windows服务中优雅开启和关闭,废话不多说,开搞!!!   使用方式:go程序 net服务启动 Ⅰ 开篇不利 Windows go进程编译后,为一个.exe文件,直接执行即…

语言转文字

因为工作原因需要将语音转化为文字,经常搜索终于找到一个免费的好用工具,记录下使用方法 安装Whisper 搜索Colaboratory 右上方链接服务 执行 !pip install githttps://github.com/openai/whisper.git !sudo apt update && sudo apt install f…

NSSRound#4 Team

[NSSRound#4 SWPU]1zweb 考察&#xff1a;phar的反序列化 1.打开环境&#xff0c;审计代码 1.非预期解 直接用file伪协议读取flag,或直接读取flag file:///flag /flag 2.正常解法 用读取文件读取index.php,upload.php的源码 index.php: <?php class LoveNss{publi…

hadoop学习(一)

一.hadoop概述 1.1hadoop优势 1&#xff09;高可靠性&#xff1a;Hadoop底层维护多个数据副本&#xff0c;即使Hadoop某个计算元素或存储出现故障&#xff0c;也不会导致数据的丢失。 2&#xff09;高扩展性&#xff1a;在集群间分配任务数据&#xff0c;可方便扩展数以千计…

c++ 内存管理(newdeletedelete[])

因为在c里面新增了类&#xff0c;所以我们在有时候会用malloc来创建类&#xff0c;但是这种创建只是单纯的开辟空间&#xff0c;没有什么默认构造的。同时free也是free的表面&#xff0c;如果类里面带有指针指向堆区的成员变量就会free不干净。 所以我们c增加了new delete和de…

Python --Pandas库基础方法(2)

文章目录 Pandas 变量类型的转换查看各列数据类型改变数据类型 重置索引删除行索引和切片seriesDataFrame取列按行列索引选择loc与iloc获取 isin()选择query()的使用排序用索引排序使用变量值排序 修改替换变量值对应数值的替换 数据分组基于拆分进行筛选 分组汇总引用自定义函…

springcloud RocketMQ 客户端是怎么走到消费业务逻辑的 - debug step by step

springcloud RocketMQ &#xff0c;一个mq消息发送后&#xff0c;客户端是怎么一步步拿到消息去消费的&#xff1f;我们要从代码层面探究这个问题。 找的流程图&#xff0c;有待考究。 以下我们开始debug&#xff1a; 拉取数据的线程&#xff1a; PullMessageService.java 本…

126M全球手机基站SHP数据分享

数据是GIS的血液&#xff01; 我们在《2.8亿东亚五国建筑数据分享》一文中&#xff0c;为你分享过东亚五国建筑数据。 现在再为你分享全球手机基站SHP数据&#xff0c;你可以在文末查看该数据的领取方法。 全球手机基站SHP数据 全球手机基站数据是OpenCelliD团队创建由社区…

【Spring Cloud】Sleuth +Zinkin 实现链路追踪并持久化的解决方案

文章目录 前言链路追踪介绍Sleuth入门Sleuth介绍TraceSpanAnnotation Sleuth入门1、引入依赖2、修改配置文件3、网关路由配置4、演示 Zipkin的集成ZipKin介绍ZipKin服务端安装Zipkin客户端集成1、添加依赖2、添加配置3、访问微服务4、演示 Zipkin数据持久化使用mysql实现数据持…

现代Java开发:使用jjwt实现JWT认证

前言 jjwt 库 是一个流行的 Java 库&#xff0c;用于创建和解析 JWT。我在学习spring security 的过程中看到了很多关于jwt的教程&#xff0c;其中最流行的就是使用jjwt实现jwt认证&#xff0c;但是教程之中依然使用的旧版的jjwt库&#xff0c;许多的类与方法已经标记弃用或者…

多家隧道代理价格:阿布云、快代理、小象代理、熊猫代理和亿牛云……

随着奥运的热度攀升&#xff0c;各大品牌也在抓紧时机赶上这波奥运热潮&#xff0c;随之而来的大量数据信息收集和分析工作也接踵而至&#xff0c;在这一数据采集过程中&#xff0c;HTTP代理的质量和价格对企业的效率和成本调控重要性不言而喻。我们大部分人在日常购买产品的时…

Revit中如何添加剖面?快速实现剖面图的方法汇总

Revit中创建剖面以及剖面视图一般有两种方法&#xff0c;一是使用Revit原生的剖面功能&#xff0c;而是使用Revit插件BIM建模助手进行便捷的剖面操作以及剖面视图创建。 Revit原生的剖面功能&#xff0c;点击后可以自由拉伸剖面方向、范围&#xff0c;放置完剖面符号后&#xf…

【ROS 最简单教程 003/300】ROS 快速体验:Hello World

开始自己的第一次尝试叭 ~ Hello World 本篇是 C 版本&#xff0c;如需 python 版本 &#x1f449; python 版本指路 ROS 中程序的实现流程&#xff1a; 创建工作空间 ( &#x1f499; 如 tutu_ws) &#xff0c;进入并编译 mkdir -p tutu_ws/src cd tutu_ws catkin_make在 src …

【C语言】结构体详解 -《探索C语言的 “小宇宙” 》

目录 C语言结构体&#xff08;struct&#xff09;详解结构体概览表1. 结构体的基本概念1.1 结构体定义1.2 结构体变量声明 2. 结构体成员的访问2.1 使用点运算符&#xff08;.&#xff09;访问成员输出 2.2 使用箭头运算符&#xff08;->&#xff09;访问成员输出 3. 结构体…