ReactNative之FlatList白屏优化方案
2018-11-08 本文已影响43人
Super面包
FlatList的思路是减少渲染的单元行数量,它在render时进行计算,只渲染屏幕中和缓冲区内的单元行,其余地方使用空白代替,这样不论FlatList有多少内容,实际渲染的单元行数量基本保持不变。因为有的单元行并没有渲染,当快速滑动到这个区域时,渲染是异步的,此时就会看到白屏,然后才开始显示内容。
优化方案:
(1)首先是单元行组件如果使用PureComponent可以大大减少render的数量。其次实现props.getItemLayout接口可以避免临时测量每个单元行的尺寸,大大提高性能,如果能明确每个单元行的尺寸就一定要实现此接口。
(2)initialNumToRender属性默认为10,它设定初始时渲染的单元行数量,这些单元行会常驻内存不被销毁,目的是为了scrollToTop时没有白屏。
(3)maxToRenderPerBatch属性默认为10,它设定了在计算渲染单元行数量时每次处理的行数,这个数值如果太大可能导致渲染的单元行较多,占用内存以及增加白屏时间,如果太小了则会增加setState的次数
(4)windowSize属性指定了屏幕外的区域渲染多少个屏幕单元(visible length),默认是21,它也会影响初始渲染的单元行数量。假如一个android设备高度为640,减去20像素的状态栏,一个屏幕单元是620,会额外渲染20个。这个数字如果比较大,则同时渲染的单元格数量会比较多,也增加了初始化的时间,如果比较小,则会增加出现白屏的几率。
我由于是动态高度,所以采取设置windowSize的大小来减少白屏的出现几率,经测试,设置为300快速滑动基本不会出现白屏了。
windowSize={300}