12月小报|读小报,涨知识

news2024/12/23 22:30:40

本期知识小集的主要内容包括:

  • • Flutter桥调用请注意结果反馈

  • • Flutter await代码带来的潜在并发

  • • Flutter FPS 高不代表一定流畅

  • • Flutter新渲染引擎impeller尝鲜

Flutter桥调用请注意结果反馈

通过桥来拓展Flutter的能力,是非常通用的Flutter开发场景。常见的包括:网络请求,本地存储,异构页面通信等 。实现功能固然重要,但是如果控制不好返回值,可能会是一个灾难。例如:Dart侧代码:

void getResult() async {
  dynamic result = await MethodChannel('methodChannelName')
.invokeMethod<dynamic>('methodName', {'params': content});
doOtherJobs();
}

Native 侧代码,以Android代码为例:

@Override
  public void onMethodCall(MethodCall call, Result result) {
    switch (call.method) {
      case "methodName": {
        doJob();
                break;
      }
    }
  }

如果按上述代码实现,就会出现一个非常隐藏的问题:dart侧代码会一直wait,之后的代码(doOtherJobs)永远不会被执行到了。问题的原因是MethodChannel 并不知道底层的逻辑是否执行完毕。那怎样通知MethodChannel执行完了呢?需要调用如下代码:

如下代码调用任一一个即可
result.success();
result.error();
如果没有对应方法的实现可以调用如下代码:
result.notImplemented();

问题虽小,但是影响可能很大,一定要小心~

Flutter await代码带来的潜在并发

Flutter使用Dart语言进行开发。Dart语言具备非常友好的并发编程语法。例如 async/await。我们在享受并发语法带来便利的同时,也需要深刻理解代码背后的执行逻辑。只有这样,才能避免走入一些“深坑”。首先从最简单的逻辑来看:如果一个函数被标记为 async,意味着该函数会被异步执行,函数会返回一个 Future 对象。函数正常执行的到该函数的时候,并不会停下并等待函数的结果返回,而是直接运行下面的代码。如果想要程序停下,等待函数的执行结果,需要配合await关键字来实现。示例如下:

894944c0209aedea709cb7a8f2edbda8.jpeg

这里有一个非常有意思的问题,使用await 等待异步函数执行,到doJob2函数执行,这中间是不是仅仅执行了doAsyncJob函数内容?来看下面的例子

bool needReturn = false;

  Future<void> doJob2() async {
    needReturn = true;
  }

  Future<void> doJob() async {
    if (needReturn) {
      return;
    }
    print('needReturn position1 is $needReturn'); // needReturn == false ?
    await doSomething();
    print('needReturn position2 is $needReturn'); // needReturn == false ?
  }

  Future<void> doSomething() async {
    print('doSomething~~~');
  }
  1. 第一个问题 position1 位置的时候needReturn 是不是一定是false?

答案是yes, 因为needReturn == true 会在之前执行的时候,直接返回。要想执行到position1 ,needReturn一定是false;

  1. 第二个问题 position2 位置的时候needReturn 是不是一定是false?

答案是不一定!为什么不一定呢?doSomething函数中并没有设置needReturn为true。needReturn会被修改么?答案是有可能,原因是doJob2可能在其他控制流中被执行。看起来position2的上一句就是doSomething,但是在await 等待的时候,其他的并发函数也可能被执行,如果doJob2被执行,值就会发生了变化。结论:使用await 并发执行以后,记得一定要做变量的重新检查因为这里虽然代码相邻,但是过程中可能执行大量其他并发函数,核心状态并不像看起来的那么可

Flutter FPS 高不代表一定流畅

流畅滚动是优异体验的核心保障。FPS(Frames Per Second)作为页面流畅度的核心度量指标,被广泛使用。FPS本质上度量的是每秒播放的帧数。下图直观对比不同帧率的显示效果。

404f48ac1a34e2be7b0189a11b1e7ddb.gif
帧率.gif

