2016-03-25 16 views
0

なぜこのプログラムはprocessing.exeで遅く実行されますか?なぜこのプログラムはprocessing.exeで遅く動作しますか?

インテルグラフィックスを搭載した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]); 
    } 
} 

答えて

3

あなたのプログラムは、60 fpsで実行されています。

text(frameRate, 25, 25); 

はあなたの現在のフレームレートを表示することを、フレーム毎に、そしてあなたはそれが絶えず更新していますことがわかります:あなたは background()にお電話した後、この権利を追加することでこれを確認することができます。

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

注両方frameCount100int値は次のとおりです。

あなたの問題は、このラインです。彼らは小数点以下桁を持っていませんし、それらを含むすべての操作は小数点以下を削除します。だから、:

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

だから、何が起こっていることはframeCount/100の値は唯一、すべての100フレームを変更することです。したがって、sin()関数から返される値は、100フレームごとに変更されます。 1fpsしか得られないように見えます。

あなたはただその行の前に少し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)); 
関連する問題