Flutter: 由于不规则的输入事件传递,iPhone X、Xs 设备上的滚动性能显着下降。

创建于 2019-04-15  ·  84评论  ·  资料来源: flutter/flutter

我自己和其他一些在https://github.com/flutter/flutter/issues/22314 中讨论的人已经注意到 iPhone X、Xs 设备上具有滚动视图的显着滚动性能问题。

有趣的是,似乎拖动手势是主要问题,而甩动似乎稍好一些。
@coreysprague表示可能是因为这些设备的手势采样率为 120hz(https://www.macworld.com/article/3235709/iphone-x-samples-touch-input-at-120hz-for-faster-smoother-响应.html)。

只是想澄清一下,即使在发布模式下运行时也会发生这种情况。

重现步骤

这是一个很小的示例应用程序,您可以在其中重现滚动抖动和跳帧,只需拿起 iPhone X、Xs 并在发布模式下运行即可。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  <strong i="13">@override</strong>
  Widget build(BuildContext context) {
    const padding = EdgeInsets.symmetric(vertical: 10, horizontal: 10);

    return MaterialApp(
      home: Scaffold(
        body: ListView(
          children: <Widget>[
            Container(
              margin: padding,
              height: 200,
              color: Colors.grey,
            ),
            Container(
              margin: padding,
              height: 200,
              color: Colors.orange,
            ),
            Container(
              margin: padding,
              height: 200,
              color: Colors.grey,
            ),
            Container(
              margin: padding,
              height: 200,
              color: Colors.orange,
            ),
            Container(
              margin: padding,
              height: 200,
              color: Colors.grey,
            ),
            Container(
              margin: padding,
              height: 200,
              color: Colors.orange,
            ),
            Container(
              margin: padding,
              height: 200,
              color: Colors.grey,
            ),
            Container(
              margin: padding,
              height: 200,
              color: Colors.orange,
            ),
          ],
        ),
      ),
    );
  }
}

日志

flutter run --verbose日志中没有错误

未找到带flutter analyze

[✓] Flutter (Channel stable, v1.2.1, on Mac OS X 10.14.4 18E226, locale en-US)
• Flutter version 1.2.1 at /Users/dwempe/flutter
• Framework revision 8661d8a (8 weeks ago), 2019-02-14 19:19:53 -0800
• Engine revision 3757390
• Dart version 2.1.2 (build 2.1.2-dev.0.0 0a7dcf17eb)

[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
• Android SDK at /Users/dwempe/Library/Android/sdk
• Android NDK location not configured (optional; useful for native profiling support)
• Platform android-28, build-tools 28.0.3
• Java binary at: /Applications/Android Studio 2.app/Contents/jre/jdk/Contents/Home/bin/java
• Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01)
• All Android licenses accepted.

[✓] iOS toolchain - develop for iOS devices (Xcode 10.2)
• Xcode at /Applications/Xcode.app/Contents/Developer
• Xcode 10.2, Build version 10E125
• ios-deploy 1.9.4
• CocoaPods version 1.5.3

[✓] Android Studio (version 3.3)
• Android Studio at /Applications/Android Studio 2.app/Contents
• Flutter plugin version 34.0.1
• Dart plugin version 182.5215
• Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01)

[✓] VS Code (version 1.33.0)
• VS Code at /Applications/Visual Studio Code.app/Contents
• Flutter extension version 2.24.0

[✓] Connected device (2 available)
• Android SDK built for x86 • emulator-5554 • android-x86 • Android 8.0.0 (API 26)
(emulator)
• _________ iPhone • 00008020-000B25CE0298002E • ios • iOS 12.2
annoyance crowd marketplace device-specific engine scrolling platform-ios performance

最有用的评论

我已经确认该问题是由 iPhone X/XS 更改输入事件处理引起的。 在 iPhone X/XS 上,输入采样率为 120Hz,输入事件回调/传递率为 60Hz。 然而,iPhone X/XS 上的 60Hz 回调变得比 iPhone 6 更不规则。

iPhone 6 回调间隔:
callback_interval

iPhone XS 回调间隔:
callback_interval

在滚动期间,Flutter 的框架由这些回调驱动。 如果回调时间与 60Hz VSYNC 信号不同步,就会出现丢帧现象。

我们很快就会想出解决办法。