Flutter开发页面,同样广泛的使用FPS来度量页面流畅度。但是Flutter一直有一个“细碎抖动”的问题,也就是页面整体是流畅的,但是在滚动的过程中有明显的细碎抖动,这对用户体验产生了伤害。在实际开发过程中,FPS这一指标对这类抖动问题的度量效率并不高。例如:前900ms刷了50帧,但是最后100ms刷了1帧,最后的FPS值是51,看起来也是一个不错的值。但是用户会在其中明显感知到卡顿。帧率的连贯性是很重要的,即便刷新只有30帧,但是如果一直是这个帧率,用户感知起来也是流畅的。但是如果一下子从50帧掉到30帧用户还是会感知明显的卡顿。所以流畅度的度量需要感知帧率的变化。那Flutter中怎么感知每一帧的变化呢?可以用如下方法获取每一帧的性能数据数据。

WidgetsBinding.instance.addTimingsCallback();

透过该方法,除了能获取每一帧的整体耗时,还可以细化到build和raster两个主要阶段的耗时。这样能更加深入的做性能问题的排查。数据结构体如下:

factory FrameTiming({
    required int vsyncStart,
    required int buildStart,
    required int buildFinish,
    required int rasterStart,
    required int rasterFinish,
    required int rasterFinishWallTime,
    int frameNumber = -1,
  })

那么在知道帧耗时的情况,怎么判定是一次卡顿呢?可以从如下两个维度来度量:

  1. 1. 帧耗时是之前N帧平均耗时的M倍(这里N和M可以根据实际情况调整,例如一般设置成3帧和2倍)

  2. 2. 帧耗时超过两帧电影帧耗时(电影帧单帧耗时:1000ms/24≈41.67ms,这是下线,帧耗时超过这个标准,用户能明显感知到卡顿)

同时我们也可以通过统计不同分位的帧耗时,更细致感知实际页面渲染情况。例如常见的90分位,99分位帧耗时。大家可以根据实际情况统计。

Flutter新渲染引擎impeller尝鲜

接着上面的问题,Flutter有一个 early-onset jank 的公开问题(问题详解可以参见引用【1】)。Flutter页面的抖动问题跟这个问题有着一定的关联。本质上impeller是Skia的一个替代方案。官方在Flutter3.0的版本中首次公开了Impeller的预览版本。同时在Flutter3.3版本中进行了大量完善。目前可以通过如下方式开启:

  1. 1. flutter run 添加 --enable-impeller

  2. 2. Native工程配置

在IOS工程的Info.plist文件中添加如下配置:

<key>FLTEnableImpeller</key>
  <true/>

Android工程,在AndroidManifest.xml添加如下配置:

<meta-data
    android:name="io.flutter.embedding.android.EnableImpeller"
    android:value="true" />

那impeller 效果如何呢?从我们初步的测试来看,有如下初步结论:注意目前impeller iOS的成熟度相比Android要高很多。我们只测试了iOS的场景

  1. 1. 从官方Gallery场景来看,优化效果显著,impeller的debug包就有了媲美之前release包的效果。Flutter的细碎抖动问题,在官方Gallery场景上基本解决。滚动流畅性有显著提升。

  2. 2. 由于官方Gallery比较简单,从闲鱼的实际benchmark来看,impeller目前在复杂场景下的性能未超过skia的实现。【测试版本 Flutter3.3.8 手机iPhone 13 Pro】主要原因是impeller目前阶段比较早,很多功能还有待完善,测试过程中也出现了大量渲染错误的问题。impeller距离生产中使用还需时日。

impellerskia
e9db183230b417e8c834b407226da871.png6521c734e2b1d0667c7e5ae28d59dce2.png
raster线程平均帧耗时 5.5msraster线程平均帧耗时 1.9ms

impeller是Flutter根本上解决卡顿问题的重要尝试,虽然目前状态下还有很多的不完善,但是可以明显感受到impeller带来的显著变化,未来可期~

引用

【1】Flutter 新一代图形渲染器 Impeller 

