阅读 3591

Flutter在iOS上采用Metal驱动GPU

前言

Flutter1.17正式发布

关于1.17正式版

应用性能和包大小优化

此版本的主要重点是在性能和内存改进方面继续进行全面优化工作。只需将应用程序升级到此版本,用户就会看到更快的动画,更小的应用程序和更低的内存占用率。在此版本中,默认导航情况(不透明导航栏)的速度将提高20%-37%。对于简单的iOS动画,最多减少40%的CPU / GPU使用率,具体降低多少取决于硬件(在PR 14104和PR 13976中进行了详细介绍)。

此版本还提供了一个较大的应用程序大小的改善,是由于几处问题修复导致包增大的结果。例如,Android的FlutterGallery示例在2019年底为9.6MB,现在为8.1MB,减少了18.5%。

对于内存使用,此版本将快速滚动浏览大图像减少了70%的内存,这也间接使应用性能提高,具体取决于设备的内存量。

Metal支持可将iOS的性能提高50%

苹果公司在iOS上对Metal的支持几乎可以直接访问底层GPU,并且是苹果公司推荐的图形API。在完全支持Metal的iOS设备上,Flutter目前在默认情况下会优先使用它,这使您的Flutter应用程序大多数情况下运行得更快,平均将渲染速度提高了约50%(取决于渲染的工作量)。

对于不完全支持Metal的设备(A7处理器之前的版本或运行10之前的iOS版本的设备),Flutter会像过去一样使用OpenGL,从而为较旧的设备提供本地渲染速度。

新增Widgets:NavigationRail,DatePicker等

在此版本中,Flutter添加NavigationRail了一个新的小部件,该小部件提供了响应式应用程序导航。它是由Google Material Design团队设计和开发的。该NavigationRail是优秀的,因为它很容易切换应用程序BottomNavigato,从另一个途径将应用程序的可见屏幕尺寸的增大。

其它部件请参考顶部链接深入了解;

Material文本比例:使Flutter文本主题现代化

在此版本中,Flutter团队完成了2018 Material Design规范的Type Scale部分的实现,同时没有破坏现有的Flutter应用程序。2018年10月的PR 22330中增加了对新配置的选择加入支持,但不对新名称提供支持。现有的文本样式名称未更改,因为这样做是一个重大的API更改,可能会影响大多数应用程序。此版本更新了TextThemeAPI以匹配当前的Material规范,但保留了旧名称,以使您的代码不会中断。但是,旧名称已被弃用,因此您在使用的时候将收到警告,以提醒您在开发时采用新名称.

Google字体用于Flutter

文字和字体齐头并进,因此,如果您对新的Material Text Scale实现有兴趣,那么您可能也会对新的Flutter v1.0版Google字体有同样的兴趣。

Google字体允许开发人员在其应用中轻松地尝试和使用fonts.google.com中的任何字体。当应用程序准备发布时,开发人员将决定用户是否通过从API下载字体来接收字体,或者它与应用程序包预先捆绑在一起。

可访问性和国际化

在此发行版中,我们已完成了全部工作,包括滚动,文本 字体和其他输入小部件的可访问性修复程序等。您将在GitHub的该版本中看到有关可访问性问题的完整列表。我们推荐您测试自己的应用程序的可访问性,并且还通过一些推荐的最佳实践更新了此版本中的文档。

工具:Dart DevTools移植到Flutter,Android快速入门等

此版本使我们将Dart DevTools的当前版本换成新的Flutter版本。如果您想尝试一下,请启动DevTools并单击DevTools右上角的“烧杯”图标。

Devtools还有其它很多有趣的更新等待你的发掘。

详细请参考链接文章进行实践;实践会让你看到比任何文章更好的介绍;

1.17中 Flutter 和 Metal

此处是文章重点翻译内容

Flutter引擎在iOS上将迁移到使用Metal渲染API,而不是使用OpenGL;

为什么使用Metal ?

一个Flutter用户界面通过使用加速图形API访问平台上的GPU显示在屏幕上。这个API是iOS上OpenGL ES的一个版本。随着iOS 12的引入,OpenGL ES和相关的api在2018年被苹果正式否决。Metal现在是iOS和Mac上低级别、低开销渲染的推荐API。虽然OpenGL的跨平台方面确实很有用,但Flutter团队也很看好Metal方案。OpenGL ES的不受欢迎似乎也导致了iOS上的OpenGL驱动程序维护得不太好。iOS特有的OpenGL问题出现了上升趋势,这些问题越来越难调试,而且不太可能得到修复。基于这些原因,在iOS上向Metal迁移势在必行。

