【问题标题】:Why is simple Processing code crashing the browser?为什么简单的处理代码会使浏览器崩溃?
【发布时间】:2021-06-28 13:29:57
【问题描述】:

在 p5.js 中,我编写了这个简单的线性循环,在屏幕上的随机点之间绘制线条。

如果我循环 99 999 次,屏幕会立即显示。

999 999 次,需要十秒

9 999 999 它会挂起浏览器。

为什么对于具有基本操作的线性循环会发生这种情况?处理生命周期有什么我不理解的吗?就像画布何时更新(每行或分批或什么)?我需要将我的代码放在异步循环中吗?

function setup() 
{
    createCanvas(1920, 965, P2D);
    colorMode(HSL, 100); // hue saturation lightness
    noLoop();
    background(100,100,100,255); //solid white background           
    for (let i = 0; i < 9999999; i++)
        drawLines()
}

function drawLines() 
{
    stroke(60, random(60,100), random(0,100), 255);
    const p1 = getRandomPoint();
    const p2 = getRandomPoint();
    line(p1.x, p1.y, p2.x, p2.y);
}

function getRandomPoint()
{
    return { x: random(0, width), y: random(0, height) };
}

【问题讨论】:

  • 您可能只是在绑定事件线程,这会使浏览器无响应。我不写 JS,但阻止 setup 可能不是一个好主意。通常,您希望避免阻塞,并应尽可能依赖异步代码。

标签: javascript processing p5.js


【解决方案1】:

9999999 一次只是多行。分割画线:

function setup() 
{
    createCanvas(1920, 965, P2D);
    colorMode(HSL, 100); // hue saturation lightness
    background(100,100,100,255); //solid white background       
}
 
function draw()
{  
    for (let i = 0; i < 1000; i++)
        drawLines()
    if (frameCount >= 9999)
        noLoop();     
}

function drawLines() 
{
    stroke(60, random(60,100), random(0,100), 255);
    const p1 = getRandomPoint();
    const p2 = getRandomPoint();
    line(p1.x, p1.y, p2.x, p2.y);
}

function getRandomPoint()
{
    return { x: random(0, width), y: random(0, height) };
}
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.3.1/p5.min.js"&gt;&lt;/script&gt;

【讨论】:

  • 谢谢,我自己也是这样做的,但我还是想知道如何 setup() 绘制。为什么会崩溃?是它持有的缓冲区变得太大,还是画布无法处理如此大小的单个更新,发生了什么......
  • @Richard 它真的崩溃了还是只是没有终止?无论如何,我认为您的问题只能由了解 p5.js 内部的人来回答。
  • 使用 Firefox 的分析器,我确认绝大多数 CPU 时间都花在了 p5.js Renderer2D.line 函数上,除了在内置 CanvasRenderingContext2D。所以我认为 p5.js 并没有什么特别的东西可以影响这种行为,这只是一个自然的效果,如果你将工作量增加一个数量级,它会增加一个数量级的时间量。并且浏览器可能会将一个以 100% CPU 旋转超过 100 秒的函数解释为崩溃。
猜你喜欢
  • 2014-09-27
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
相关资源
最近更新 更多