Flutter sksl 着色器预热

Flutter Skia sksl 着色器预热(小记)

纯Flutter项目开发时间大概3年多了,基本都是构建在Android和IOS平台的应用程序,至于Flutter性能方面,Android平台的体验和流畅度确实优于IOS,再加上安卓平台可以根据Skia着色器预热编译,使得页面导航、动画、裁剪等触发时更加流畅。

虽然IOS也可以缓存着色器数据,但是和安卓还是有很大不同的,着色器主要还是为了解决应用程序首次运行的编译卡顿,对于安卓,App从安装到首次打开,着色器预热编译数据就已经起到了很好的助攻效果,但是IOS则是每次打开App时都需要从0开始加载着色器数据,这就导致IOS在Flutter性能方面不如Android平台。

所以针对于IOS平台,除了着色器预热,还可以选择延迟加载的方式,出现卡顿的很大原因是Widget在绘制过程中更新了UI, 例如,页面导航时,请求服务器数据或者其他耗时的操作,可以在页面导航结束后再执行,例如Future.delayed 等等。

怀疑是着色器编译卡顿时,可以通过命令运行app,查看Timeline Raster耗时
  • flutter run --trace-skia --profile
收集着色器数据
  • flutter run --cache-sksl --profile
通过上一步生成的着色器数据flutter_01.sksl.json文件,进行编译预热打包
  • android :
    flutter build apk --profile (release)–bundle-sksl-path flutter_01.sksl.json
  • ios:
    flutter build ios --profile(release) --bundle-sksl-path flutter_ios.sksl.json
    flutter build ipa --profile(release) --bundle-sksl-path flutter_ios.sksl.json

Flutter 3.10 Impeller

  • flutter 3.10开始,ios上默认使用Impeller来渲染,不再使用Skia,所以默认情况下,ios平台打包时将无法使用自定义的着色器来编译,
    因为Impeller基本上已经解决了编译卡顿,总体效果还可!
    如果一定要自己缓存着色器数据,可以在上述命令后追加
    —no-enable-impeller 参数
最终生成的.apk就包含了着色器的预编译信息,当app执行页面导航或者动画时,就会很快的执行完毕。
  • android
    最终生成的apk可以通过adb安装,也可以通flutter run来执行
    flutter run --use-application-binary xxx.apk --profile(release)

  • ios
    flutter run --use-application-binary 项目路径/build/ios/iphoneos/Runner.app --profile(release)

  • ios分发测试
    如果打包生成的ios产物是Runner.app,可以直接安装到ios设备上去测试,如果想要转换成 .ipa去分发,则可以通过以下方式去转换:
    桌面新建一个Payload文件夹(一定要区分大小写哦!),将Runner.app拷贝到Payload文件夹中,最后将Payload文件夹整体压缩成 .zip,最后将Payload.zip后缀名改成 .ipa 即可,此时才可以修改Payload.ipa的文件名 !!!

Cocoapods重装
  • sudo gem uninstall cocoapods
  • sudo gem install cocoapods
  • pod install

你可能感兴趣的:(flutter,着色器)