在什么版本上flutter会使用Metal?

Flutter的Metal渲染将用于苹果A7设备或运行iOS10或更高版本的设备。当不能使用Metal时,会降级使用OpenGL。

为什么Flutter不能在所有iOS机型使用Metal?

Flutter目前支持在iOS 8及以上版本上运行。这包括Metal本身不可用的设备。具体来说,Metal只在苹果A7或更高版本的iOS设备上可用。这将排除像iPhone 5C这样可以升级到iOS 10但只有Apple A6 SOC的设备。一项要求在任何地方都使用Metal的政策意味着我们将不得不放弃一些机型。这不是Flutter现在准备考虑的适配问题。

还有些问题是少数支持8到10之间iOS版本的设备,这些设备具有Apple A7 SOC(或更高版本),但尚未更新到最新的iOS版本。Flutter在技术上也可以在这些设备上使用Metal,但目前还没有。这是因为早期版本的iOS上的Metal API对于Flutter所需的特性(特别是Flutter所使用的Skia渲染库)的表现力不够。这需要为双源混合等情况创建解决方案或备用方案。为了减少实现和测试负担,决定选择iOS 10作为基准。如有必要,可以修改这项决定。(也就意味着只要是A7以上,理论上来说是都可以使用Metal进行渲染)

这是否改变了Flutter支持的iOS的最低版本?

不。Flutter将在较新的设备和iOS版本上使用Metal,但OpenGL后端保持原样。当Metal不可用时使用,是一个替代方案。

作为一个Flutter开发者,我需要做些什么来迁移到iOS上使用Metal呢?

除了您的应用程序在引擎下使用OpenGL对Flutter做出假设的可能性非常小的处理情况之外,一般不需要开发者进行特意的适配。更新的Flutter引擎不需要对Flutter应用程序或其嵌入方式进行任何更改。

是否因为添加了Metal支持而对二进制大小产生影响?

对。未压缩的Flutter引擎二进制文件的大小将增加约250KB。将继续对这个大小进行增量缩减,但要进行显著缩减,需要删除OpenGL后端。目前Flutter团队还没有考虑这个问题。

摄像头预览、视频播放、webview、地图等插件是否能继续工作?

对。这些插件不需要更新,它们将继续按预期工作。Flutter plugins repo中的所有插件都已经过测试,可以与Metal后端协同工作。

如何判断我的应用程序是否在引擎下使用OpenGL对Flutter进行了修改?

Flutter使用的渲染API是Flutter引擎的一个实现细节。然而,Flutter确实为底层平台提供了在Flutter层次中为内联合成提供纹理的能力。开发人员(或插件)通过在他们的应用程序中使用一个纹理小部件并编写一些特定于平台的代码来提供和更新这些纹理。如果操作提供给Flutter引擎的纹理的平台特定代码没有指定纹理可以与Metal API互操作,则这些纹理的内联组合可能会失败。有关确保纹理可与金属互操作的指导,请遵循有关如何“创建可互操作纹理”的文档。具体来说,在创建描述纹理的像素缓冲区时,除了kcppixelbufferopenglcompatibilitykey键之外,还必须指定kcppixelbuffermetalcompatibilitykey键。

如果应用程序不使用纹理小部件,则无需执行任何操作。如果是这样,则必须检查提供给Flutter的纹理,以确保它们可以与Metal互操作。

这是一个非常独特的用例,Flutter plugins repo中没有使用这种机制的插件。

如果我的应用程序使用OpenGL为Flutter应用程序中的内联合成提供纹理,这是否适用于Metal后端?

对。如前所述,只要提供给Flutter的纹理可以与Metal互操作,就可以继续使用OpenGL更新纹理,Flutter将使用Metal合成相同的纹理。

如何在运行时判断Flutter应用程序是否使用Metal而不是OpenGL进行渲染?

fluttViewControllers视图将有一个camertalayer类。Flutter将使用Metal或OpenGL。也就是说,在一个过程中,不可能有一些Flutter应用实例同时使用Metal和OpenGL。

Flutter会在iOS模拟器上使用金属吗?

不,目前没有。Flutter将一如既往地继续在iOS模拟器上使用软件后端。

文章分类
iOS
文章标签