在 React 中使用 requestAnimationFrame

2024-01-01

我是原生反应新手,我正在尝试优化性能。

我的触摸事件非常慢,我正在经历RN 性能文档 https://facebook.github.io/react-native/docs/performance#my-touchablex-view-isn-t-very-responsive他们提到使用requestAnimationFrame以这个例子

handleOnPress() {
  // Always use TimerMixin with requestAnimationFrame, setTimeout and
  // setInterval
  this.requestAnimationFrame(() => {
    this.doExpensiveAction();
  });
}

现在,这个描述听起来非常模糊,我很难理解它的用法

就像,我的 RN 应用程序中有这个可触摸事件

<TouchableWithoutFeedback   onPress={() => this.touched(this.props.coinShortName)}>

哪个调用了这个方法

 touched = (id) => {

        this.setState({selectedPostId: id})
        if (this.props.coinShortName == this.state.selectedPostId ) { 
           this.setState({stateToDisplay: !this.state.stateToDisplay})
        }
    }

问题:有人可以告诉我我需要/应该如何在我的应用程序中使用它吗?


我将把我的评论转换成答案,这样我就可以更好地格式化它,并希望将来也能帮助别人。我不明确建议将我的答案标记为正确,但我认为这个答案应该与这个问题一起出现。

这篇文章应该给你一些背景故事requestAnimationFrame: http://www.javascriptkit.com/javatutors/requestanimationframe.shtml http://www.javascriptkit.com/javatutors/requestanimationframe.shtml.

我建议阅读上面链接的文章,然后阅读我的答案。

我只会明确提及requestAnimationFrame可能看起来类似于setTimeout(() => {}, 0),但如果你有一部 1985 年生产的 Zack Morris 手机,它的“尽快”可能会晚 5 秒,从而使你的动画看起来很糟糕,类似于电子游戏中你的角色在屏幕上滞后的情况。该函数可能在正确的时间被调用,但实际上并没有在正确的时间执行。

想象一下收集阶段和渲染阶段会很有帮助。抱歉,我不知道这个东西的确切术语,但我认为人眼可以在 20 FPS 下看到平滑的运动,但这意味着你有 20 个“帧”,所以就像计算了 20 次一样。这就像每秒 20 次聚集一群孩子并将他们推入公共汽车。将它们推入公共汽车是一个事件,这类似于重新绘制屏幕。有时,孩子们可能会被落在后面,而下一次就会有更多的孩子被接走,所以你可以想象随着时间的推移,感知流程的流畅度会得到怎样的提升。

值得注意的是,优化是针对下一次重新绘制或下一次屏幕“更改”时进行的。requestAnimationFrame确实在幕后工作,以确保动画在正确的时间发生并且平滑,这意味着像素在正确的时间位于应有的位置。 (我认为,如果您查看“什么是卡顿动画”的定义,并查看一些围绕该问题的讨论,您会获得很多意义。我提到这一点是因为我们想更多地了解重画过程以及什么各种事情很重要以及为什么)

我记得requestAnimationFrame可以放弃为时已晚的计算。例如,如果单击按钮,像素会从 0% 到 25% 到 50% 到 75% 到 100%(某种任意距离计算)。我们可以说,1 秒后,像素应该已经移动了 50% 的距离,2 秒后,它应该达到 100%,即最终的静止位置。

像素在正确的时间位于正确的位置比它们准确地到达它们应该到达的每个位置更重要。requestAnimationFrame正在帮助您做到这一点。如果屏幕即将重新绘制,并且“它”需要运行一个需要太长时间的计算,“它”就会忽略它并跳到下一帧。这就像通过减脂来保持步伐一样,从而避免卡顿。

requestAnimationFrame无论是在 Web 浏览器、iOS 还是 Android 中,它都是针对相同挑战的解决方案。他们都一遍又一遍地重复这个绘制屏幕的过程。您可以开始计算下一次重新绘制所需的内容,但开始得太晚,因此在下一次重新绘制发生时尚未完成。

想象一下,你的动画很流畅,但你的手机突然收到 20 条推送通知,导致 CPU 陷入困境,导致你的动画延迟16.7 milliseconds。而不是在错误的时间在正确的位置显示像素,requestAnimationFrame通过使像素在正确的时间位于正确的位置来提供帮助,但它可能会发挥一些魔力,甚至有时在本来应该绘制像素的情况下不尝试绘制像素,从而节省性能并提高性能感知到的平滑度。

我刚刚意识到这是一面文字墙,但我认为它会提供信息。

这些重绘大约每秒发生 60 帧,因此requestAnimationFrame当计算出最佳时间时,每秒可以发射 60 次。 1 秒有 1000 毫秒,所以 60 FPS 就是每帧一帧16.7ms。如果人眼在 20FPS 时感知到平滑度,那么理论上您可以每 45 毫秒或 30% 重新绘制一次,并且动画仍然会平滑。

我的定义可能不准确,但我希望它们可以帮助您了解正在发生的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 React 中使用 requestAnimationFrame 的相关文章

