You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不降低Canvas全局帧率前提下减慢JavaScript单个Sprite动画速度

解决方案

核心思路是给单个精灵实例单独维护帧计数逻辑,不修改全局requestAnimationFrame的运行速率,既可以独立控制单个精灵的动画速度,也不会影响画布内其他元素的流畅度。

具体修改步骤

  1. 给Atom类新增帧计数、帧间隔两个属性,帧间隔数值越大,精灵动画速度越慢:
class Atom {
  constructor(options){
    this.width= 320;
    this.height= 320;
    this.frameX= 0;
    this.frameY= 0;
    this.pos= options.pos;
    this.game= options.game;
    this.img= new Image();
    this.img.src = "sprite.png"
    // 新增动画控制属性
    this.frameCount = 0;
    // 可根据自己需要调整数值,也可以做成从options传入,实现不同精灵用不同动画速度
    this.frameInterval = 3; 
    this.img.onload = () => this.draw()
  }
  1. 修改draw方法的帧切换逻辑,只有计数达到间隔阈值时才切换精灵帧:
draw(ctx){
    drawSprite(this.img, this.width * this.frameX, this.height * this.frameY, this.width, this.height,this.pos[0], this.pos[1], this.width, this.height);
    // 先累加计数
    this.frameCount++;
    // 达到阈值才切换帧
    if (this.frameCount >= this.frameInterval) {
      this.frameCount = 0;
      if (this.frameX < 20 ) {
        this.frameX++;
      } else {
        this.frameX= 0;
      }
    }
  }
}

原方案失效原因

你之前用setInterval不生效是因为setInterval的回调执行时机和requestAnimationFrame的渲染时机不同步,且原来的代码每次全局渲染都会直接执行帧切换逻辑,相当于不管定时器怎么改,每帧都会切一次精灵图,所以速度不会变慢。

内容的提问来源于stack exchange,提问作者mrwuscience

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:27:03