【2】https://github.com/flutter/flutter/wiki/Impeller 

【3】https://docs.flutter.dev/development/tools/sdk/release-notes/release-notes-3.3.0

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Weda创建视图表格

这边我们先创建一个数据集。 在更多操作里面分布这个数据集。 点击编辑&#xff0c;选择视图配置。 在下面这个界面&#xff0c;新建视图。 在操作里面&#xff0c;点击更多&#xff0c;发布这个视图。 我们点击编辑设置视图的第一行&#xff08;表列设置&#xff09;。 点击…

马上又是新的一年了 “跨年倒计时”送给大家

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;跨年倒计时 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林在闪闪发光的…

pytorch 深度学习

第二章 回归问题 即使是最简单的线性回归,由于观测误差的存在,也不可能找到一个满足所有样本的函数。因此,我们退而求其次,寻找到一个满足大部分样本点的直线。那么如何衡量这个呢,我们可以求出所有样本点真实值和预测值的误差,满足总误差最小的就是最好的。 连续值…

年关在即,源站安全如何保障?|ScanV(云监测)重保哨兵值守

2022年&#xff0c;全球重大网络安全事件频发&#xff0c;大规模数据泄露、漏洞利用事件、勒索软件攻击等网络犯罪威胁持续上升。网络安全形势日趋严峻&#xff0c;对政府、党政机关、央企国企业务安全造成严重威胁。据知道创宇云防御2022年截至目前的数据统计&#xff0c;平均…

如何去掉任务栏的英伟达图标,并阻止英伟达服务自启动

进入服务&#xff0c;找到NVIDIA的两个服务项&#xff0c;右键属性&#xff0c;停止服务&#xff0c;英伟达图标自动消失。 再把启动方式改为手动&#xff0c;下次就不会开机自启。

WebGL

1、WebGL介绍 1.1 WebGL不足 效果较差&#xff1a;较于桌面开发API&#xff1a;Direct3D、OpenGL、UE、Unity。 开发成本&#xff1a;熟悉并掌握一定的数据知识&#xff0c;例如&#xff1a;线性代数。 硬件要求&#xff1a;开发及部署系统硬件要求较高&#xff0c;尤其GPU…

炒股经验总结

判断大盘调整到后期 高位补跌&#xff0c;大盘出现大阴线 板块炒作到尾声 板块龙头开始回调&#xff0c;炒作炒到边角料 良好的量价关系 放量突破&#xff0c;缩量回踩 跌破前低3天收不回来止损&#xff0c;无关涨跌&#xff0c;这是底线&#xff0c;以后涨了也不后悔&am…

正点原子IMX6ULL-Linux驱动开发

目录 第一期 第6讲 Ubuntu终端操作与Shell命令 第一期 第8讲 Ubuntu文件系统结构 第一期 第9讲 Ubuntu磁盘管理 第一期 第10讲 Ubuntu压缩与解压缩 第一期 第11讲 Ubuntu用户和用户组 第一期 第12讲 Ubuntu文件权限 第一期 第13讲Linux连接文件 第一期 第14讲 vim编辑器 第一期…

专利申请与专利转让有什么区别?

专利申请与专利转让有什么区别&#xff1f; 一、专利转让和专利申请的流程不同 专利转让的流程&#xff1a; (1)找到合适的转让途径; (2)专利转让人和专利受让人进行签署专利权转让合同; (3)填写专利转让相关文件&#xff0c;需要严格按照国家规定形式进行填写&#…

公司想要做自动化测试,那么自动化测试发展和价值回报有哪些?

很长一段时间&#xff0c;都在思考&#xff0c;怎么能通俗的看待自动化测试的收效 自动化测试到底能不能成为一种趋势&#xff1f; 自动化测试到底能不能形成一种规模&#xff1f; 自动化测试到底能不能成为我们的利器&#xff1f; 自动化测试到底能对我们的职业带来何种发…

为什么有的公司会禁用spring声明式事务

