Niedrige FPS...
-
Hi,
hab ein Problem mit der Framerate in meinem Programm. Ich hab beim Rendern
eines Würfels im Drahtgittermodus nur etwa 70 fps auf einer guten
Grafikkarte und nem normalen Rechner. Das sollte nicht sein, aber ich weiß
nicht worans liegt und wenn ich die Funktionen zum Rendern des Würfels
rausnehme, läufts genauso langsam. Hab dann ein Testprogramm geschrieben,
das nichts anderes macht, als ein DX-Objekt zu initialisieren und die
Renderfunktion in der Schleife der Nachrichtenbehandlung aufzurufen. Ohne
Geometrie oder Lichter oder Matrizen. Und es läuft auch nur mit 70 fps.
die Schleife hat folgenden Aufbau:int Run(void) { MSG msg; ZeroMemory( &msg, sizeof(msg) ); while(true) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { if (msg.message == WM_QUIT) break; TranslateMessage( &msg ); DispatchMessage( &msg ); } else { Render(); } } return (int)msg.wParam; }
Wär klasse wenn jemand einen Vorschlag hat. Sollte schätzungsweise mit
500 bis 600 Bildern pro Sekunde laufen...
Danke.
Norman.
-
Zeig mal deinen Konrekten Blit/Flipping Code.
Hast bestimmt den Syncro mit dem Verticalen Refresh mitgenommen.PS:
ZeroMemory( &msg, sizeof(msg) );
Ist übrigens unnütz.
-
void CreateD3D(void) { HRESULT hr; // Create the D3D object, which is needed to create the D3DDevice. pD3D = Direct3DCreate9( D3D_SDK_VERSION ); D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D16; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; hr = pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &pd3dDevice ); } void Render() { // Clear the backbuffer and the zbuffer pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0 ); // Begin the scene if( SUCCEEDED( pd3dDevice->BeginScene() ) ) { // Würd hier die Objekte anzeigen lassen pd3dDevice->EndScene(); } pd3dDevice->Present( NULL, NULL, NULL, NULL ); }
-
Versuch mal so:
pd3dDevice->Present( NULL, NULL, NULL, D3DPRESENT_DONOTWAIT);
-
klappt nicht, weil Present() nur 4 Parameter nimmt, die allesamt keine Flags
sind, sondern nur Regionen, in denen gerendert werden soll oder ähnliches.
Es gibt eine Present() Funktion von IDirect3DSwapChain9, die 5 Parameter nimmt, wobei der letzte dieses Flag annehmen würde, aber ich wüsste nicht, wie ich das in die Schleife implementieren sollte..
-
VSync aus?
Bye, TGGC (NP Intelligenz)
-
wie kann ich das denn ausstellen?
gibt doch so weit ich weiß keine Einstellung in den PresentParams die
das steuert oder?
-
oder in D3DPRESENT_PARAMETERS.PresentationInterval = D3DPRESENT_DONOTWAIT reinmachen.
-
Vielleicht will der User VSync an?
Bye, TGGC (NP Intelligenz)
-
das mit den PresentaionParameters.PresentationInterval = D3DPRESENT_DONOTWAIT hab ich gemacht, Testprogramm läuft immer noch mit 50 - 60 fps...
Ich habs aber grad geschafft, Danke!! Musste das PresentationInterval auf
D3DPRESENT_INTERVAL_IMMEDIATE stellen. Läuft jetzt statt mit 60 fps mit
255..
thx !
-
hm, also angewendet auf mein richtiges Programm hab ich etwa eine verbesserung um 30 - 40 frames pro sekunde. Ist zwar schneller aber irgendwo muss noch ein größerer Fehler liegen. Ich hatte statt 40 eher 200 fps erwartet. So aufwendig ist mein level nicht... Kennt ihr noch verschiedene Einstellungen, an denen es liegen könnte und die man optimieren kann? Ich dachte, es läge an der Schleife, aber da wüsste ich keine andere Möglichkeit, es zu realisieren.