所有84条评论

我在我的 iPhone X 和 iPhone 5 上尝试了这个小示例应用程序。我可以验证只有在 iPhone X 上,在拖动滚动时才会出现频繁的卡顿(丢失帧)。 只要我用手指放开屏幕,它就只能靠惯性滚动,这很好。

如果我向上滑动 iPhone X 上的应用程序开关,然后再次点击应用程序以恢复它,那么这些口吃也会增加,当它再次恢复时,我开始拖动滚动。 这可能与这个问题有关: https :

疯狂的猜测,但我们似乎只在触摸事件期间在https://github.com/flutter/flutter/issues/6135 中看到了类似的问题。 我们可能需要对传入的事件流进行门控。

感谢@yunyu示例应用程序,我在 iPhone X 上重现了一些口吃,但在 iPhone 6S 上没有。
附件是启用了--trace-skia的跟踪(GPU 线程帧时间超出预算约 26.8 秒)。

dart-timeline-2019-3-29.json.zip

考虑到它只发生在 iPhoneX 而不是 iPhone6S,我认为这与 iPhone X 的 GPU 硬件和 OpenGL 驱动程序有关。我希望 Skia 的 Metal 后端最终会解决这种问题。 到目前为止,我不确定 Flutter 如何在没有 Skia 帮助的情况下解决这个问题。

@bsalomon (Skia 的 GPU 负责人):你能从跟踪中看到一些可疑的东西吗? Skia 目前是否在 iPhone X 上运行测试? 我似乎只能在 perf.skia.org 上找到 iPhone 6/7。 我猜随着 iPhone X 获得更多的市场份额,这样的性能问题会变得越来越严重。 另请注意,此性能问题仅在首次启动或应用切换时发生。 因此,任何进行了大量热身重复的性能测试都可能无法捕捉到它。

@liyuqian请注意,如果您在滚动时按住手指,则此性能问题也很明显(松开手指时不会发生这种情况)。 不确定这是否是一个单独的问题。

@yunyu如果您在 _simulator_ 上看到这个,那是在非 Flutter 模拟器应用程序(例如“设置”应用程序)上按住手指时会发生的不同问题。

@tvolkert我在之前链接的示例应用程序的物理设备上看到了这个。

这种影响在 iPhone X 上很严重,在 iPad Pro(第 2 代)上影响很小,但仍然可以观察到。 还没有用其他设备测试过。

顺便说一句:大多数情况下,抖动会在 2-3 秒后消失。 但我什至经历过一些时候,抖动会一直存在并且只能通过重新启动应用程序来停止。

抱歉回复慢,刚放假回来。 我看了看痕迹。 在 GrRenderTargetOpList::onExecute(一帧中 31 毫秒)中花费了大量时间,但没有足够的跟踪细节来了解其中实际发生的情况。 我们需要更详细的跟踪事件来更好地了解时间的去向。

旁注:现在开始尝试集成 Metal 后端可能还为时过早。 我们正处于它几乎可以正确绘制所有内容并且性能大约等于 GL 的地步,但仍有待采摘。

@bsalomon获得更详细跟踪的最佳方法是什么?

@bsalomon 有关于这件事的最新消息吗?

我会尝试删除对 android 框架的此检查,以便我们可以看到哪些操作需要很长时间:

https://cs.chromium.org/chromium/src/third_party/skia/src/gpu/GrRenderTargetOpList.cpp?q=GrRenderTargetOpList.cpp&sq=package :chromium&g=0&l=499

我在 iPhone X 上看到了同样的情况。

然而,有趣的是,当我打开屏幕录制时,抖动完全消失了,一切都非常流畅。

我验证了多次。

我很想知道启用新的 Metal 后端是否会发生同样的问题。

@derolf @rahulgs12 @msw333 @yunyu @frasza @bobmoff @wemped你们中有人愿意构建自定义 Flutter 引擎并尝试一下吗? 说明可在https://github.com/flutter/flutter/issues/18208#issuecomment -491548659 获得

@tvolkert我正在使用平台视图。 金属后端会与它们一起工作吗?

顺便说一句,另一个有趣的观察结果:在横向模式下我看不到抖动。

@derolf我仍然在横向模式下遇到抖动

我正在使用平台视图。 金属后端会与它们一起工作吗?

