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

时间:2016-03-25 01:38:05

标签: windows-7 processing

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

在具有Intel图形的3GHz Windows 7计算机上,下面的程序在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]);
  }
}

1 个答案:

答案 0 :(得分:2)

您的程序以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。

您可以通过在该行之前添加一点print语句来确认:

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));