2016-03-25 23 views
0

Bu program neden işlem.exe dosyasında çok yavaş çalışıyor?Bu program neden işlem.exe'de çok yavaş çalışıyor?

Intel grafik özellikli bir 3GHz Windows 7 makinesinde, aşağıdaki program işlemcideki yaklaşık 1 fps'yi gösterir, ancak Chrome'da http://studio.sketchpad.cc/sp/pad/view/5nIdnL3RQ8/rev.0 eskiz defterinde tam hızdır.

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

cevap

3

Programınız 60 fps'de çalışıyor.

text(frameRate, 25, 25); 

aktüel kare hızını gösterecektir İşte her karesini ve bunu sürekli güncellenmesi olduğunu göreceksiniz: Sen background() için çağrısından sonra bu hakkı ekleyerek bu onaylayabilir.

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

Not hem frameCount ve 100int değerler şunlardır:

Senin sorunun bu çizgidir. Ondalık bir yere sahip değiller ve bunları içeren herhangi bir işlem, ondalık basamak yerini yine de düşürüyor. Yani:

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

Peki oluyor frameCount/100 değeri sadece her 100 çerçeveleri değişmesidir. Yani, sin() işlevinden geri döndüğünüz değer, yalnızca her 100 çerçevesini değiştirir. Bu yüzden sadece 1 fps aldığına benziyor.

Sadece bu hat önce biraz baskı deyimi ekleyerek bu onaylayabilirsiniz:

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

o çözüm yerine float değerini kullanmaktır. Bu değerlerin ondalık kısmı vardır ve bunları içeren herhangi bir işlem de ondalık kısım içerir. Bunu yapmak için 100 numaranıza 100.0 yapmak için ondalık bir parça ekleyin. İşleme Bunun bir float değer olmak istiyorum bilecek ve şimdi sonuçları yanı floats olacaktır:

rotateY(sin(frameCount/100.0)); 
:

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 

Yani sadece bu o çizgiyi değiştirmek gerekir

İlgili konular