2014-09-07 42 views
10

Opengl'de yeni bir kod tabanı yazıyordum ve çok erken bir tuhaf hatayla karşılaştım. Bu, tekrarlanan ve tahmin edilebilir olan çerçeve içinde ayrı bir dalgalanmadır.Döngüsel FPS damlalarının olası nedenleri?

İşlenen nesnelerle kesinlikle orantılı olduğunu biliyorum. Bu kabaca 0.2 bir oran da ekran boyutu (görüntü alanı boyutu değil, pencere boyutu, sadece fiziksel cihaz boyutu) orantılıdır: 1 (düşük: yüksek)

çerçeveleri, ayı meraklandırdın ve grafikle Pencerenin/bağlamın birbirine benzemediğini veya kapatılmadığını unutmayın. Object count and screen size comparisons

Görünüm tamamen sabit ve tüm nesneler sabit. Her kare tam olarak aynı. Hiçbir zaman herhangi bir girdi verilmedi. Zaman temelli hiçbir şey yok. Çöp toplama işlemi gerçekleşmez.

Temelde, böyle büyük bir değişikliğe neden olabilecek bir çerçeve üzerinde oluşturulmuş bir çerçeve varsa, anlamıyorum. İşte

bu github için VS2012 projesini yüklenen o zaman hiçbir anlayış verirse programın sahte kod

create window 
load shaders 
grab uniform locations 
create camera 
create 3 meshes // They just hold the buffers and data for a model 
create x objects and pass a pointer to a random mesh // Objects hold position, rotation etc + link to mesh 
while game is running 
    poll window for events 
    capture mouse and recalculate VP matrix if required 
    for each object 
     recalc MVP 
     bind mesh's buffers and draw elements 
    draw window //SFML handles this, just swaps front/back buffers and draws 
clean up data 

akış: bu belirli bir yerde SFML2 gerektirdiğinden https://github.com/Twistedsnail/Untitled_for_SO (muhtemelen yerel olarak çalışmayacak ve VS dosyalarında GLM)

+0

Kodu görebilseydik muhtemelen yardımcı olur. Soruna eklemek uzunsa, yayınlayabileceğiniz ve sorunuza bir bağlantı ekleyebileceğiniz yerler vardır. Ayrıca, eski (sabit boru hattı) veya yeni (programlanabilir boru hattı w. Shader) OpenGL mi? –

+0

GL4.1'i hedefleyen gölgelendiriciler. Bugün daha sonra şansım olduğunda kodu yükleyeceğim. –

+2

Bir zamanlar CUDA ile çok benzer bir sorun yaşadım. Yaklaşık her 200 ms'de çekirdek yürütmeleri arasında 2ms gecikme yaşayacağım (çekirdek yürütmesindeki her döngü aynı olacak).Problemin nedenine hiç kapılmadım, çünkü geliştirme sürecinin bir noktasında yok oldu ve değişim tarihini ikiye katlamaktan rahatsız olamadım. – datenwolf

cevap

2

Son işimde bir oyun motoru inşa ederken, zaman zaman da böyle ilginç sorunlar yaşadık.

nedenleri hatırlıyorum:

  • Lua çöp toplama. Lua, motor için komut dosyası dili olarak kullanıyordu ve GC, görüntülemeyle ilgili bir sorun varmış gibi görünürdü! Açıkça belli olmasa da. Uygulamanızda/makinenizde açgözlü olabilecek diğer konuları ve hatta işlemleri kontrol edin.

  • OpenGL sürücü sorunları: NVIDIA sürücüsündeki "Threaded Optimization" öğesinin devre dışı bırakılması veya etkinleştirilmesi, bazen bu gibi performansa yönelik komik efektlere sahipti. ATI sürücülerinin daha sık bir yükseltme gerektiren hatalar vardı.

  • Windows olay döngüsüyle ilgili sorunlar. PeekMessage yerine GetMessage'ı kullanmak gibi.

Başka bir şey: Gerçekten çok render ve birkaç bin FPS yok: Lütfen FPS üzerinde "dev" etkileri olacaktır oluşturma süresini en ufak bir artış. Yani gördüğünüz "normal" oyun FPS 60 ila 120 gibi ve daha sonra fark edilebilir değilken ile alakasız çok normal işletim sistemi/sürücü görevleri olabilir.

+0

İlginç. Ben giderken sizleri güncel tutacağım. –

+0

Framerate hakkında btw haklısınız Normal işlem olduğunu sanmıyorum: yüksek ve alçak noktalar arasındaki orana bakın, yaklaşık olarak aynı (3.75 ~ 300/80 veya 7500/2000). Eğer sadece küçük bir işlemci alarak küçük bir görev olsaydı, bu etki 300 fps'lik yüksek hızlarda göz ardı edilebilir olmalıdır. – BeyelerStudios

+0

Yeni Güncelleme: Kodumda bir hata vardı, tüm kareler 0'a eşit, yani onun yaklaşık 30'dan 7.5'e ve 800'den 150'ye düşmesi anlamına geliyor. Bu daha anlamlı görünüyor. –

İlgili konular