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

PixiJS动画循环可控性疑问:ticker与requestAnimationFrame、GSAP对比

PixiJS线条动画帧率控制问题与方案对比

三种动画渲染方案

  • 手动requestAnimationFrame控制:帧率控制效果良好,但可能缺少Pixi.TICKER的FPS控制、delta时间计算等特性(该表述存疑)
  • Pixi.TICKER方案:本应通过更少代码实现帧率控制,但设置ticker.maxFPS = 1时无法有效降速,实际帧率远高于设定值
  • GSAP方案:表现与手动方法接近,帧率控制精准

核心疑问

  1. 为何Pixi.TICKER的ticker.add()效果不如手动requestAnimationFrame或GSAP?设置maxFPS=1时无法有效降速的原因是什么?
  2. 使用PixiJS进行2D渲染时,三种方法中哪种是更推荐的方案?

问题解答

1. Pixi.TICKER maxFPS失效的原因

PixiJS的Ticker类maxFPS并非直接限制回调执行帧率,而是限制Ticker自身的更新频率,你的代码存在两个关键问题:

  • 回调中手动调用renderer.ticker.update(),但每个Renderer自带的Ticker默认与shared Ticker联动,重复调用会触发额外更新,打破maxFPS的限制
  • Pixi Ticker依赖浏览器requestAnimationFrame(通常60FPS)调度,maxFPS通过跳过部分帧模拟低帧率,但设置为1FPS时,浏览器定时器精度限制、回调内的重复更新操作,会导致实际执行频率高于设定值。另外minFPS=0无意义,该参数是帧率过低时的兜底机制,设为0等于关闭该功能。

2. 推荐方案选择

  • 优先推荐修正后的Pixi.TICKER:作为PixiJS原生动画调度工具,它与渲染管线深度整合,支持delta时间计算(用于帧率无关动画),自带暂停/恢复、帧率统计等特性。只要正确使用(无需手动调用renderer.ticker.update,直接在回调中执行业务逻辑并调用renderer.render),就能实现稳定帧率控制。
  • GSAP方案:适合复杂动画场景(多元素时序控制、缓动效果),帧率控制逻辑更精准,与PixiJS兼容性良好,但会增加项目体积。
  • 手动requestAnimationFrame:仅适合需要完全自定义帧率逻辑的场景,需自行处理delta时间、帧跳过、暂停恢复等逻辑,代码冗余度高,非特殊需求不推荐。

三种方案代码示例

手动requestAnimationFrame实现

let maxFPS = 5; // 设置目标最大帧率
let frameDuration = 1000 / maxFPS; // 计算每帧的毫秒数

let lastFrameTime = 0;

function animate(timestamp) {
  let elapsed = timestamp - lastFrameTime;

  if (elapsed >= frameDuration) {
    // 渲染帧
    renderer.render(stage);
    var y = Math.random() * h;
    draw(dx, y, PIXI.LINE_CAP.ROUND);

    lastFrameTime = timestamp;
  }

  requestAnimationFrame(animate);
}

// 启动动画循环
requestAnimationFrame(animate);

Pixi.TICKER实现(修正后)

let ticker = PIXI.Ticker.shared;
ticker.autoStart = false;
ticker.maxFPS = 1;

ticker.add(function (delta) {
    graphen.clear();
    graphen2.clear();
    graphen3.clear();
    var y = Math.random() * (h);
    draw(dx, y, PIXI.LINE_CAP.ROUND);
    // 统一执行渲染
    renderer.render(stage);
    renderer2.render(stage2);
    renderer3.render(stage3);
})

// 启动ticker
ticker.start();

GSAP实现

gsap.ticker.fps(5);
gsap.ticker.add(() => {
    graphen.clear();
    graphen2.clear();
    graphen3.clear();
    var y = Math.random() * (h);
    draw(dx, y, PIXI.LINE_CAP.ROUND);
    renderer.render(stage);
    renderer2.render(stage2);
    renderer3.render(stage3);
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:14:50