@derolf应该的。 如果您愿意尽早尝试,我们很乐意提供有关哪些对您有效,哪些无效的反馈!

@tvolkert我明天会

其他人在进行屏幕录制时是否看到抖动消失了?

@derolf我测试了屏幕录制理论,但仍然在我的应用程序中看到抖动。

出于好奇,有人在 XR 上测试过吗? 如果它抖动比它排除最初理论化的 120hz 输入信号(XR 是 60hz 输入)。

@coreysprague我已经测试了 XR,没有抖动。 您甚至可以在模拟器中进行测试,并看到 {X|Xs|XsMax} 与 Xr 之间的巨大性能差异。

尝试编译 fluttere 引擎,但在尝试安装 gclient 时卡住了。 由于某种原因无法使其执行“gclient同步”。

改天再试一次。

@tvolkert我们很难为金属编译颤振。 有机会获得适用于 Mac 的预建垃圾箱吗?

顺便提一句。 我还认识到两件事:

  • 抖动取决于屏幕亮度。 如果小于 ~30% 则抖动,如果大于则平滑
  • 在平移使用 OpenGL(地图渲染)的本机视图时,我也看到了抖动

/cc @chinmaygarde

@derolf我没有看到屏幕亮度对我们的任何构建有任何影响。 无论设备有多亮,滚动时都有相同数量的抖动/卡顿。

我无法编译 Metal 引擎。 尝试编译 ios_release_metal 时收到这些(无关?)警告:
Screen Shot 2019-06-10 at 12 17 13 AM

似乎在某处插入了 -Werror,但我不知道如何解决它。

@tvolkert
我也无法弄清楚我们如何能够编译 Metal 引擎..是否有更详细的说明?

@wemped./flutter/tools/gn --ios --enable-metal <other flags as necessary> 。 此外,您可能会看到一些弃用错误, @chinmaygarde正在开发补丁来修复它们: https :

@liyuqian抱歉,我想我只是flutter/engine适应所有这些。
可能需要先后退几步

我需要克隆https://github.com/flutter/engine repo 吗?
我将如何强制颤振命令使用新的本地引擎?

最好的情况是从第一个步骤开始执行此操作,或者可能已经有我不知道的文档?

@tvolkert @liyuqian
今天运行设置步骤并在本指南的第 6 步 ( gclient sync ) 中遇到问题https://github.com/flutter/flutter/wiki/Setting-up-the-Engine-development-environment

它运行良好,直到它打印Syncing projects: 100% (97/97), done.
然后它挂了,我让它运行了大约 10 分钟左右,但是每次我最终杀死进程时,它看起来好像锁定了这条指令
Failed while running "cipd ensure -log-level error -root /Users/dwempe/***/***/engine -ensure-file /var/folders/n0/3qxxwjk57wn31l8qrgq2j73mm0fzqq/T/tmphTqiwW.ensure"

关于如何通过这个的任何想法?

@wemped :这一步可能是试图下载千兆字节的工具链(Android SDK + NDK + Fuchsia SDK + NDK + ...)。 您可以尝试监控您的网络使用情况以查看是否有正在进行的下载吗? 如果您的网络低于 10MB/s,则需要很长时间才能完成。

@wemped我通过查看最近的 depot_tools 提交来解决这个问题。 但是,由于上面提到的弃用警告问题,编译仍然无法工作。

@liyuqian @tvolkert
非常感谢您的持续帮助,这些文档很棒。 感觉我非常接近让这个工作,但无法弄清楚如何准备主机颤振引擎构建。

https://github.com/flutter/flutter/wiki/Compiling-the-engine
Compiling for iOS (from macOS)第 3 步中,我按照@liyuqian之前的建议执行并运行./flutter/tools/gn --ios --enable-metal来创建out/ios_debug_metal 。 但我似乎无法弄清楚如何匹配out/host_...

至少,我认为这就是问题所在,因为当我到达Running a Flutter app with a local engine并执行flutter run --local-engine=ios_debug_metal我收到此错误

No Flutter engine build found at /Users/dwempe/***/engine/src/out/host_debug_metal.

果然,那条路径不存在 - 存在的是host_debug_unoptios_debug_metal

