我正在试用Flutter,我的应用在模拟器和真实的设备上的响应都非常非常慢。
跳过了51帧!应用程序可能在其主线程上做了太多的工作。
我知道Dart是一种单线程编程语言,在Android中,我曾经用new Thread();
块来解决这个问题。我正在尝试在Flutter中应用相同的方法,我阅读了Future
await
async
和排序,但示例似乎解决了从互联网读取数据的问题。我的应用程序在现阶段不会在线读取任何内容,当我的屏幕有进度对话框时,当我打开一个新屏幕/页面时,以及应用程序上的每个动画时,我都会跳过x帧。以下是我遇到问题的类的示例:
_buildContent(){
return new Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new InkWell(
onTap: (){
Navigator.push(context, new MaterialPageRoute(builder:
(context) => new LoginScreen()));
},
child: new Container(
height: 150.0,
width: 150.0,
child: new Image.asset("images/logo.png", fit: BoxFit.cover,),
),
),
new Container(
margin: const EdgeInsets.all(16.0),
child: new CircularProgressIndicator(
value: null,
strokeWidth: 1.0,
valueColor: new AlwaysStoppedAnimation<Color>(
Colors.white
)
),
)
],
);
}
我假设跳过x帧的警告是由进度对话框引起的?我有另一个屏幕(登录屏幕),当打开时,它会将小部件动画到适当的位置,动画移动得很慢,我可以从字面上看到每一帧正在渲染。是否有在线教程可以帮助解决这个问题,或者只是理解Dart的异步编程?
9条答案
按热度按时间deyfvvtc1#
debugging 模式
因为调试模式具有热重新加载。
当你创建发布apk https://flutter.io/docs/deployment/android
你可以找到
编辑
https://flutter.io/docs/testing/ui-performance#debug-flags
调试模式启用附加检查(如Assert),这些检查可能代价高昂。调试模式也以不同于发布模式的方式执行代码。调试构建“及时”编译Dart代码(JIT),但配置文件和发布版本会预编译为本机指令(也称为“提前”,或AOT)在应用程序加载到设备之前。JIT会导致应用程序暂停进行JIT编译,这本身就会导致Jank。
https://github.com/flutter/flutter/wiki/Flutter%27s-modes
设备上的调试模式(包括模拟器、仿真器):打开世界上所有的Assert,包括所有的调试信息,启用所有的调试器辅助工具(如observation)和服务扩展。为快速开发/运行周期优化。不为执行速度、二进制大小或部署优化。由flutter run使用。用sky/tools/gn --android或sky/tools/gn --ios构建。有时也称为“检查模式”或“慢模式”。
uxh89sit2#
尝试在终端中使用
flutter run --release
在发布模式下运行您的应用。l3zydbqr3#
调试版本有一些性能问题,因为许多Assert和其他验证发生在发布版本中。发布版本比调试版本快得多。
在发布版本中运行应用可能会有所帮助。请尝试在发布模式中运行
83qze16e4#
你应该看一下Flutter performance Profiling指南。你可以尝试不同的配置来诊断你的问题是否在
即使您的Dart代码只是在Ui线程中运行,它也会影响其他线程。
zzwlnbp85#
在flutter中有一个已知的问题,你必须先“预热”图形API(SkSL)。在第三次运行后,通常动画会变得平滑。
这个问题发生在iOS和Android.
对于iSO来说,由于苹果放弃了对OpenGL的支持,这通常是skia图形引擎的实现方式,因此金属API通常会出现滞后。
变通方法和临时解决方案可在此页面上找到。
Extreme jank on iOS/Android the first time any kind of animation or transition runs (release build) - skia shader compilation #61450
iswrvxsc6#
iOS模拟器
如果您在Xcode模拟器中的特定(较新)设备上遇到速度慢、FPS低、滚动滞后的问题,这是因为Apple不再支持OpenGL,而且Flutter SDK不支持模拟器中的新Metal API。
但官方稳定的支持将很快提供,直到那如果你需要60 FPS,切换到Flutter SDK的主通道运行这在终端和重建你的应用:
资料来源:
iOS Simulator gradually becomes very slow & unusable
Investigate enabling Metal on iOS simulators above version 13.0.
Flutter会在iOS模拟器上使用Metal吗?
rkttyhzu7#
我的应用在一些安卓设备上运行缓慢,可能对其他设备也有一些性能影响。罪魁祸首是图像资产。在提供正确的图像大小后,
到我的assets文件夹并更新pubspec.yaml,性能变得更好,
c9x0cxw08#
如果您在Profile模式下检查后仍然发现速度缓慢,这里有一个新的解决方案:https://github.com/fzyzcjy/flutter_smooth .
简而言之,你的应用程序将是~ 60 FPS的流畅,即使它的构建/布局可以任意慢。如何使用它和它是如何实现的可以在文档中找到。
免责声明:我做了那个库。
g6baxovj9#
如果你正在体验滞后的iOS模拟器,对我来说唯一的解决方案是创建iPhone SE。然后它开始像以前一样流畅地工作。