RN性能
https://facebook.github.io/react-native/docs/performance.html
一个使用RN而不是webView的重要原因是可实现60fps以及更类似原生app的用户体验。RN的性能比较好,但某些地方仍然需要用户去手动优化
帧
打开Show Perf Monitor可以查看到帧率信息。这里有两个不同的帧率
JS帧率
一般来说,业务逻辑运行在JS线程,在每轮事件循环后以及每帧的期限之前,都去更新视图以及把视图发送到原生平台。假如JS线程对一个帧无响应,则这个帧就会被丢弃。如对于一个复杂应用,执行setState重新渲染一颗子树需要消耗200ms,则大概有12帧会丢失,任何JS控制的动画在这段期间都会停止。
这通常发生在Navigator过渡。当我们添加一个路由,为了能发送合适的指令给原生平台来创建视图,JS线程会渲染路由内所有的组件,这需要花费几帧的时间,导致Jank(用户能明显感觉到帧率下降,影响用户体验,这个现象称为Jank),这是因为过渡由JS线程来控制的。而且组件中的componentDidMount内可能还会做其他耗时的事情,这会使动画过渡出现更加明显的卡顿。
另外一个例子就是对触摸的响应。举个例子,如果JS线程执行的逻辑需要消耗几帧的时间,则可以发现TouchableOpacity有延迟。这是因为JS线程正忙,无法处理从主线程发来的原生触摸事件,这就到时TouchableOpacity无法处理触摸事件以及无法调整视图的透明度。
UI帧率
NavigatorIOS的性能要比Navigator要好,这是因为动画的过渡在主线程中完成,而不在JS线程中。如果在JS线程中可能因为逻辑过多导致一些帧被丢弃。
类似地,当JS线程正忙,也可以使用ScrollView,因为它存在于主线程,滚动的事件会传递给JS线程,但JS线程中的对应事件处理器对ScrollView的滚动是无影响的。
常见性能问题的源头
运行在开发环境
在处于开发环境时(dev=true),JS线程性能比较差,这是不可以避免,因为需要在运行时提供警告以及错误信息。但可以在release build(安装的时候执行 react-native run-android --variant=release)下进行性能测试
使用console.log
这个语句在运行的时候,会给JS线程造成巨大的瓶颈,需要保证在发布的时候移除这些日志输出。可以通过babel-plugin-transform-remove-console插件来实现,在项目的目录添加一个.babelrc文件:
{
"env": {
"production": {
"plugins": ["transform-remove-console"]
}
}
}
当发布的时候,这些console.*就会自动被移除了。
ListView
使用FlatList或者SectionList来替换,除了可以简化API,这些新的列表组件由显著的性能增强,主要是当列表item数据量较大时,只消耗常量级别的内存。
假如FlatList渲染较慢,要确保实现了getItemLayout来跳过测量已经渲染过了的item。
重新渲染一个不变化的视图
通过shouldComponentUpdate来决定组件什么时候要重新渲染,可以通过PureRenderMixin + immutable来实现一个纯组件(render的返回由state和props来控制)
JS线程同时做太多工作以至于丢失一些帧
明显的例子就是缓慢的路由过渡
待续。
RN性能的更多相关文章
- RN性能优化(重新探索react吧)
最近做RN遇到了一些性能瓶颈,逼着自己不得不做一些优化 已经做过,或者尝试过得优化方案: 1.点击效果防止重复点击. 2.左右两边分别用两个异步栈进行更新,这样能让右边的缓慢不影响左边的更新. 3.I ...
- RN 性能优化
按需加载: 导出模块使用属性getter动态require 使用Import语句导入模块,会自动执行所加载的模块.如果你有一个公共组件供业务方使用,例如:common.js import A from ...
- 【腾讯Bugly干货分享】跨平台 ListView 性能优化
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/FbiSLPxFdGqJ00WgpJ94yw 导语 精 ...
- React Native Changed the World? or Nothing.
RN是一个awesome的技术, facebook很有想法的团队创造出一项新的技术改变了native开发界. 但是RN本身又疑点重重, RN是为了解决什么问题而存在的? 在诞生了一年后, RN又解决了 ...
- 新手教程之:循环网络和LSTM指南 (A Beginner’s Guide to Recurrent Networks and LSTMs)
新手教程之:循环网络和LSTM指南 (A Beginner’s Guide to Recurrent Networks and LSTMs) 本文翻译自:http://deeplearning4j.o ...
- React Native在特赞的应用与实践
基于React技术栈构建开发前端项目,并使用React Native开发特赞移动APP 目前正在使用Node.js开发和维护特赞服务网关,希望Node.js能够在更轻量级的微服务架构中发挥重要作用 课 ...
- 选择 React Native 的理由
转载:选择 React Native 的理由 从开始知道 React Native 到现在已经过了5个月,真实的试用也经历了三个月的时间.阅读文档开始,了解是什么,到简单的理解为什么,都是在聆听不同的 ...
- 给所有开发者的React Native详细入门指南
建议先下载好资料后,再阅读本文.demo代码和资料下载 目录 一.前言 二.回答一些问题 1.为什么写此教程 2.本文适合哪些人看 3.如何使用本教程 4.需要先学习JavaScript.HTML.C ...
- 你确信 X-Forwarded-For 拿到的就是用户真实 IP 吗?
X-Forwarded-For 拿到的就是真实 IP 吗? 1.故事 在这个小节开始前,我先讲一个开发中的小故事,可以加深一下大家对这个字段的理解. 前段时间要做一个和风控相关的需求,需要拿到用户的 ...
随机推荐
- java中数据的存放位置
引用自java编程思想四----2.2.1 程序运行时,我们最好对数据保存到什么地方做到心中有数.特别要注意的是内存的分配.有六个地方都可以保存数据:(1) 寄存器.这是最快的保存区域,因为它位于和其 ...
- Flask (二) cookie 与 session 模型
会话技术 Cookie 客户端端的会话技术 cookie本身由浏览器保存,通过Response将cookie写到浏览器上,下一次访问,浏览器会根据不同的规则携带cookie过来 特点: - 客 ...
- ZSP12项目的总结
前言:一款测量仪器做出来容易,想好做好还是需要投入更多的时间和心血. 项目概述:硬件已经定型,在C8051F020基础上的软件开发. 一 关于C8051F单片机:虽然自己整过8051单片机,但那已经是 ...
- 8593 最大覆盖问题 two pointer
8593 最大覆盖问题 时间限制:50MS 内存限制:1000K提交次数:193 通过次数:88 题型: 编程题 语言: G++;GCC;VC Description 输入格式 第1行是正整数n ...
- WPF中获取指定坐标依赖对象数据项
上图中红色框区域是一个自定义的ListBox控件,需要实现的功能是,点击红框区域中某项时,获取当前选中项的数据项 控件的MouseDown事件部分代码为: var x = TreeHelper.Fin ...
- 我喜欢的两个js类实现方式 现在再加上一个 极简主义法
闭包实现 变量是不会变的:) var myApplication = function(){ var name = 'Yuri'; var age = '34'; var status = 'sing ...
- .NET Core 1.0 CentOS7 尝试(三、使用VSCode创建一个Web应用)
参考地址:https://docs.asp.net/en/latest/tutorials/your-first-mac-aspnet.html 一.使用VSCode创建一个目录FirstWebApp ...
- sql 函数 coalesce
SQL函数 coalesce 功能: 返回参数中第一个非null的值. 语法: coalesce(参数1,参数2,参数3,...);返回第一个非null的值. 一般情况下会与Nullif()函数一起使 ...
- 洛谷 P1464 Function
题目描述 对于一个递归函数w(a,b,c) 如果a<=0 or b<=0 or c<=0就返回值1. 如果a>20 or b>20 or c>20就返回w(20,2 ...
- Fedora CentOS Red Hat中让vim支持语法高亮设置
Fedora / CentOS / Red Hat这三个系统里默认的vi是没有语法高亮显示的,白色的字体看起来很不舒服. 首先用命令行cat /etc/os-release查看当前linux系统的类型 ...