HTML 画布在调整大小后更新次数过多

2023-12-05

我有一个画布,可以在其中制作动画。我监听窗口调整大小事件,更新画布大小并再次开始递归绘图。但旧的 draw() 调用似乎仍在继续,这导致动画比预期的速度更快。 这是代码:

HTML

<canvas id="myCanvas" width="1000" height="1000"></canvas>

CSS

* {
  margin: 0;
  padding: 0;
}

html,
body {
  width: 100%;
  height: 100%;
}

canvas {
  display: block;
}

JavaScript

var canvas = document.getElementById("myCanvas");
var context = canvas.getContext('2d');
var frameCount = 0;
var count = 0;

var rectDistance = 100;
var rectSize = 72;
var rectOffset = (rectDistance - rectSize) / 2;
var angleSpeed = 1;

var draw = function() {
  count++;

  var xCount = canvas.width / rectDistance;
  var yCount = canvas.height / rectDistance;

  context.fillStyle = "rgba(255,255,255,1)";
  context.fillRect(0, 0, canvas.width, canvas.height);

  for (var i = 0; i < xCount; i++) {
    for (var j = 0; j < yCount; j++) {

      context.save();

      var r = Math.round(i / xCount * 255);
      var g = Math.round(j / xCount * 255);

      xPos = i * rectDistance + rectOffset + Math.sin(j + frameCount / 20) * 10;
      yPos = j * rectDistance + rectOffset + Math.cos(i + frameCount / 20) * 10;

      context.translate(xPos + rectSize / 2, yPos + rectSize / 2);
      context.rotate(frameCount / 100 * angleSpeed * Math.sin(frameCount / 500) * 5);

      context.fillStyle = "rgba(" + r + "," + g + ",0,1)";
      context.fillRect(-rectSize / 2, -rectSize / 2, rectSize, rectSize);
      context.restore();
    }
  }

  frameCount = frameCount + 1;
  requestAnimationFrame(draw);
};

window.addEventListener('resize', function() {
  setTimeout(function() {
    resizeCanvas();
  }, 500);
}, false);

function resizeCanvas() {
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;

  draw();
}

// count the calls of draw() per second -> it's increasing on window.resize
function drawCalls() {
  setTimeout(function() {
    console.log("draw() called " + count + " times");
    count = 0;
    drawCalls();
  }, 1000)
}
drawCalls();

// start the loop
resizeCanvas();

如何防止旧的draw()调用在调整大小时继续递归执行?

这是一个具有相同问题的代码笔:http://codepen.io/Sebkasanzew/pen/GZGZVP


您忘记取消setTimeout()- 我建议如下:

var timer;

