Javascript 加速设定间隔

Javascript 加速设定间隔,javascript,Javascript,我知道javascript中的setInterval方法至少有1毫秒。我能再加快一点吗?比如使用微秒 对于我所需要的: 我制作了一个画布css/js动画。这是一条简单的线,弯成一条曲线,再弯成一条线。我有一个滑块来调整这个动画的速度。所以最低的滑块值会非常快,最高的滑块值会非常慢。这可以理解吗?谢谢 请注意,有些浏览器甚至不接受小于50毫秒的间隔。如果你通过一个较小的间隔,他们将使用他们能够使用的最小间隔。我不确定它是否有效,但尝试潜水一毫秒以进一步分解它。e、 g setTimeout(“mo

我知道javascript中的setInterval方法至少有1毫秒。我能再加快一点吗?比如使用微秒

对于我所需要的:


我制作了一个画布css/js动画。这是一条简单的线,弯成一条曲线,再弯成一条线。我有一个滑块来调整这个动画的速度。所以最低的滑块值会非常快,最高的滑块值会非常慢。这可以理解吗?谢谢

请注意,有些浏览器甚至不接受小于50毫秒的间隔。如果你通过一个较小的间隔,他们将使用他们能够使用的最小间隔。

我不确定它是否有效,但尝试潜水一毫秒以进一步分解它。e、 g


setTimeout(“moretext()”,1/100)

最短时间因浏览器而异。这里有一个很好的解释:

更新: 请注意,在撰写此答案时,问题是:

我知道中的setInterval方法至少有1毫秒 javascript。我能再加快一点吗?比如使用微秒

后来对其进行了编辑,以包含有关画布动画的信息,根据这些新信息,正确答案将使用以下方法:

步骤
回调每次被调用时都会得到一个精度为1微秒的时间戳作为参数,每次屏幕刷新时都会得到一次时间戳(无需更频繁地绘制任何内容,因为它无论如何都不会显示)

最初的问题是关于加速方法的,而我最初的回答是关于一般情况下做任何事情的频率比
setInterval
允许(根据、节,大于5的嵌套级别为4ms,根据和历史,大于4的嵌套级别为4ms)

原始答复: 我真的不知道你想做什么,所以我只能从人们通常想用它做什么的经验中说出来

如果要使用微秒调用setInterval,则要运行的代码所需时间必须大大少于一毫秒,否则在单线程事件循环中就没有意义

您不必担心浏览器会被阻塞几秒钟,因此我建议您使用类似的方式,而不是:

setInterval(function () {
    // YOUR CODE
}, 1/100);
试着做:

setInterval(function () {
    for (var i = 0; i < 1000; i++) {
        // YOUR CODE
    }
}, 10);
请注意,它甚至在同一浏览器上都不一致。例如,这取决于您的系统负载

测试你的浏览器
试着测试你的浏览器,如果你愿意的话,在评论中发布你的结果。我想知道会有什么记录。

仅供参考,在每个间隔之间少于几毫秒的时间做这件事是没有用的,因为画布操作需要几毫秒来完成自己的事情,同时阻塞主循环(单线程)。在经典浏览器中,1/100毫秒实际上会被四舍五入到16毫秒,在chrome浏览器中是5毫秒

如果您试图将javascript中的动画计时到微秒,那么您就错了,因为这是一个徒劳的目标。垃圾收集,繁忙的循环时间变化会伤害你,更不用说如果你画得太快,你可能会得到帧撕裂

解决方案:使用requestAnimationFrame获得浏览器的最大FPS,并且不要忘记提供setInterval(…,16)的回退


http://dev.chromium.org/developers/design-documents/requestanimationframe-implementation我知道这是一个老问题,但仍然没有公认的答案

你不需要有一个较短的间隔来增加你的线弯曲的速度。保持间隔不变,这是帧速率,只需更改线条状态之间的步进。如果快速弯曲,则框架之间的弯曲程度更大

下面是我一直在玩的东西的一个例子

var radius = 0;
var hor = 0;
var frameTime = 1000/60;
var step = 1;

setInterval(function () {
    var draw = document.getElementById('draw');
    var context = draw.getContext('2d');

    draw.width = draw.width;

    context.fillStyle = '#ffffff';
    context.beginPath();
    context.arc(draw.width/2,draw.height/2,radius,0,Math.PI*2,true);
    context.closePath();
    context.stroke();
    context.fill();

    radius = (radius+(step*frameTime))%(draw.height/2);
}, frameTime);
这是一个非常简单的动画,只是一个圆圈,它增长到画布的大小,然后从零开始。在这里,变量“step”控制动画的速率“帧时间”是帧之间的时间


我希望我已经正确地理解了问题所在。我知道您可能很久以前就克服了这一问题,但我认为最好在这里为将来有类似问题的任何人提供一个答案。

为什么不删除setInterval并使其成为Instant呢?回调的执行不能保证在准确的时间过去后进行,我相信你说得再精确不过了。你能不能在文章中提供更多你想做的事情的背景信息,并附上一些代码示例?我对您的用例感兴趣。谢谢。请参阅不要将字符串传递给
setTimeout
。是的。。。不完全确定我在想什么。我会把这归结为一个输入错误:-)不确定“跳水一毫秒”是什么,但不,你不能每秒运行JS代码100000次(这是一毫秒的1/100)。可以在for循环中调用函数吗?
平均间隔是4.003毫秒Mozilla/5.0(Macintosh;Intel Mac OS X 10_11_5)AppleWebKit/537.36(KHTML,像Gecko)Chrome/58.0.3029.110 Safari/537.36
平均间隔为4.057毫秒Mozilla/5.0(X11;Linux x86_64)AppleWebKit/537.36(KHTML,像Gecko)Chrome/66.0.3359.139 Safari/537.36
我想你的意思是1000/100(不是1/100),因为这个值是毫秒。
var start = new Date();
var i = 0, interval = setInterval(function(){
    if (++i >= 1000) {
        var end = new Date();
        alert("The average interval was "
              + ((end-start)/1000)) + " milliseconds";
        clearInterval(interval);
    }
}, 0);
var radius = 0;
var hor = 0;
var frameTime = 1000/60;
var step = 1;

setInterval(function () {
    var draw = document.getElementById('draw');
    var context = draw.getContext('2d');

    draw.width = draw.width;

    context.fillStyle = '#ffffff';
    context.beginPath();
    context.arc(draw.width/2,draw.height/2,radius,0,Math.PI*2,true);
    context.closePath();
    context.stroke();
    context.fill();

    radius = (radius+(step*frameTime))%(draw.height/2);
}, frameTime);