热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在React中使用requestAnimationFrame

如何解决《在React中使用requestAnimationFrame》经验,为你挑选了1个好方法。

我是新手,我会尝试优化性能.

我的触摸事件非常缓慢,我正在通过RN文档了解性能,他们已经提到要使用requestAnimationFrame此示例

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

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

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

 this.touched(this.props.coinShortName)}>

哪个叫这个方法

 touched = (id) => {

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

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



1> agm1984..:

我将把我的评论转换成答案,以便我可以更好地设置其格式,并希望将来对某人有所帮助。我不明确建议将答案标记为正确,但我认为此答案应与该问题一起出现。

本文应该为您提供一些背景资料requestAnimationFrame: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每1帧16.7ms。如果人眼感知到20FPS的平滑度,则意味着理论上您可以每45毫秒或30%进行一次重绘,并且动画仍将是平滑的。

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


您能否解决整个反应方面的问题?您将如何/在何处使用此功能?
推荐阅读
  • 本文是一篇翻译文章,介绍了async/await的用法和特点。async关键字被放置在函数前面,意味着该函数总是返回一个promise。文章还提到了可以显式返回一个promise的方法。该特性使得async/await更易于理解和使用。本文还提到了一些可能的错误,并希望读者能够指正。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • JavaWeb中读取文件资源的路径问题及解决方法
    在JavaWeb开发中,读取文件资源的路径是一个常见的问题。本文介绍了使用绝对路径和相对路径两种方法来解决这个问题,并给出了相应的代码示例。同时,还讨论了使用绝对路径的优缺点,以及如何正确使用相对路径来读取文件。通过本文的学习,读者可以掌握在JavaWeb中正确找到和读取文件资源的方法。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 近期,某用户在重启RAC一个节点的数据库实例时,发现启动速度非常慢。同时业务部门反馈连接RAC存活节点的业务也受影响。通过对日志的分析, ... [详细]
  • mysqldinitializeconsole失败_mysql03误删除了所有用户解决办法
    误删除了所有用户解决办法第一种方法(企业常用)1.将数据库down掉[rootdb03mysql]#etcinit.dmysqldstopShuttingdownMySQL..SU ... [详细]
author-avatar
超级独自旅行也快乐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有