04. februar 2003 - 11:22Der er
44 kommentarer og 2 løsninger
FPS
Siden jeg har installeret XP, lader det til at Windows ikke vil give mig lov til at se den nojagtige Frame Rate i mine OpenGL applikationer. Hvis min skaerms Hz er sat til 75 saa bliver mine FPS hojst 75, Hvis jeg saetter min skaerm til 60 Hz saa bliver min FPS hojst 60 osv. Hvor i mod Win2000/Win98 giver mig den "rigtige" FPS paa ca. 165. Jeg ved at det i princippet kan gore lige meget da ojet ikke opfatter meget mere end ca. 60 frames i sekundet alligevel men det er lidt irriterende. Nogen der ved hvad jeg kan gore? NB: Jeg har set at spil som Dungeon Siege, ikke har problemer med at vise den eksakte frame rate!!!
Det kan jo være at det er spillet der, under XP, tjekker refresh rate'en og begrænser fps...
Du skriver godt nok at øjet ikke kan se mere end ca 60 frames, men hvis din monitor kører 60Hz ER der ikke mere end 60 opdateringer pr sekund, ligemeget om dit spil så kører 200fps!
Jeg taenkte om der var nogen DirectX udvikler der er stodt ind i samme problem, eller om det kun er os OpenGL udvikler der har problemet. Ellers kunne man jo taenke sig at DirectX havde indbygget en funktion der ungik denne problametik!!!!
Jeg mener du bør respektere brugerens settings. Jeg ville ihvertfald ikke kunne acceptere at noget program ændrerede netop den setting hos mig, jvf. jpk's indlæg (hvorfor spilde cpu kraft på noget man intet får ud af..).
Hvis du vil ændre på denne setting skal du være opmærksom på at der er forskel på drivere og producenter - det lægger sikkert settings forskellige steder med forskellige navne..
Umiddelbart ville jeg sige at det er denne key der skal redigeres i (Nvidia): HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\nv\Device0\OGL_MaxFramesAllowed og/eller denne: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\nv\Device0\OGL_MaxFramesAllowed og/eller denne: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\nv\Device0\OGL_MaxFramesAllowed
Jeg ved så ikke om computeren skal genstartes eller ændringen skal opdateres til grafikkortet på en eller anden måde (prøv at eksperimentere lidt med det) ?
I DirectX bestemmes det via FullScreen_PresentationInterval memberen i D3DPRESENT_PARAMETERS strukturen man giver som argument når man kalder CreateDevice...
Man kunne jo selvfolig bare aendre indstillingerne mens man applikationen korte for derefter at saette indstillingerne tilbage til den oprindelige opsaetning efter brug!!! Det er selvfolgelig ikke den perfekte losning - men af mangel paa bedere kunne det vel bruges :-))
Men det er skam besvaeret vaerd at faa den praecise frame rate, da jeg er midt i en optimerings process, og har derfor brug for at se om min nye assembler optimering osv. har effekt paa frame raten uanset om jeg kore min applikation paa en 2 Ghz processor eller en 500 mhz.
Men, som sagt er der forskel på grafikkort producenter og drivere. Derfor vil du opleve at det er en kæmpe opgave at indsamle oplysninger om hvordan det ændres.
Måske det var nemmere at få dem der skal teste til at ændre i den setting ?
"DirectX's maade at undvige at frame raten bliver "controlleret" af refresh raten" Bliver nok lidt svært - mig bekendt har Microsoft ikke offentliggjort koden til deres libs ?
Måske det er en option som grafikkort driverene skal implementere (dem som er directx kompatible) ?
Enig enig enig, men det var mest for at spare tid (og irritation) naar jeg tester... (Men nok mest fordi at ikke kan faa ind i mit lille hoved, hvorfor det er "nodvendigt" at Windows absolut skal blande sig mellem mit forhod til mit grafikkort :-))
Jamen, det er jo driver producenter der har bestemt at den setting skal enables/disables når driveren installeres (men det er måske Microsoft der har pålagt dem dette..).
Jeg er lige ved at studere Microsofts hjemmeside, og de snakker om et kald der hedder GetDefaultFPS(Double), da jeg ikke er i naerheden af en kompiler kunne jeg maaske faar en af jer til at teste kaldet (please)...
Du kan helt sikkert ikke se DX implementationen, da den ikke er offentlig tilgængelig! Det er muligt, at et grafikkort, for at være DX kompatibelt, skal tilbyde, at sætte dette via dets DX interface. Man kan også sige "Hvorfor skal du blande dig i hvilken refresh rate en bruger skal køre ved?" Hvis vedkommende har lyst til at spilde unødig CPU/GPU-kraft, kan vedkommende jo ændre det! Du får sansynligvis også selv noget ud af det, nemlig mere CPU fri til AI, collision detection osv.
jpk>> Jeg vil nodigt blande mig i brugerens onske om han/hendes refresh rate derfor vil det (hvis det bliver den losning) ogsaa en option som brigren kan vaelge i min applikation...
opfolger til ovenstaende indlaeg fra mig...
Requirements Header: Include Qedit.h. This header file is not compatible with Microsoft® Direct3D® headers later than version 7. Library: Use strmiids.lib.
Her er lige en side sporgsmaal er der negen af jer der ved hvor Geometry_No_Asm stammer fra? Er det en OpenGL parameter (jeg aldrig har hort om) eller hvor kommer kommer den fra? Jeg ved at det ikke har noget med FPS at gore overhovedet men alligevel...
Det er vedrorende AMD's 3DNow! assembler optimering. Hvis parameteren retunere en True er systemet "godkendt" til at bruge optimering Assembler kode for bade FPU'en og 3DNow! ellers skal den bare kore standard kode... Giver det mening? :-))
1) GetDefaultFPS() er jo til DirectShow (ikke det samme som Direct3D/DirectX Graphics) og kan bruges på en stream til at returnere den frame rate streamen bør afspilles ved. Det har intet at gøre med fps for realtime rendering af vertices!
2) Hvis OpenGL 'blocker' indtil det er tid til næste frame, når du præsenterer din framebuffer, ER den præcise frame rate jo netop fx 60Hz!
3) Det du foreslår med brug af GetDefaultFPS ville jo betyde at man skulle kunne forudsige hvor lang tid renderingen ville tage! Det er jo umuligt at vide idet du ikke har totalt styr på memory osv. Hvor lang tid tager det fx at uploade en vertexstream til AGP-memory? Findes den allerede i AGP-memory?
jpk>> Se det lyder meget fornuftigt. Det eneste jeg onsker er som sagt bare at jeg ikke vil have at OpenGL "Blocker" framebufferen (ligesom i gode gamle dage), og det lader til at den eneste maade at undvige dette er at gaa gennem registrerings basen, finde grafokortets producent og aendre indstilling - ligesom Soreno saa fornemt har vist (trods jeg ligesom Jpk bestemt ikke er meget for at gaa denne direkte vej og aendre paa brugens opstilling).
Du kan selvfølgelig tilnærmelsesvist finde ud af det, ved selv at tjekke tiden i din applikation. Hvis det endnu ikke er tid til at præsentere en frame (i forhold til refresh raten), lader du bare være... Det betyder at du stadig kan bruge tiden på at batche framen og derved se en mere eller mindre korrekt frame rate... Hvis du vælger dette, skal du dog nok eksperimentere lidt, da du jo springer arbejdet med at vise framen over. Det betyder jo, at hvis din app er GPU limited, vil du sansynligvis få en langt højere frame rate end i det virkelige tilfælde!
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.