@wemped :您需要符号链接ln -s host_profile host_profile_metalln -s host_debug host_debug_metal 。 在https://github.com/flutter/flutter/wiki/Compiling-the-engine 中查找符号链接以获取更多详细信息。

@yunyu :我们刚刚修复了https://github.com/flutter/engine/pull/9383 中的弃用警告问题

@liyuqian
提取最近的更改,运行编译引擎的所有步骤,以确保

flutter run --profile --local-engine=ios_profile_metal -d XXX-XXX

给我这个错误

Xcode build done.                                            6.7s
Failed to build iOS app
Error output from Xcode build:
↳
    ** BUILD FAILED **


Xcode's output:
↳
    === BUILD TARGET Runner OF PROJECT Runner WITH CONFIGURATION Profile ===
    Building AOT snapshot in profile mode (ios_profile_metal)...

    Compiler message:

    file:///Users/dwempe/***/flutter/packages/flutter/lib/src/painting/binding.dart:117:43: Error: No named parameter with the name 'decodedCacheRatioCap'.

        return ui.instantiateImageCodec(list, decodedCacheRatioCap: decodedCacheRatioCap); // ignore: deprecated_member_use_from_same_package

                                              ^^^^^^^^^^^^^^^^^^^^

    org-dartlang-sdk:///flutter/lib/ui/painting.dart:1657:15: Context: Found this candidate, but the arguments don't match.

    Future<Codec> instantiateImageCodec(Uint8List list, {

                  ^^^^^^^^^^^^^^^^^^^^^

    Compiler terminated unexpectedly.
    Failed to build /Users/dwempe/***/blank.

Could not build the precompiled application for the device.

Error running application on iPhone.

@wemped :这个错误似乎是 Flutter 框架版本和 Flutter 引擎版本不匹配。 您使用的是什么版本的框架(https://github.com/flutter/flutter)? 您可以尝试的一个特定修复是将您的 flutter 版本同步到https://github.com/flutter/flutter的 master 分支,然后根据以下内容同步您的引擎 (https://github.com/flutter/engine) 版本框架中的bin/internal/engine.version文件。

@liyuqian
OK,切换到框架主频道,升级了

$flutter --version
Flutter 1.7.10-pre.23 • channel master • https://github.com/flutter/flutter.git
Framework • revision c8cefce300 (49 minutes ago) • 2019-06-26 10:09:14 -0700
Engine • revision 3f4f606105
Tools • Dart 2.4.0

看起来 bin/internal/engine.version 中的引擎版本是3f4f606105a8f6217cfbe08e193aa9a54b19dbef

我如何将本地引擎同步到该版本?

在您的引擎回购结帐中运行git checkout 3f4f606105a8f6217cfbe08e193aa9a54b19dbef (例如,在~/flutter/engine/src/flutter ),然后重复gclient syncninja ... 、...

@liyuqian @tvolkert
好消息和坏消息。

我让它在启用金属的情况下运行 🎉( @liyuqian再次感谢您的帮助和耐心!)
它没有完全解决 iPhone X/s 上的滚动性能问题😞

现在给我的旧 iPhone 7 充电以得到一个并排并会报告,但到目前为止,我在拖动时看到同样类型的卡顿/丢失帧。 我也看到了,flings 看起来还是不错的。 只是缓慢拖动有问题。

@wemped :听到这个坏消息我很抱歉......我会告诉你一个好消息:我刚收到两台 Mac Mini 和 iPhone Xrs,我将把它们添加到我们的设备实验室中,这样我们就可以捕捉到这些一种 iPhone X 性能问题。

当我忙着设置它时,如果您可以为您的特定案例编写 Flutter 驱动测试并将其添加到我们的设备实验室,那将非常有帮助: https :

在我们的设备实验室进行路测可确保我们永远不会再次降低其性能。 希望它也能帮助您以更少的努力重现性能问题。

@liyuqian不幸的是,这个特殊的性能问题不会出现在 iPhone XR 上,所以我认为将它们添加到设备实验室不会有太大帮助。

我在我的 iPhone X 和 iPhone 5 上尝试了这个小示例应用程序。我可以验证只有在 iPhone X 上,在拖动滚动时才会出现频繁的卡顿(丢失帧)。 只要我用手指放开屏幕,它就只能靠惯性滚动,这很好。
如果我向上滑动 iPhone X 上的应用程序开关,然后再次点击应用程序以恢复它,那么这些口吃也会增加,当它再次恢复时,我开始拖动滚动。 这可能与此问题有关:#28113

对于我的同事,我们遇到了您在 iPhone X/Xs 上描述的相同问题。 iPhone 7 Plus 没有这些问题。
我们的应用程序有一个页面,显示一个包含大量记录/行的数据表。 在 Android 设备或 iPhone < X 系列上没有问题。 在页面滚动期间使用 iPhone Xs,它变得完全卡住了。 您唯一能做的就是更改页面。

@liyuqian
我认为重要的是要注意(如@yunyu所说)iPhone XR 没有这个问题。

我想帮助编写测试,但我不确定我的测试与您的 wiki 中链接的简单滚动测试有何不同(https://github.com/flutter/flutter/blob /master/dev/benchmarks/complex_layout/test_driver/scroll_perf_test.dart)。 除非有办法强制它在特定设备(iPhone X 或 Xs)上运行。

哦,我不知道https://github.com/flutter/flutter/blob/master/dev/benchmarks/complex_layout/test_driver/scroll_perf_test.dart就足够了。 在我们的设备实验室,我们有办法强制它在 iPhone XS 上运行。 现在购买 iPhone XS。

@liyuqian
新设备进展如何? 您是否能够重现滚动问题?

@wemped :我可以在设备上本地重现这些问题。 我已经在我们的实验室中设置了 iPhone XS,但是对于新的 Mac Mini 和 iPhone XS 对,我们的一些脚本一直超时。 很快就会弄清楚。

关于应用程序切换时的口吃:这似乎主要发生在低亮度设置下。 我不久前在 iPhone X(现在是 Xs)上注意到了这一点。 在全亮度下,口吃几乎不存在,但随着亮度一路下降,应用程序在切换后需要几秒钟才能开始正常运行。

@knopp感谢您提供信息! 还请您:

  1. 将 flutter 切换到 master 频道并在 iPhone X/XS 上运行此应用
    在启用 Skia 跟踪的情况下使用配置文件模式,如下所示:
    flutter channel master && flutter doctor -v && flutter run --profile --trace-skia
    然后按“P”启用性能叠加。 复制粘贴
    flutter doctor -v结果在这里,所以我们知道确切的主版本
    你正在使用的。
 The bleeding edge master channel is encouraged here because Flutter is
 constantly fixing bugs and improving its performance. Your problem in an
 older Flutter version may have already been solved in the master channel.
  1. 使用另一部手机录制性能问题的视频,以便我们
    可以对发生的事情有一个直观的了解。 不要使用
    “adb screenrecord”,因为这会影响配置文件运行的性能。

  2. 打开 Observatory 并保存性能问题的时间线跟踪
    所以我们知道哪些功能可能导致它。 请参阅“如何收集
    并阅读此博客文章中的时间线跟踪”:
    https://medium.com/flutter-io/profiling-flutter-applications-using-the-timeline-a1a434964af03#a499

@liyuqian ,我现在正在旅行,等我回来可能会去。 我已经使用 flutter master 一年了,自从我开始使用这个框架以来,这种行为就一直存在。

即使使用 Flutter Gallery,重现也应该非常简单,只需降低设备亮度即可。 行为取决于设备亮度的事实可能表明某种限制。

我没有看到亮度对性能产生积极或消极的影响。 我确实观察到当我切换回我的应用程序时,性能有时会下降一段时间,但我认为这与这个特定问题无关。

@liyuqian - 此时您是否需要任何东西来帮助重现所描述的原始问题(使用 iPhone X/XS 拖动时卡顿)?

我想知道如何制作一个演示应用程序,该应用程序允许基于手势的滚动或编程滚动,以尝试确认卡顿与手势相关。 不过我没有时间这样做。

@coreysprague我已经能够使用我不久前发布的示例应用程序始终如一地重现卡顿: https :

如果我可以提供任何其他信息,请告诉我。 我不认为不同项目有什么特别之处,只是与 XS、XS Max 有关。
个人项目在任何设备上运行绝对完美,直到它在 XS 上进行测试,在 XS 上滚动更糟糕。

我已经确认该问题是由 iPhone X/XS 更改输入事件处理引起的。 在 iPhone X/XS 上,输入采样率为 120Hz,输入事件回调/传递率为 60Hz。 然而,iPhone X/XS 上的 60Hz 回调变得比 iPhone 6 更不规则。

iPhone 6 回调间隔:
callback_interval

iPhone XS 回调间隔:
callback_interval

在滚动期间,Flutter 的框架由这些回调驱动。 如果回调时间与 60Hz VSYNC 信号不同步,就会出现丢帧现象。

我们很快就会想出解决办法。

很棒的工作! 感谢更新!

一个潜在的修复发布在https://github.com/flutter/flutter/pull/36616

在修复之前,我还添加了一些单元测试来验证,在最坏的情况下,我们可能会错过一半的帧。 修复后,在最坏的情况下,我们只会错过一帧。

以下是flutter_gallery scroll的对比:

修复前 | 修复后
:-------------------------:|:-------------------- ----:
scroll_before_fix_600px |scroll_after_fix2_600px

请让我知道该补丁是否也解决了您的应用程序和设备上的问题。

如果尚未合并到 master 中,我该如何测试它?

@frasza你可以在你的 flutter checkout 中使用 git:
git remote add liyuqian [email protected]:liyuqian/flutter.git
git fetch liyuqian
git checkout liyuqian/input_events

您可能还需要重建颤振工具:
rm bin/cache/flutter_tools.*

我试了一下树枝,这在我的 iPhone XS Max 上是昼夜不同的! 很棒的作品@liyuqian。

装运它! 😄

请注意,按照上面的说明,我在上面的 repo 上遇到了 SSH 密钥的问题并切换到了 https

git remote add liyuqian https://github.com/liyuqian/flutter.git

@liyuqian
刚刚试了一下,修复效果很好 🎉

@liyuqian我在拖动滚动时看到我的 iPhone XS 卡顿,而且在我抬起手指和惯性滚动之后也是如此。 它也会解决这个问题吗

我们在哪里解决问题? 已经发货了吗?

哪个版本的flutter解决了这个错误? @李玉倩@

由于我们正在尝试提出另一个较低级别的修复程序,因此该修复程序尚未发布或发货。 最近还出现了许多其他更关键的问题,因此不幸的是,尚未做出努力。

如果您迫切需要在您的应用程序上解决此问题,我建议您在本地 Flutter 中选择https://github.com/flutter/flutter/pull/36616

很高兴您想在较低级别修复它,但是您仍然可以暂时合并此修复程序吗? 我们已经等了将近 6 个月了...

你好@liyuqian ,我试过了,但那个公关并没有解决这个错误。 在我点击之后,滚动 janky 会继续一段距离。
在我看来,这个 bug 是 flutter 现在应该修复的最关键的问题,除了这个 bug,我可以接受任何 flutter 的 bug。 此错误导致如此糟糕的用户体验,在此错误解决之前,我无法将 Flutter 开发的应用程序发布到应用程序商店。

添加“拦截器”标签以进一步提高优先级。 将在本周更新。

你好@liyuqian ,我试过了,但那个公关并没有解决这个错误。 在我点击之后,滚动 janky 会继续一段距离。
在我看来,这个 bug 是 flutter 现在应该修复的最关键的问题,除了这个 bug,我可以接受任何 flutter 的 bug。 此错误导致如此糟糕的用户体验,在此错误解决之前,我无法将 Flutter 开发的应用程序发布到应用程序商店。

你可以用这个 hack 作为临时解决方案,尽量让亮度保持在 25% ~ 30% 以上😎
https://pub.dev/packages/screen

@wuyugege :你能在那个补丁之后发布更多关于 janky scroll 的细节吗?

例如,遵循我们的性能问题报告模板:

  1. 请准确告诉我们如何重现您遇到的问题。

  2. 请附上一个小应用程序(最好只有一个 main.dart 文件)
    重现问题。 您可以为此使用https://gist.github.com/

  3. 将 flutter 切换到 master 频道并在物理设备上运行此应用
    在启用 Skia 跟踪的情况下使用配置文件模式,如下所示:
    颤振通道大师
    颤动运行 --profile --trace-skia
    然后按“P”启用性能叠加。

    这里鼓励使用最前沿的主频道,因为 Flutter 是
    不断修复错误并提高其性能。 你的问题在
    老版本的 Flutter 可能已经在 master 频道解决了。

  4. 使用另一部手机录制性能问题的视频,以便我们
    可以对发生的事情有一个直观的了解。 不要使用
    “adb screenrecord”,因为这会影响配置文件运行的性能。

  5. 打开 Observatory 并保存性能问题的时间线跟踪
    所以我们知道哪些功能可能导致它。 请参阅“如何收集
    并阅读此博客文章中的时间线跟踪”:
    https://medium.com/flutter-io/profiling-flutter-applications-using-the-timeline-a1a434964af03#a499

我在两种情况下发现了这个错误。 @liyuqian
1、应用启动后
2、APP从后台切换到前台
在这两种情况下,当我在屏幕上滚动时,janky 会移动一段距离,然后消失。 这个错误可能不会每次都发生,但至少有 98% 的概率。
我在应用商店尝试过 Flutter 开发的应用,这个错误发生在每个应用上。 我很惊讶他们怎么能在生产中接受这个错误。
现在我使用稳定版的 flutter 1.7.8、测试版的 1.8.3、开发版的 1.9.5 构建我的应用程序。 这个bug还在。
您可以尝试打开此问题的兄弟提供的代码来重现此错误。
你也试试这个应用程序:https ://apps.apple.com/cn/app/cryptograph-designer-charts/id1375281233,
在 iphone x/xs 上。 滚动此应用程序的主页,您显然会发现此错误。

@wuyugege :是的,这是一个不同的问题(https://github.com/flutter/flutter/issues/32170,以前称为 https://github.com/flutter/flutter/issues/813)未包含在 PR 中.

@wuyugege

你也试试这个应用程序:https ://apps.apple.com/cn/app/cryptograph-designer-charts/id1375281233,
在 iphone x/xs 上。 滚动此应用程序的主页,您显然会发现此错误。

我可以确认这个应用程序在我的 iPhone Xs 上有 jank-disease,这也是我在我正在开发的应用程序上的确切行为。

@derolf :此问题特定于 iPhone X/Xs。 如果您在 iPhone XR 上遇到一些问题,也许最好在 https://github.com/flutter/flutter/issues/32170 上发表评论或创建新问题 :)

@liyuqian抱歉,这是一个 X。 我在上面编辑了我的评论。

我还有一些问题:

  • PR应该什么时候出现在主频道?

  • PR 是否也修复了 janky 动态滚动?

  • PR 是否还修复了在横向或屏幕录制时消失的 janky 滚动?

@德罗夫

  • PR应该什么时候出现在主频道?

不幸的是,之前的补丁已被恢复。 但我通过一些额外的修复重新登陆它: https :

  • PR 是否也修复了 janky 动态滚动?

动态滚动不应受输入事件的影响,因此即使没有修复也不应该有任何卡顿。 你能否附上更多关于 jank 的细节,特别是关于如何重现它?

  • PR 是否还修复了在横向或屏幕录制时消失的 janky 滚动?

我不确定它怎么会消失。 在我看来,补丁后在所有情况下卡顿都会消失。

(由于还原而重新打开问题。)

@liyuqian请参阅#40042(由我报告)和#38293(可能相关)。

现在似乎已固定在 master 上

@liyuqian应该重新关闭这个bug吗?

是的,自https://github.com/flutter/flutter/commit/b9a34dec7eab35abae3d2e0be37a7d73f9d8aceb以来框架中的重新修复。 关闭这个问题。

重新打开以进行另一次还原...

我在 Android OnePlus 7 Pro 上观察到相同的不规则输入传递和丢失事件。 樱桃采摘https://github.com/flutter/flutter/pull/36616大大缓解了,但Miss at most one frame for irregular scroll drag events仍然是一个问题,并且在其 90hz 屏幕上更明显,而不是 iPhone 的 60hz。

@derolf上面报告说,在屏幕录制时,抖动消失了。 我观察到同样的情况,而屏幕录像机锁定在 60fps。

@volskaya :感谢您的报告! 我正在创建一个新问题https://github.com/flutter/flutter/issues/41118来单独跟踪它。

该修复程序已重新登陆https://github.com/flutter/flutter/commit/4891e4a349f8e8973311bd064b143fbf122334fc 。 希望这一次不会被逆转。

此页面是否有帮助?
0 / 5 - 0 等级