为什么这个程序 运行 在 processing.exe 中这么慢?

Why does this program run so slow in processing.exe?

为什么这个程序 运行 在 processing.exe 中这么慢?

在 3GHz Windows 7 机器上使用 Intel 图形,下面的程序在 processing.exe 中仅显示大约 1fps,但在 Chrome 中的画板 http://studio.sketchpad.cc/sp/pad/view/5nIdnL3RQ8/rev.0 中是全速.

int amount = 30;
int[] x = new int[amount];
int[] y = new int[amount];
int[] z = new int[amount];

void setup() {
  size(500, 400, P3D);
  background(0);
  noFill();
  stroke(255);
  strokeWeight(1);
  for(int i = 0; i<amount; i++) {
    x[i] = int(random(-150, 150));
    y[i] = int(random(-150, 150));
    z[i] = int(random(-150, 150));
  }
}
void draw() {
  background(0);

  translate(width/2, height/2);

  rotateY(sin(frameCount/100)*1);

  for(int i = 0; i<amount; i++) {
    point(x[i], y[i], z[i]);
  }
}

您的程序 运行 为 60 fps。您可以在致电 background():

后立即添加以确认这一点
text(frameRate, 25, 25);

这将向您显示每帧的当前帧速率,并且您会看到它在不断更新。

你的问题是这一行:

rotateY(sin(frameCount/100)*1);

请注意,frameCount100 都是 int 值。它们没有小数位,任何涉及它们的操作都会去掉小数位。所以:

0/100 = 0
25/100 = 0
99/100 = 0
100/100 = 1
125/100 = 1

所以,发生的事情是 frameCount/100 的值仅每 100 帧发生变化。因此,您从 sin() 函数返回的值只会每 100 帧发生变化。这就是为什么您看起来只能获得 1 fps 的原因。

您可以通过在该行之前添加一个小打印语句来确认这一点:

println("frameCount/100=" + (frameCount/100));
println("sin: " + sin(frameCount/100));

解决方案是改用 float 值。这些值确实有小数部分,任何涉及它们的操作也有小数部分。为此,只需在 100 中添加一个小数部分,使其成为 100.0。处理将知道您希望它是一个 float 值,现在您的结果也将是 floats

0/100.0 = 0.0
25/100.0 = 0.25
99/100.0 = 0.99
100/100.0 = 1.0
125/100.0 = 1.25

所以您只需要将该行更改为:

rotateY(sin(frameCount/100.0));