我的JS代码:
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
var mouse = {x:0,y:0}
const times = [];
let fps;
function refreshLoop() {
window.requestAnimationFrame(() => {
const now = performance.now();
while (times.length > 0 && times[0] <= now - 1000) {
times.shift();
}
times.push(now);
fps = times.length;
refreshLoop();
});
}
refreshLoop();
function draw() {
ctx.fillStyle = "black"
ctx.fillRect(0, 0, c.width, c.height);
ctx.strokeStyle = "white"
ctx.beginPath();
var e = window.event;
ctx.arc(mouse.x, mouse.y, 40, 0, 2*Math.PI);
ctx.stroke();
ctx.font = "30px Comic Sans MS";
ctx.fillStyle = "red";
ctx.textAlign = "center";
ctx.fillText(fps, c.width/2, c.height/2);
}
setInterval(draw, 0);
document.addEventListener('mousemove', function(event){
mouse = { x: event.clientX, y: event.clientY }
})
我的HTML只是画布声明。
据我的理解,setinterval(x,0)应该尽可能快地运行,但它永远不会超过60fps。我试图达到240 + fps以减少输入延迟。
发布于 2018-06-08 15:39:08
首先,不要使用setInterval(fn, lessThan10)
。很有可能fn
需要超过这段时间才能执行,并且最终可能会堆叠很多fn
无间隔的呼叫,这可能会导致*与众所周知的while(true)
浏览器crasher®相同。
实际上,你正在同时运行两个不同的循环,这些循环不会以相同的时间间隔进行调用。
setInterval(fn, 0)
你的两个循环没有链接,因此,你在第一个测量的是你draw
调用的速度。如果你这样做有点像
setInterval(checkRate, 16.6);
setInterval(thefuncIWantToMeasure, 0);
显然,你的checkRate
测量不会thefuncIWantToMeasure
正确
所以只是为了表明一个setTimeout(fn, 0)
循环将以更高的速率触发:
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
var mouse = {
x: 0,
y: 0
}
const times = [];
let fps;
draw();
function draw() {
const now = performance.now();
while (times.length > 0 && times[0] <= now - 1000) {
times.shift();
}
times.push(now);
fps = times.length;
ctx.fillStyle = "black"
ctx.fillRect(0, 0, c.width, c.height);
ctx.strokeStyle = "white"
ctx.beginPath();
ctx.arc(mouse.x, mouse.y, 40, 0, 2 * Math.PI);
ctx.stroke();
ctx.font = "30px Comic Sans MS";
ctx.fillStyle = "red";
ctx.textAlign = "center";
ctx.fillText(fps, c.width / 2, c.height / 2);
setTimeout(draw, 0);
}
<canvas id="myCanvas"></canvas>
现在,即使嵌套setTimeout
循环好于setInterval
,你正在做的是一个视觉动画。
绘制这个视觉动画比浏览器的绘制速度更快是没有意义的,因为你在这个画布上绘制的内容不会被绘制到屏幕上。
正如前面所说,这正是requestAnimationFrame
循环发射的速度。因此,对所有的视觉动画使用这种方法(至少如果它必须被画到屏幕上,在一些罕见的情况下,如果需要,还有其他方法可以将你链接到注释中)。
现在要解决你的实际问题,不是以更高的速度呈现,而是以这样的速度处理用户的输入,那么解决方案就是拆分代码。
https://stackoverflow.com/questions/-100004807
复制相似问题