随机推荐

  • 如何在android中滚动tableview

    我有一个要滚动的表格视图 因为数据未显示完整
  • ggplot2 轴标签分组

    我正在尝试使用 ggplot2 构建一个图 在 X 轴上我可以找到某种为变量组添加标签的方法 这是我的代码的最小版本 Bzero lt 100 matrix runif 100 ncol 10 nrow 10 B lt 99 LNtype
  • 横向压平两列,雪花中不重复

    我有一个查询 该查询按两个变量进行分组以获得另一个变量的总数 为了维护我的表结构以供以后计算 我列出了另外两个变量以保存查询的下一阶段 但是 当我尝试稍后对 listagg 列进行两次展平时 我的数据会重复多次 示例 my table id
  • PyQt |信号不在 QThread 中处理,而是在主线程中处理

    在这个简单的 PyQt 演示程序中 我从主线程发出信号 在工作线程中 我连接到它们 但信号处理程序在主线程中运行 from PyQt4 import QtGui QtCore import threading from time impor
  • 使用没有 Surface View 的 Android 相机

    我正在android上开发 我想用相机做一些事情 处理像素的值 但只是在后台 是否可以在没有表面视图的情况下做到这一点 只需使用缓冲区读取像素值并进行处理 感谢每一位可以帮助我的人 从 API 级别 11 开始表面纹理 http devel
  • 哪些 GCC 优化标志和技术在 CPU 上是安全的?

    当编译 链接适用于 ISA 例如 x86 64 的所有实现的 C C 库或程序时 从正确性和运行时性能的角度来看 哪些优化标志是安全的 我希望优化能够产生正确的结果 并且不会对特定 CPU 的性能造成损害 例如 我希望避免优化标志 这些优化
  • SpannableStringBuilder 用正则表达式替换内容

    我有以下代码 我将在其中标记大括号之间的内容SpannableString并删除花括号 但它给出了错误的结果 String text the quic k brown fox jumps over the lazy dog A Quick
  • 嵌套参数无法编译

    我正在尝试将我的代码编译成 Python 3 模块 当我在 IDLE 中选择 运行模块 时它运行良好 但当我尝试创建发行版时收到以下语法错误 File usr local lib python3 2 dist packages simple
  • 生成 CrypoAPI (CAPI) 私钥

    我正在尝试使用静态加密IXml加密器 https learn microsoft com en us aspnet core security data protection extensibility key management vie
  • php 中未定义的函数 mysql_connect()

    我安装了 mysql installer web community 5 6 25 0 apache 2 4 2 x86 no ssl 和 php 5 4 42 Win32 VC9 x86 php 可以与 apache 服务器配合使用 但不
  • 如何增加 MDCTextInputControllerOutlinedTextArea 的高度

    I have assigned a class named MDCMultilineTextField for Uiview from the storyboard This class is used for Multiline Text
  • 生产者消费者 - ExecutorService 和 ArrayBlockingQueue

    我想知道我对使用 ExecutorService 和 ArrayBlockingQueue 的生产者消费者设计的理解是否正确 我知道有不同的方法来实现这个设计 但我想 最终 这取决于问题本身 我必须面对的问题是 我有一个制作人 他从一个大文
  • jQuery 的 crossdomain.xml?

    我有一个托管在 Tumblr 上的博客 我有一个单独的主机 我在其中存储我制作的主题的所有图像 js css 等 不过 我也在使用查询加载器2 http www gayadesign com diy queryloader2 preload
  • 将变量注入 webpack

    我试图将一个变量注入到 webpack 包中的每个模块中 以便获得每个文件的 JS 错误的调试信息 我已启用 node filename true webpack 中的当前文件路径 https stackoverflow com quest
  • 为什么 form.submit() 不会触发“提交”事件?

    我正在使用 JavaScript submit 函数提交表单 form submit 但是当我使用 addEventListener 捕获我的提交事件时 它不起作用 form addEventListener submit function
  • 如何避免散点图/ggplot 中相同数据点的标签重叠?

    是否有任何函数等可以避免散点图中相同数据点的数据标签重叠 我已经检查了对 textxy direct label 和 geom text 的各种问题 答复 但没有成功 也许这根本不可能 以下是相关数据的示例 structure list c
  • 每次我登录游戏时,Unity Facebook SDK 都会不断要求我确认登录

    我正在使用 Unity3D 2018 2 6f1 和 Facebook SDK 这是用户单击登录按钮后我用来登录 Facebook 的代码 FB Init gt FB LogInWithReadPermissions new List
  • 在 SICP 中推广素数对

    我花了一些时间来研究 素数对 的生成SICP 第 2 2 3 节 作为常规接口的序列 例如 1 3 不 因为总和 4 1 4 是的 因为 sum 5 素数 这是我从头开始得到的 有效的 lang sicp RANGE helper func
  • Android DatePicker 在使用最小/最大限制时显示不可用月份

    我在 StackOverflow 上只发现了这个问题的另外 1 个实例 但尚未得到答复 去年 所以我想我应该再试一次 Android DatePicker Dialog 使用最小 最大日期显示不正确的月份 秒 https stackover
  • 在 React 中使用 requestAnimationFrame

    我是原生反应新手 我正在尝试优化性能 我的触摸事件非常慢 我正在经历RN 性能文档 https facebook github io react native docs performance my touchablex view isn