DirectX, Present, BeginScene, EndScene..
Hej,
Jag sitter och skriver lite på en allmän FPS-limiter. Har kört fast och vänder mig till er, i hopp om att få något tips eller så. Mitt mål är alltså att kunna låsa FPSen i DirectX 9-spel utan vsync. Mest för att det är lärorikt och kul, men även för att det kan vara användbart i vissa spel. Jag har inte pysslat speciellt mycket med DirectX innan och kan bara precis grunderna. Mitt första steg är att mäta nuvarande FPS. För att försöka göra det använder jag Microsoft Detours för att "detoura" Direct3DCreate9. När man kommit så långt kan man göra lite vad man vill, just nu har jag tillfälligt "wrappat" (finns inga svenska ord?) Direct3D devicet så jag har en klass som fungerar ungefär som en proxy. Ineffektivt och dåligt, men det funkar och det ger mig möjlighet att testa mycket olika saker utan att behöva skriva speciellt mycket kod vilket är bra i början. Så fort jag kommit på hur jag ska göra så kan man ju enkelt ändra på det.
När jag hade kommit så långt så var min första tanke att jag i IDirect3DDevice9::EndScene (eller BeginScene) kan mäta tiden mellan frames och på så vis få ut nuvarande FPS. Men det visade sig att många DirectX-applikationer kallar BeginScene och EndScene flera gånger per frame, och så långt jag förstår är det ju omöjligt att veta hur många gånger per frame dom metoderna kallas.
Efter det letade jag vidare och hittade IDirect3DDevice9::Present, vilket verkar vara en metod som, så att säga, visar upp vad som ritats i bakgrunden och jag tänkte då att det kändes logiskt att den kallas en gång per frame. Men det visar sig att den metoden, i spelen jag testat aldrig kallas.
Är det någon som har erfarenhet av DirectX som känner till någon metod som alltid kallas exakt en gång per frame? Har även testat med clear och den körs ju en gång för varje scen? (Alltså lika många gånger som begin/endscene)
Ifall det är något som är knasigt så fråga så kan jag försöka förklara mig bättre. Tack på förhand!
EDIT: Innan någon kommenterar det, så vill jag nämna att med låsa FPSen så menar jag självklart att sätta en maxgräns.
EDIT2: Testade precis att copy&pasta en snabb testapplikation, typ your first triangle från riemers.net där jag försäkrade mig om att Present kallades, och där fungerade också mitt andra program som hookar den metoden. Så varför kallar inte alla program Present()? Finns det något annat alternativ som man kan använda som jag har missat?
EDIT3: Tänkte bara uppdatera här igen ifall någon (mot förmodan) googlare skulle hitta hit och undra samma saker. Många spel kallar istället för vanliga present, swapchain::present. Så jag detourade helt enkelt fel metod. Har nu en fullt fungerande fps-limiter för dx9-spel! Nu står Dx10 på tur.