requestAnimationFrame 在较弱的机器上运行缓慢。解决办法吗?

2024-07-04

所以,我正在制作一个动画(不是在网站/网页上!),它使用Javascript。对于动画,我使用requestAnimationFrame代替setInterval, as setInterval不能很好地满足我的需要。

然而,尽管requestAnimationFrame在性能良好的设备上运行良好,慢速设备无法跟上标准 60 FPS,从而减慢整个动画时间。

有没有办法让动画在一个时间范围内工作,并且让 FPS 根据其跟上的情况而变化?也欢迎其他想法。

(注意,我真的不想发布代码,只是相信我的话。我只是想要想法)


看看这个演示:http://jsfiddle.net/q7ckebmh/ http://jsfiddle.net/q7ckebmh/

function Animate(id, useTime){
    var can = document.getElementById(id),
        ctx = can.getContext('2d'),
        wid = can.width,
        hei = can.height,
        lst = Date.now(),
        rps = 2*Math.PI,
        step = rps/60,                       // Expecting 60fps
        ang = 0;

    (function draw(){
        var dif = Date.now() - lst;          // Milliseconds since last we drew. 
        lst = Date.now();                    
        if (useTime) step = rps * dif/1000;  // Allows for variable fps

        ang += step;                         // Increment our placeholder. In the 
                                             // case where step is constant, this
                                             // ends up looking "slow" when we 
                                             // have less than 60fps. 

        ctx.clearRect(0,0,wid,hei);
        ctx.beginPath();
        ctx.arc(wid/2 + Math.cos(ang)*50,hei/2 + Math.sin(ang)*50, 
            10,0,2*Math.PI);
        ctx.fill();

        requestAnimationFrame(draw);
    })();
}

Animate('can1', false);
Animate('can2', true);

您会注意到,如果调整帧大小,第一个动画会减慢,因为它跳过动画帧。

第二个动画似乎并没有减慢速度,因为它以自上次调用以来的时间为基础来确定圆圈的位置。它看起来确实有点不稳定,但位置总是正确的。

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

requestAnimationFrame 在较弱的机器上运行缓慢。解决办法吗? 的相关文章

