Ik ben bezig met het maken van een emulator voor verschillende retro consoles/arcades door middel van een plugin based systeem. Om er voor te zorgen dat de framerate (50 FPS, 60 FPS of wat de plugin wil) constant is, synchroniseer ik met de directsound buffer (gebruik makend van read/write cursors). Dit blijkt in de praktijk zeer goed te werken en dezelfde code heeft in andere hobby projecten nog nooit problemen opgeleverd. Het enige nadeel van deze methode is dat de CPU op 100% belasting gaat om voor de synchronisatie te zorgen. Dit is natuurlijk niet echt gewenst in een multi-tasking OS (Vista in dit geval).
Daarom heb ik besloten om een andere manier van timing te gebruiken die niet de volle 100% van de CPU nodig heeft. Namelijk d.m.v de QueryPerformance counters bereken ik hoeveel tijd mijn code nodig heeft om een volledig frame te emuleren en te renderen (geluid en beeld). Ik weet hoeveel tijd mijn code maximaal mag gebruiken (1000 / TargetFPS millisec.) dus weet ik ook hoeveel tijd ik kan slapen (Sleep()) voordat ik aan het nieuwe frame begin. Dit blijkt erg goed te werken, al verwacht ik wel wat problemen met Sleep() omdat de resolutie hiervan niet echt goed is.
Het probleem waar ik nu tegen aanloop is dat zodra ik v-sync inschakel de framerate zakt. Dit omdat de Sleep() ervoor zorgt dat ik de v-sync mis en dus moet wachten tot de nieuwe v-sync.
Hoe kan ik dit probleem oplossen ? Heeft iemand ooit zelf ook tegen dit probleem aangelopen ? Zijn er eventueel andere manier om te zorgen voor een vaste framerate ?
Daarom heb ik besloten om een andere manier van timing te gebruiken die niet de volle 100% van de CPU nodig heeft. Namelijk d.m.v de QueryPerformance counters bereken ik hoeveel tijd mijn code nodig heeft om een volledig frame te emuleren en te renderen (geluid en beeld). Ik weet hoeveel tijd mijn code maximaal mag gebruiken (1000 / TargetFPS millisec.) dus weet ik ook hoeveel tijd ik kan slapen (Sleep()) voordat ik aan het nieuwe frame begin. Dit blijkt erg goed te werken, al verwacht ik wel wat problemen met Sleep() omdat de resolutie hiervan niet echt goed is.
Het probleem waar ik nu tegen aanloop is dat zodra ik v-sync inschakel de framerate zakt. Dit omdat de Sleep() ervoor zorgt dat ik de v-sync mis en dus moet wachten tot de nieuwe v-sync.
Hoe kan ik dit probleem oplossen ? Heeft iemand ooit zelf ook tegen dit probleem aangelopen ? Zijn er eventueel andere manier om te zorgen voor een vaste framerate ?