2016-04-01 27 views
0

Simülatörüme uygulamaya çalıştığım bir FPS algoritmasıyla ilgili bir sorun yaşıyorum. Genel fikir, 60 saniyede maksimum kene-render döngüsü miktarı olmasını istiyorum. İşte benim kod: Ben bu takip ederken bu algoritma mükemmel çalışıyordu düşündüm bu programın benim gelişimi boyuncaSistem zamanlaması ile Fps algoritma hatası

double tPerTick = 1000/60 

şöyle

sabit 'tPerTick'
public void run() { 

    x = 0; //tick is set to 0 originally 
    lastT = System.currentTimeMillis(); //system time in milliseconds 

    //tick-render cycle 
    while(running == true){ 

     currentT = System.currentTimeMillis(); 
     deltaT += currentT - lastT; 
     lastT = currentT; 

     if(deltaT/tPerTick >= 1){ 
      tick(); 
      render(); 
      deltaT = 0; 
     } 

    } 

    stop(); //stops thread when running =! true 
} 

tanımlanır, sadece oldu Bir sorun bulduğumu doğrulamak için algoritma. Döngü her çevrildiğinde (yineleyin? Doğru kelimenin ne olduğundan emin değilim) if ifadesinin doğru olduğu ve bu nedenle kene oluşturma döngüsünün yürütüldüğü. Daha fazla izleme yaptım (bunun neden olduğunu bulmak için) ve deltaT değerlerinin her zaman iyi bir şekilde tPerTick üzerinde olduğunu fark ettim, yol gibi (bazı durumlarda 19 saniyelik durumlarda bu durum tam olarak açık olmasa bile). Kodumda bir yerde bir hata var mı? Ben System.currentTimeMillis() yanlış kullanarak ya da yanlış algoritma izleme olduğumu düşünüyorum.

Gerçek simülasyonda iyi çalışıyor gibi görünüyor (neden olmasın). Grafikleri çizdiğimde, 'x' (kene) 'yi geçiyorum ve zamana x/60 saniye olarak ekrana yazdım.

+0

'1000/60 '16.66667 yerine 16 değerini verecektir. Bunun yerine '1000/60.0' deneyin. Bunun yanında System.currentTimeMillis() 'in bazı hassas sorunları vardır, bunun yerine System.nanoTime()' ı deneyin (ofc'yi nano saniye alırsınız, aklınızda bulundurun). – Thomas

+0

@Thomas Yaklaşık 135000 (135 saniye) izimde deltaT değerlerini alıyorum, bence asıl sorun bu. Bahşiş için teşekkürler, bunu da uygularım. İlk başta System.nanoTime() kullanıyordum ve aynı sorunu vardı. – Loua

+0

Hmm, ya kene() 've' render() 'çok uzun zaman alabilir ya da yayınlamadığınız bir şey var. Bunun yanı sıra, zaten 0'a sıfırlamayı sıfırladığınızdan, neden sadece “(eğer currentT - lastT)> = tPerTick) 'i kontrol etmiyorsunuz? {... lastT = currentT; } '? – Thomas

cevap

1

Kendi sorumu yanıtlama.

System.currentTimeMillis(); 

Geçerli sistem saatini alır. Algoritma hata ayıklama modunda el ile devam ediyorsanız, algoritma aracılığıyla el ile izlemeye aldığınız süreye eşit olacağından, 'deltaT' çok büyük olacaktır.

+0

Evet, bir hata ayıklayıcı ile adım atmak bu etkiye sahiptir :) - Bilmeni bildiğim en az iki şey olduğu için benim için zor olurdu, hatayı bulduğumuzu biliyorum: sadece hata ayıklama ve System.currentTimeMillis() 'hakkında bir yanlış anlama yaşadınız. – Thomas

İlgili konular