为了修饰@emackey 所说的话,
简短的回答是你不能。您可以要求计算机在每一帧中做无限量的工作。我不能保证在有限的时间内完成这项工作。
除此之外,每台计算机都有不同的电量。廉价的集成 GPU 的功率远低于高端显卡。 intel i3 比 i7 慢很多。
您还提到了更改画布大小。绘制 300x150 的画布只需要 45000 像素的工作量。绘制 1920x1080 画布需要 2,073,600 像素或 46 倍以上的工作
您能做的最好的事情就是尽可能减少工作量,或者自动或由用户选择删除慢速硬件上的功能。大多数游戏都是这样做的。它们是图形设置选项,用户可以在其中选择分辨率、纹理分辨率、抗锯齿级别和各种其他内容。
也就是说,您可以尝试进行计算,以便应用中的事物以相对于时间一致的速度移动。在较慢的机器或较大的画布上,帧速率可能会变慢,但每秒移动的距离将保持不变。
您可以使用传递给requestAnimationFrame的时间值来完成此操作
function render(time) {
// time is time in milliseconds since the page was loaded
...do work...
requestAnimationFrame(render);
}
requestAnimationFrame(render);
例如这里是NON帧率独立动画
function render(time) {
xPosition = xPosition + velocity;
...
requestAnimationFrame(render);
}
requestAnimationFrame(render);
这是与帧率无关的动画
var then = 0;
function render(time) {
var timeInSeconds = time * 0.001;
var deltaTimeInSeconds = timeInSeconds - then;
then = timeInSeconds;
xPosition = xPosition + velocityInUnitsPerSecond * deltaTimeInSeconds;
...
requestAnimationFrame(render);
}
requestAnimationFrame(render);
注意:传入 requestAnimationFrame 的时间比Date.now()的分辨率高
Here's an article on it with animations