为什么这个程序 运行 在 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);
请注意,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 的原因。
您可以通过在该行之前添加一个小打印语句来确认这一点:
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));
为什么这个程序 运行 在 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);
请注意,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 的原因。
您可以通过在该行之前添加一个小打印语句来确认这一点:
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));