在之前我一直偏向于使用声明式事务&#xff0c;我一直觉得声明式事务比较好用。相比于编程式事务&#xff0c;使用声明式事务时只需要加上一个注解&#xff0c;spring就能够帮助我们完成所有的事务控制。反观编程式事务却需要我们自己去控制事务的提交和回滚&#xff0c;这种代…

【JavaSE】Clonable?关于深拷贝与浅拷贝那些事儿咱们一次聊明白

&#x1f481; 个人主页&#xff1a;黄小黄的博客主页 ❤️ 支持我&#xff1a;&#x1f44d; 点赞 &#x1f337; 收藏 &#x1f918;关注 &#x1f38f; 格言&#xff1a;All miracles start from sometime somewhere, make it right now. 本文来自专栏&#xff1a;JavaSE从入…

新年新气象,100行 Python 代码制作动态鞭炮

放鞭炮贺新春&#xff0c;在我国有两千多年历史。关于鞭炮的起源&#xff0c;有个有趣的传说。 西方山中有焉&#xff0c;长尺余&#xff0c;一足&#xff0c;性不畏人。犯之令人寒热&#xff0c;名曰年惊惮&#xff0c;后人遂象其形&#xff0c;以火药为之。——《神异经》 当…

IU8689 单声道145W/75W立体声D类音频功放IC产品介绍

概要 IU8689E是-款单声道可输出145W,立体声2*75W D类音频功率放大器&#xff0c;这款器件在顶层设计了散热焊盘&#xff0c;焊盘上连接散热器后在供电电压24V的情况下&#xff0c;最大可以输出2x75W的连续功率&#xff1b;通过主从模式的设置可以让IU8689E实现无限级联&#x…

C# 线程的基本使用

一 多线程的概念 1 进程Process 2 线程Thread ① 线程中的指令&#xff1a;一个方法&#xff08;委托&#xff09; ② 线程中的数据&#xff1a;相关的对象&#xff1b; 3 System.Threading.Thread属性 4 System.Threading.Thread方法 5 线程的创建 1&#xff09; Thread类…

初识Spring

目录 一&#xff1a; 为什么要学习&#xff1f; 二&#xff1a; 概述 三&#xff1a;Spring发展史 一&#xff1a; 为什么要学习&#xff1f; 可以最大程度地简化项目的开发大量公司在使用顶级的源码设计:spring框架源码设计非常优秀&#xff0c;在java开源项目中可以说是顶…

1.8T数据离奇消失之谜

编者按 数字化浪潮蓬勃兴起&#xff0c;企业面临的安全挑战亦日益严峻。 腾讯安全近期将复盘2022年典型的攻击事件&#xff0c;帮助企业深入了解攻击手法和应对措施&#xff0c;完善自身安全防御体系。 本篇是第六期&#xff0c;讲述了某企业NAS系统数据被删除&#xff0c;始…

SpringBoot 配合126邮箱实现邮件发送功能

126邮箱邮件发送授权码申请pom依赖邮件配置代码编写Bean与配置自动装载原始手工方式发送邮件发送纯文本的邮件发送包含HTML标签的邮件发送包含附件的邮件发送包含静态资源的文件测试SpringBoot 提供了系统级别邮箱服务&#xff0c;只需要导入一个邮箱启动器然后进行配置就可以使…

LabVIEW如何减少下一代测试系统中的硬件过时6

LabVIEW如何减少下一代测试系统中的硬件过时6 HAL Benefits When addressing obsolescence, HALs yield the benefits of lowermigration costs, faster migration time, higher code reuse, and easiermaintainability. Lower Migration Costs The act of designing a use…

如何pdf合并成一个?推荐3种方法

在企业处理多份合同文件或者财务报销时&#xff0c;经常会处理大量的PDF文件。因此为了更高效率办公&#xff0c;我们经常需要将多个pdf合并成一个。如何pdf合并成一个呢&#xff1f;给大家推荐3个方法。 1、Smallpdf工具 如何pdf合并成一个&#xff1f;推荐大家可以使用Small…