【发布时间】:2018-02-05 16:00:52
【问题描述】:
在过去的几天里,我一直在解决我创建的应用程序中 FlatList 的性能问题。
FlatList 由静态标题和 x 行组成。在测量的情况下,有 62 行,每行由 4 个组件组成——其中一个被使用了 4 次,总共有 7 个行单元格。此列表中的每个单元格都是 TouchableNativeFeedback 或 TouchableOpacity(出于测试目的,那些已将 () => null 附加到 onPress。在几个级别(列表容器、行、单个单元格)上使用了 shouldComponentUpdate,我认为渲染性能对于这种情况来说已经足够好了列表。
为了获得一致的测量结果,我使用了initialNumToRender={data.length},因此整个列表会立即呈现。列表使用按钮呈现,数据加载不是我测量的一部分 - 它已预加载到组件本地状态。
根据附加的 Chrome Performance Profile JS 线程需要 1.33s 来渲染组件。我已经使用 CPU 减速 x6 来更准确地模拟 Android 设备。
但是,列表会在大约 15 秒标记处显示在设备上,因此从按下按钮到显示列表的实际渲染需要超过 14 秒!
我想弄清楚的是 JS 渲染组件和实际显示在屏幕上的组件之间发生了什么,因为设备是 整个那段时间反应迟钝。每个触摸事件都被注册,但只有在列表最终出现在屏幕上时才会播放。
我已经附加了来自 chrome 开发工具的跟踪、使用 android systrace 工具获取的 systrace 以及来自 android profiler 的屏幕(遗憾的是我找不到导出后者的选项)。
跟踪几乎同时运行 - 顺序是 systrace、android profiler、chrome 开发工具。
我应该采取哪些步骤来帮助我了解应用冻结时发生的情况?
Simple reproduction application (code in src.js, first commit)
【问题讨论】:
-
您能否在例如小吃.expo.io ?
-
我已经准备好复制应用,但它正在等待发布批准。我明天早上第一件事就回来了。
-
我在第一篇文章中添加了复制应用程序仓库的链接
标签: react-native react-native-android