随机推荐

  • 不要在 iOS 上显示蜂窝数据警告

    如果用户决定不允许应用程序在每次尝试打开应用程序时访问蜂窝数据 则会显示一条警告 告诉他们蜂窝数据已关闭 SDK中有没有办法停止显示此消息或控制其显示的时间 位置 如果您在权限被撤销的情况下尝试访问互联网 系统将显示此消息 为了防止它出现
  • 如何在 Python 3 中使用 smtplib.sendmail() 对收件人姓名(而不是地址)中的国际字符进行编码?

    我在 Python 3 程序中使用标准 smtplib sendmail 调用来发送电子邮件 如下所示 smtp session sendmail The Sender lt email protected cdn cgi l email
  • 暂停 RTMP 直播流后 VideoJS 不播放

    我正在使用 VideoJS 从 Wowza 服务器进行实时流 但是当我暂停播放器并再次播放时 播放器不会恢复流 我需要重新加载网页才能再次启动流
  • 在 X11 中以快速帧速率捕获 OpenGL 窗口 - 可能吗?

    我有一个大小为 800x600 的 OpenGL 应用程序在我的 Linux 机器 X11 上运行 该应用程序的内容 渲染的图像 应通过网络导出到另一台电脑 首先 我想知道是否可以以大约 30 Hz 的频率拍摄应用程序窗口的快照 将它们保存
  • jQuery 循环淡入淡出两个图像!

    我无法弄清楚如何让简单的淡入淡出循环发挥作用 正如你所见 我对 jQuery 还很陌生 我已经尝试过 但现在需要很长时间才能解决 所以我想我应该寻求一些帮助 我想做的事 我有两个图像 id 为 img1 和 img2 我希望图像 1 淡入
  • 两行标题的填充

    这有点难以解释 如果有人知道更好的标题 请继续更改它 我想在标题后面画一个黑框 我正在使用 h 标签内的跨度来执行此操作 它需要向左和向右一点填充 我的布局是响应式的 因此标题可能会分成两行 div class headline black
  • ipython:如何设置终端宽度

    当我使用ipython terminal并想要打印一个numpy ndarray它有很多列 行会在大约 80 个字符处自动断行 即行的宽度为 cca 80 个字符 z zeros 2 20 print z 据推测 ipython 预计我的终
  • Kivy:如何在树视图中使用 on_key_down 和 on_key_up 键盘事件?

    我在用python 2 7 and kivy 1 10 0 当我点击nameTextInput 然后树视图显示 我希望选择标签up and down键 并且当enter按下键 文本被复制 所选文本被复制到初始表单 就像您单击该项目时当前完成
  • 在派生虚函数中强制执行正确的参数类型

    我发现很难非常简洁地描述这个问题 所以我附上了演示程序的代码 总的想法是 我们需要一组派生类 它们被迫从基类实现一些抽象 Foo 函数 每个派生的 Foo 调用都必须接受不同的参数作为输入 但所有参数也应该从 BaseInput 类派生 到
  • 如何从张量流中的两个张量创建字典?

    我有两个张量 一个用于键 一个用于值 我正在尝试从它们创建一个字典 以便我可以使用创建的字典来更新另一个字典update 功能 我怎样才能实现这个 我不是在寻找tf contrib lookup HashTable 我尝试过使用tf map
  • 如何加快 AWS Fargate 上的部署速度?

    从 EC2 集群实例迁移到 AWS Fargate 后 我意识到部署需要更长的时间 以前需要 1 2 分钟 现在某些部署最多需要 5 分钟 这个帖子 https datree io blog migrating to aws ecs far
  • 以编程方式另存为 PowerPoint 2003 中的 PowerPoint 2007 (pptx)

    我需要能够将 PowerPoint 2003 中的演示文稿 以编程方式 保存为 OpenXML pptx 我安装了 Microsoft Office 兼容包 这确实允许我从 PowerPoint 2003 执行 另存为 PowerPoint
  • ModuleNotFoundError:没有名为“binance.client”的模块; “binance”不是一个包

    嘿 我是 Stack Over Flow 和 Python 的新手 但想学习并希望有人可以帮助我 我正在尝试在 python 中开发一个币安交易机器人 请参阅下面我的脚本 from binance client import Client
  • VS Code,更改调试器的 NodeJS 版本

    我想将 VS Code 的 NodeJS 版本从 4 5 0 更改为 7 7 2 专门针对不同的项目 我在Mac上使用nvm 并且我有上面提到的两个版本 它们用于不同的项目 尽管我可以使用 nvm 从终端进行更改 但 VS Code 使用默
  • 如何扩展 C# 内置类型,例如 String?

    我需要Trim a String 但我想删除字符串本身内所有重复的空格 而不仅仅是在其末尾或开头 我可以用这样的方法来做到这一点 public static string ConvertWhitespacesToSingleSpaces s
  • C#:秒到分钟到小时的转换?

    好吧 首先 我很确定我不会在这项作业中使用 TimeSpan 相反 当用户在文本框中输入秒数时 它会在消息框中显示秒 分钟和小时的公式系列 这就是我被困住的地方 我们应该用这个例子来检查我们的答案 7565 秒是 2 小时 6 分 5 秒
  • 共享库卸载的钩子函数

    我想添加钩子函数 该函数将在卸载共享库时被调用 库在编译时链接 可以做这样的事吗 也许 gcc 有标志吗 我看到了在运行时加载库的类似解决方案 但它不符合我的期望 对于 Linux 系统 dlopen dlclose 手册页解释了如何将这样
  • 如何在 Blazor Web 程序集中检查客户端连接状态

    我有一个 Blazor webasemmbly 应用程序 它使用 asp net core 作为后端 使用 Blazor wasm 作为前端 我有一个类可以检查 HTTP 问题 例如 notfound BadReqest 和 public
  • 如何在javafx中嵌入PApplet?

    所以我让我的处理代码在java中运行 但现在我想将它嵌入到我的 GUI 的 JavaFX 中 我怎样才能这样做呢 我尝试使用以下代码 但它似乎不起作用 package testprocessing import javafx applica
  • requestAnimationFrame 在较弱的机器上运行缓慢。解决办法吗?

    所以 我正在制作一个动画 不是在网站 网页上 它使用Javascript 对于动画 我使用requestAnimationFrame代替setInterval as setInterval不能很好地满足我的需要 然而 尽管requestAn