Ik heb in mijn vers ontwikkelde framework de scherm refresh middels een windows timer...
Op deze manier dus:
De WM_TIMER wordt zo afgevangen in mijn windows procedure:
Dit betekent 90 refreshes per seconde. (maximaal natuurlijk) Want 1000 / 11 = 90(komma nog wat)
Nu vroeg ik me af of dit een goede architectuur was. Vaak zie je dat een GL rendering rechtstreeks in de messageloop wordt gekwakt,
[nu volgt een stukje onzin ben ik inmiddels achter]
terwijl ik op mijn manier dus tijdens het renderen alweer andere messages ga afhandelen. (behalve de WM_TIMER messages, want zolang er daarvan 1 in de windows procedure zit, gaat windows niet een nieuwe WM_TIMER afhandelen)
[einde onzin]
Nu denk je misschien: wat dan als je meer WM_TIMER messages genereert dan je message rij lang is? Nou, leuke is dat er in je message rij maximaal 1 WM_TIMER gezet wordt door windows.
Het is wel grappig, als ik in plaats van iedere 11 miliseconden iedere 10 miliseconden een WM_TIMER genereer, dan schiet mijn prosessor gebruik onevenredig de lucht in. Waarschijnlijk zit op dit moment tussen 10 en 11 millis. De scheiding dat hij wel of niet al een WM_TIMER in de rij heeft.
Nogmaals, mijn vraag aan jullie, is dit een goede opzet of mis ik even iets?
edit:
Ik kan het ook zo doen:
Let op de laatste NULL is nu dus vervangen door mijn update functie.. tevens kan ik nu de WM_TIMER uit mijn winproc slopen. De default windows procedure regelt het namelijk nu voor me.
Ik ga het nog een keer in een thread doen, mits dat nuttig blijkt. Ik weet niet hoe de overhead zich verhoudt tot de performance. Als je je rendering namelijk als een thread gaat doen, dan moet je je engine opzetten als een statemachine die constant op nieuw gerenderd wordt. Nu denk je what the fuck? Een beetje programmeur weet dat je je display kan bufferen, enne buffer om weer te geven, het andere om op te tekenen. Ben je klaar met tekenen, hup buffer switch.
Dit kan dus ook met je openGL engine... Twee instanties. Eentje die gerenderd wordt, de ander waarin je alle states update. Klaar met updaten, switchen die hap. Verhaal van voren af aan.
States zijn zaken als: lokatie, rotatie etc van objecten, health statusen. Licht posities... kortom alles wat een variabele waarde heeft.
Op deze manier dus:
code:
1
| SetTimer(hWnd, 1, 11, NULL); |
De WM_TIMER wordt zo afgevangen in mijn windows procedure:
code:
1
2
3
4
5
| case WM_TIMER:
{
engine->SceneUpdate(timer->GetElapsedSeconds(1));
return 0;
} |
Dit betekent 90 refreshes per seconde. (maximaal natuurlijk) Want 1000 / 11 = 90(komma nog wat)
Nu vroeg ik me af of dit een goede architectuur was. Vaak zie je dat een GL rendering rechtstreeks in de messageloop wordt gekwakt,
[nu volgt een stukje onzin ben ik inmiddels achter]
terwijl ik op mijn manier dus tijdens het renderen alweer andere messages ga afhandelen. (behalve de WM_TIMER messages, want zolang er daarvan 1 in de windows procedure zit, gaat windows niet een nieuwe WM_TIMER afhandelen)
[einde onzin]
Nu denk je misschien: wat dan als je meer WM_TIMER messages genereert dan je message rij lang is? Nou, leuke is dat er in je message rij maximaal 1 WM_TIMER gezet wordt door windows.
Het is wel grappig, als ik in plaats van iedere 11 miliseconden iedere 10 miliseconden een WM_TIMER genereer, dan schiet mijn prosessor gebruik onevenredig de lucht in. Waarschijnlijk zit op dit moment tussen 10 en 11 millis. De scheiding dat hij wel of niet al een WM_TIMER in de rij heeft.
Nogmaals, mijn vraag aan jullie, is dit een goede opzet of mis ik even iets?
edit:
Ik kan het ook zo doen:
code:
1
| SetTimer(hWnd, 1, 11, engine->SceneUpdate); |
Let op de laatste NULL is nu dus vervangen door mijn update functie.. tevens kan ik nu de WM_TIMER uit mijn winproc slopen. De default windows procedure regelt het namelijk nu voor me.
Ik ga het nog een keer in een thread doen, mits dat nuttig blijkt. Ik weet niet hoe de overhead zich verhoudt tot de performance. Als je je rendering namelijk als een thread gaat doen, dan moet je je engine opzetten als een statemachine die constant op nieuw gerenderd wordt. Nu denk je what the fuck? Een beetje programmeur weet dat je je display kan bufferen, enne buffer om weer te geven, het andere om op te tekenen. Ben je klaar met tekenen, hup buffer switch.
Dit kan dus ook met je openGL engine... Twee instanties. Eentje die gerenderd wordt, de ander waarin je alle states update. Klaar met updaten, switchen die hap. Verhaal van voren af aan.
States zijn zaken als: lokatie, rotatie etc van objecten, health statusen. Licht posities... kortom alles wat een variabele waarde heeft.