为什么这个程序在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]);
}
}
答案 0 :(得分:2)
您的程序以60 fps运行。您可以在致电background()
text(frameRate, 25, 25);
这将显示每帧的当前帧速率,您将看到它不断更新。
你的问题就在这一行:
rotateY(sin(frameCount/100)*1);
请注意,frameCount
和100
都是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));