在draw()中调用draw()提高速度

Calling draw() in draw() to increase speed

我想知道在 draw() 中调用 draw() 是否正确,因为我使用 p5.js 在 JavaScript 中创建了一个 10 PRINT 克隆,灵感来自于此:Daniel Shiffman's Coding Challenge: 10 PRINT

我尝试以 80% 的概率从 draw() 调用 draw() 以提高速度并且成功了。这是我的实现:

var x = 0, y = 0;
var space = 10;

function setup() {
  createCanvas(window.innerWidth, window.innerHeight);
  background(0);
}

function draw() {
  stroke(255);
  strokeWeight(2);

  if(random() < 0.8) {
    draw();
  }

  if(random() > 0.5) {
    stroke('#F26C4D');
    line(x, y, x + space, y + space);
  }
  else {
    stroke(255);
    line(x, y + space, x + space, y);
  }

  x += space;

  if(x >= width) {
    x = 0;
    y += space;
  }
}

但我不知道这样做是否安全,所以如果有人可以建议一种方法来提高它的速度,如果这个方法不安全,那就太好了?

您正在做的事情叫做 recursion。这将适用于这个简单的草图,但你会遇到几个问题:

  • 帧率不统一。如果您开始制作动画,您会注意到这一点。
  • 有点难理解,在更高级的草图中会变得更加困难。
  • 如果你调整了概率,你可能会遇到堆栈溢出(错误,不是这个网站)。

一个更简单的解决方案是使用 frameRate() 函数简单地设置帧率。

此代码会导致 draw() 函数每秒被调用 80 次而不是 60 次:

function setup(){
  createCanvas(500, 500);
  frameRate(80);
}

可以在 the reference 中找到更多信息。

或者,如果您想使用您的方法,您可能会考虑摆脱递归并将绘图代码提取到一个单独的函数中,然后从 draw():

中调用
function draw(){
  myDrawFunction();
  if(random() < .8){
    myDrawFunction();
  }
}

然后您可以执行类似循环随机次数的操作。但老实说,您最好的选择可能是只设置帧率并让 P5.js 为您完成。