Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript游戏循环_Javascript_Html_Canvas_Game Loop - Fatal编程技术网

Javascript游戏循环

Javascript游戏循环,javascript,html,canvas,game-loop,Javascript,Html,Canvas,Game Loop,我有一些关于JavaScript循环的问题 问题: 为什么JavaScript循环会冻结浏览器 为什么绘图速度很慢,即使它以每1ms绘制一次的速度运行,而且它绘制的是最简单的东西 解决办法是什么?flash快死了,我们现在该怎么办 以下是您自己尝试的画布代码: <!doctype html> <html> <head> </head> <body> <canvas id="c" width="400" height="

我有一些关于JavaScript循环的问题

问题:

  • 为什么JavaScript循环会冻结浏览器
  • 为什么绘图速度很慢,即使它以每1ms绘制一次的速度运行,而且它绘制的是最简单的东西
  • 解决办法是什么?flash快死了,我们现在该怎么办
以下是您自己尝试的画布代码:

<!doctype html>
<html>
<head>
</head>
<body>
    <canvas id="c" width="400" height="400"></canvas>
    <script type="text/javascript">

        var c = document.getElementById( 'c' );

        ctx = c.getContext( '2d' );

        var x = 100;

        ctx.fillStyle= '#f00';

        function loop()
        {
            ctx.fillRect( x, 100, 20, 20 );

            ++x;
        }

        setInterval( loop, 1 );
    </script>
</body>
</html>

var c=document.getElementById('c');
ctx=c.getContext('2d');
var x=100;
ctx.fillStyle='#f00';
函数循环()
{
ctx.fillRect(x,100,20,20);
++x;
}
设置间隔(循环,1);

一毫秒是非常短的时间间隔。
这段时间间隔如此之短,以至于您的代码将几乎连续地在UI线程中运行,从而使浏览器没有响应

您需要保留暂停,以便用户有时间与页面交互

使用至少十毫秒(最好是一百毫秒)的间隔

为什么JavaScript循环冻结浏览器(在C++中没有发生)


JavaScript是单线程的。当javascript代码运行或出现竞争条件时,DOM的状态不能更改。这意味着无拉伸/回流

为什么绘图速度很慢,即使它以每1ms绘制一次的速度运行,而且它绘制的是最简单的东西

它不是以1ms的速度运行,而是以10ms的速度运行,因为浏览器不允许您严格循环

解决办法是什么?flash快死了,我们现在该怎么办

使用requestAnimationFrame以60 FPS的速度运行游戏,为什么需要更多

这对我来说很顺利。

由于canvas元素占用内存,导致帧率下降并最终导致浏览器冻结。我已经回答了这个问题。你可以找到线

每次在画布上绘制某些内容时,该操作都会保存到画布的路径。每次在画布上绘制某些内容时,此路径会占用更多内存。如果不清空画布的路径,则会降低帧率。例如,查看javascript和下面清除画布路径的javascript之间的执行时间差

var c=document.getElementById('c');
ctx=c.getContext('2d');
var x=100;
ctx.fillStyle='#f00';
函数循环()
{
ctx.beginPath();
ctx.fillRect(x,100,20,20);
++x;
}
设置间隔(循环,1);

你的电脑怎么样?听起来不太像powerful@AustinHenley不过,它将被HTML5取代,因为它是一个更合适的工具,与本文相同,不要使用
setInterval()
将其替换为
window.requestAnimationFrame()
,这根本不是它。setInterval不会使浏览器无响应。@Raynos:间隔中的代码运行时,浏览器无响应。如果没有任何时间代码不运行,浏览器将不会响应。但浏览器有一个最小设置超时以避免出现此问题。这个最小值是10。同样,这不是问题所在。浏览器可以在10分钟内完成大量的回流渲染milliseconds@Raynos:这是标准限制吗?具体在哪里?我没有意识到这一点。Firefox:(webkit/mozilla)的RequestAnimationFrame看起来是4ms,但并没有真正与刷新率同步,它只是一个基于刷新率的时间间隔回调。通过这种计算,以两倍于帧速率的渲染可以提高渲染的平滑度,而如果时间安排得恰到好处的话,渲染的平滑度就不会提高。问题在于,浏览器中的JavaScript从来都不是设计用来执行我们真正希望在浏览器中执行的高性能多线程任务的。这不是JavaScript的缺点,只是将JavaScript用作浏览器中的单线程事件接收器。“JavaScript是单线程的。”不是真正的JavaScript是多线程的