window.addEventListener('resize', function() {
  cancelAnimationFrame(timer);                  // cancel previous request
  timer = requestAnimationFrame(function() {    // create a new request
    resizeCanvas();
  })
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTML 画布在调整大小后更新次数过多 的相关文章

随机推荐

  • C 匹配组中的正则表达式

    我一直在努力解决 C 中的正则表达式 只是 usr include regex h 我有 比方说 数百个正则表达式 其中之一可以匹配输入字符串 目前我正在这样做 实际上生成它 如下所示 数百个 do while 内部有匹配 如果不匹配则中断
  • Hibernate多对多,重复相同的记录

    我尝试使用注释进行 Hibernate 映射多对多 并使用 vaannila 中给出的示例 http www vaannila com hibernate hibernate example hibernate mapping many t
  • 更新另一个视图上的标签

    我有两个视图 其中一个带有标签 在第二个视图上 有一个按钮 我想在这里实现的是能够按下按钮并更新第一个视图上的标签 我怎么做 我无法从第二个视图访问 IBOutlet 我必须对 IBOutlet 做些什么才能将其公开等吗 您可以使用NSNo
  • 如何在C#中的dll中进行全局异常处理?

    Dll 在 C 中没有入口点 因此我需要将全局异常处理的代码放在一处 因为这些 dll 在 exe 中引用 并且所有 dll 都有 try catch 但存在一些错误 导致它崩溃并识别我们正在尝试创建故障转储 任何人都可以建议这是可行的解决
  • 使用 HttpClient 发布自定义类型

    我有一个自定义 dto 类 public class myObject public string Id get set public string Name get set 和使用 Web Api 的控制器 4 5 net 框架 Http
  • 如何在 C 函数内使用全局结构引用填充结构指针?

    我是 C 新手 无法理解为什么 my struct ptr main 在下面的示例中为零 如何将 my structs 数组中结构的地址分配给 get my struct by name 函数中的 my struct ptr 指针 stru
  • Python 中根据条件求和嵌套列表

    我有一个嵌套列表 如下所示 Vienna 2012 890 503 70 London 2014 5400 879 78 London 2014 4800 70 90 Bern 2013 300 450 678 Vienna 2013 70
  • 将节点排列在特定位置

    在下面的 vis network 中 我有 2 组节点 我通过在生成一个节点后访问节点位置将 2 组节点分为左侧和右侧layout as tree 然后使用visEvents在节点组周围画了一个椭圆 以显示更定义为 2 个单元结构的分离 我
  • 如何向我的应用程序实时获取路线详细信息

    我正在为我的年终项目做一个 arduino 项目 我正在为自行车骑手制作一款智能手套 它可以通知电话 健康跟踪 地理跟踪和导航 我想知道是否有任何方法可以获取有关逐向导航到我的应用程序的详细信息 即 如果谷歌导航说 左转 则获取该详细信息并
  • 使用 Android Beam(或 S-Beam)发送大文件

    我的任务是为一个应用程序添加支持 以便通过 Android 上的 NFC 在设备之间传输大型数据文件 数十兆字节 我知道 Android 上的真正 NFC 速度非常慢 但我知道 ICS 支持将批量数据传输移交给蓝牙 三星拥有一种专有机制 可
  • java.lang.IllegalArgumentException:已添加:Lcom/google/android/gms/iid/MessengerCompat

    So I ve searched a lot on the internet already on what the error is causing me and they are all saying that a library ha
  • 在 64 位操作系统上的 32 位应用程序池中运行我的网站

    这是我的设置 开发 Windows Server 2008 64 位 视觉工作室 2008 具有 3 个类库 1 个 Web 应用程序的解决方案 暂存网络服务器 Windows Server 2008 R2 64 位 IIS7 5集成应用程
  • 如何检查输入字符串是否包含大写和小写组合?

    我想知道如何检查输入字符串是否包含大写和小写组合 之后打印一条语句以显示输入字符串包含大写和小写的组合 第0步 你需要的变量 char str int i char found lower found upper 第一步 遍历字符串 for
  • 如何使用 ASP.NET Identity 2.0 允许用户模拟另一个用户?

    我正在将 ASP NET MVC 5 1 应用程序从 MembershipProvider 迁移到 ASP NET Identity v2 0 该应用程序的功能之一是用户模拟 管理员可以像在网站上注册的任何其他用户一样登录 而无需知道密码
  • 如何在 Swing 应用程序中使用退出按钮?

    我是使用 Swing 进行 Java 表单应用程序开发的新手 用于退出应用程序的退出按钮的合适代码是什么 例如 在 C NET Framework 中我们使用Application Exit 作为退出按钮的代码 Java 中退出应用程序的等
  • 为什么对于回溯,有时我们需要在递归后显式弹出,有时则不需要?

    例如 让我们考虑一个任务 我们需要找到给定字符串的所有排列 保留字符序列但改变大小写 这是没有回溯的解决方案 pop def letterCasePermutation S type S str rtype List str def bac
  • 如果所有标签都等于值,XSLT 返回布尔值

    我有一个xml
  • PHP - uniqid("",true) 与 uniqid("")+mt_rand()

    这两种生成连续但有些唯一的数字的方法之间的主要区别是什么 我想使用这样的数字作为 MySQL 数据库内的唯一用户 ID 也作为盐来加盐密码 我的理解是 出于聚类和索引的原因 这些 ID 应该是连续的 我意识到在某些情况下 随机字符串将使同一
  • VS2013“v120_xp”默认为平台工具集

    为了在Windows XP下部署使用VS2013编译器构建的C 应用程序 必须设置 v120 xp 平台工具集 这使得从XP到8 1的部署成为可能 那么接下来的问题是 为什么这个平台工具集不是唯一的 默认的 v120 平台工具集适用于从 W
  • HTML 画布在调整大小后更新次数过多

    我有一个画布 可以在其中制作动画 我监听窗口调整大小事件 更新画布大小并再次开始递归绘图 但旧的 draw 调用似乎仍在继续 这导致动画比预期的速度更快 这是代码 HTML
Powered by Hwhale