2014-09-07 15 views
10

Stavo scrivendo una nuova base di codice in opengl e ho riscontrato un bug strano molto presto. È una fluttuazione distinta nel framerate che è ripetitiva e prevedibile.Possibili cause di cadute FPS cicliche?

So che è decisamente proporzionale agli oggetti renderizzati. È anche proporzionale alle dimensioni dello schermo (formato non finestra, non dimensioni della finestra, appena formato dispositivo fisico) 'grosso modo un rapporto di 0,2: 1 (basso: alto) incornicia

ho ottenuto curioso e graficamente esso, orso tenere presente che la finestra/contesto non è sincronizzato o limitato. Object count and screen size comparisons

La vista è completamente fissa e tutti gli oggetti sono fermi. Ogni frame è esattamente lo stesso. Nessun input è stato dato in qualsiasi momento. Non c'è niente in base al tempo. Non si verifica la garbage collection.

Non riesco a capirlo, se è praticamente un fotogramma che viene sottoposto a rendering più e più volte cosa potrebbe causare un così grande cambiamento?

Ecco il codice pseudo del programma di flusso

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 

Se questo non dà intuizioni poi ho caricato il progetto VS2012 a GitHub: https://github.com/Twistedsnail/Untitled_for_SO (probabilmente non verrà eseguito a livello locale, perché richiede SFML2 in una posizione specificata e GLM nei file di VS)

+0

Probabilmente sarebbe utile se potessimo vedere il codice. Se è troppo lungo includere nella domanda, ci sono dei posti in cui puoi postarlo e aggiungere un link nella tua domanda qui. Inoltre, è vecchio (rete fissa) o nuovo (pipeline programmabile con shader) OpenGL? –

+0

Shader di destinazione GL4.1. Caricherò il codice quando ne avrò una possibilità più tardi oggi. –

+2

Una volta ho avuto un problema molto simile con CUDA. Circa ogni 200 ms proverei un ritardo di 2 ms tra le esecuzioni del kernel (dove ogni ciclo nell'esecuzione del kernel sarebbe identico).Non ho mai avuto la causa del problema, perché a un certo punto del processo di sviluppo è svanito e non potevo essere disturbato a dividere in due la cronologia delle modifiche. – datenwolf

risposta

2

Quando stavamo costruendo un motore di gioco nel mio ultimo lavoro, abbiamo avuto anche occasionalmente problemi curiosi come quello.

Cause mi ricordo:

  • Lua garbage collection. Dove stavano usando Lua come linguaggio di scripting per il motore e il GC avrebbe fatto apparire come se ci fosse un problema con il rendering! Anche se non era ovviamente. Controlla eventuali altri thread o processi che potrebbero diventare avidi nella tua applicazione/macchina.

  • Problemi del driver OpenGL: la disattivazione o l'abilitazione di "Ottimizzazione filettatura" nel driver NVIDIA ha avuto effetti divertenti su prestazioni come questa a volte. I driver ATI più spesso avevano semplicemente bug che richiedevano un aggiornamento.

  • Problemi con il ciclo eventi di Windows. Come usare GetMessage invece di PeekMessage.

Un'altra cosa: Se siete veramente non rendendo molto e ha diverse migliaia di FPS: anche il minimo aumento del tempo di rendering avrà effetti "enormi" sul vostro FPS. Quindi ciò che si sta vedendo potrebbe essere un normale funzionamento del sistema operativo/driver irrilevante quando si lavora con FPS di gioco "normali" come da 60 a 120 e non molto più evidenti in seguito.

+0

Interessante. Vi terrò aggiornati, mentre vado. Hai ragione riguardo al framerate –

+0

Non penso che sia un'operazione normale: guarda il rapporto tra i punti alti e bassi, è approssimativamente lo stesso (3.75 ~ 300/80 o 7500/2000). Se si trattasse di un piccolo compito che richiede solo una piccola CPU, l'effetto dovrebbe essere trascurabile per le alte tirature di 300 fps. – BeyelerStudios

+0

Nuovo aggiornamento: ho avuto un bug nel mio codice, tutti i framerate hanno uno 0 in più, il che significa che è in calo da circa 30 a 7,5 e da 800 a 150. Ciò sembra più significativo. –

Problemi correlati