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.


Anmelden zum Antworten