You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

P5JS中frameRate()函数返回值不准确问题求助

解决P5.js帧率显示与设置上限不符的问题

问题原因

你遇到的情况是因为frameRate()函数的返回值是最近几帧的平均实际渲染帧率,而非你设置的上限值。当画布内容简单时,浏览器渲染速度可能快于设置的帧率上限,P5.js会自动插入延迟来控制最大帧率,但短时间内的帧率采样计算可能出现波动,导致显示数值高于设置的120。

解决方案

1. 直接显示目标帧率(若仅需展示设置值)

如果只是需要展示你设定的帧率上限,直接使用定义的变量即可,无需调用frameRate()获取返回值:

var targetFps = 120;

function setup() {
  createCanvas(1920, 1080);
  frameRate(targetFps);
}

function draw() {
  clear();
  textSize(13);
  text(`目标帧率: ${targetFps}`, 20, 20);
}

2. 计算稳定的实际帧率

通过跟踪多帧的时间间隔并取平均值,得到更准确的实际帧率,避免单帧波动影响显示:

var targetFps = 120;
var frameTimestamps = [];
var sampleCount = 30; // 用最近30帧的平均来稳定数值

function setup() {
  createCanvas(1920, 1080);
  frameRate(targetFps);
}

function draw() {
  clear();
  textSize(13);
  
  var currentTime = millis();
  frameTimestamps.push(currentTime);
  
  // 只保留最近sampleCount个时间戳
  if (frameTimestamps.length > sampleCount) {
    frameTimestamps.shift();
  }
  
  if (frameTimestamps.length > 1) {
    // 计算平均帧间隔
    var totalDuration = frameTimestamps[frameTimestamps.length - 1] - frameTimestamps[0];
    var avgDuration = totalDuration / (frameTimestamps.length - 1);
    var actualFps = 1000 / avgDuration;
    
    // 格式化显示帧率
    text(`目标帧率: ${targetFps}, 实际帧率: ${nf(actualFps, 1, 1)}`, 20, 20);
  } else {
    text(`目标帧率: ${targetFps}, 实际帧率: 计算中...`, 20, 20);
  }
}

3. 确认帧率控制生效

P5.js的frameRate(limit)是通过在draw循环结束后插入延迟实现的,即便显示的采样帧率略有波动,实际渲染的最大帧率已经被限制在120。使用多帧平均的计算方式可以更准确反映真实的稳定帧率。

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

火山引擎 最新活动