Maus reagiert sehr langsam



  • d3d = Direct3DCreate9(D3D_SDK_VERSION);
    
    	D3DFORMAT d3dFmt = D3DFMT_X8R8G8B8;
    
        d3dPP.Windowed                = false;
    	d3dPP.hDeviceWindow           = Window::getInstance().getHWnd();
        d3dPP.SwapEffect              = D3DSWAPEFFECT_DISCARD;
    	d3dPP.PresentationInterval    = D3DPRESENT_INTERVAL_DEFAULT;
        d3dPP.EnableAutoDepthStencil  = true;
        d3dPP.AutoDepthStencilFormat  = D3DFMT_D16;
        d3dPP.BackBufferFormat        = d3dFmt;
        d3dPP.BackBufferWidth         = GetSystemMetrics(SM_CXSCREEN);
    	d3dPP.BackBufferHeight        = GetSystemMetrics(SM_CYSCREEN);
    
    	d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Window::getInstance().getHWnd(), D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dPP, &d3dDev);
    
    	d3dDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    	d3dDev->SetRenderState(D3DRS_LIGHTING, FALSE);
    	d3dDev->SetRenderState(D3DRS_ZENABLE, TRUE);
    

    Und lass dir mal die FPS ausgeben...



  • Das Problem besteht immer noch, solange VSync an ist. Das Programm läuft mit
    60 FPS.



  • Ich habe deinen Code ausgefuhrt. Bemerkt habe ich lediglich die normale, minimale Verzögerung zwischen Mauszeiger und Text. Liegt wohl an deiner Hardware.



  • Ich hab eine Lösung gefunden:

    - Für das PresentationInterval D3DPRESENT_INTERVAL_IMMEDIATE angeben und
    - Sleep( 16 ) vor Present verwenden, um die Framerate bei ca. 60 FPS zu halten.

    Danke für deine Hilfe!



  • D3DPRESENT_INTERVAL_IMMEDIATE und Sleep( 16 ) vor Present

    schon mal ueberlegt, welche nachteile das haben koennte?



  • Nö, welche denn?



  • ProGamer.Coder schrieb:

    Nö, welche denn?

    Dein Rechner rendert das im null komma nix, d.h. ein Frame braucht so gut wie keine Zeit (16ms * 60frames = ~1000ms also 1Sekunde). Wenn es nun einen langsameren PC gibt, der sagen wir mal 5ms für ein Frame braucht, dann wären das 5ms + 16ms (sleep pro frame) = 21ms pro Frame und 21ms * 60frames = 1260ms, also würde er für die 60Frames 1,2Sekunden brauchen (wären also nur 50FPS bei diesem Rechner).



  • Danke, klingt plausibel.
    Aber wie bekomme ich denn eine Framerate von 60 fps bei deaktivierter VSync?



  • Hoffe das hilft..

    int Framerate = 60;
    
    LONGLONG Frequency; // Frequenz des Counters
    LONGLONG Offset;    // Abstand zwischen den Frames
    LONGLONG NextFrame; // Zeit bis zum nächsten Frame
    LONGLONG CurCount;  // aktueller Zählerstand 
    
    // Windows main-Funktion
    int WINAPI WinMain(HINSTANCE hInstance,      
                       HINSTANCE hPrevInstance,  
                       LPSTR lpCmdLine,          
                       int nCmdShow)             
    {   
        MessageBox(0,"Dieses Programm zeigt, wie die Framerate auf einen festen Wert "
                     "gesetzt wird.\nDie Framerate kann mit den Tasten '+' und '-' "
                     "erhöht und erniedrigt werden.","FixedFrameRate",MB_OK);
    
        // Fenster erzeugen und Handle speichern
        hWnd = CreateMainWindow(hInstance);
    
        // Wenn der Rückgabewert 0 ist, ist ein Fehler aufgetreten
        if(0 == hWnd)
        {
            MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK);
            return -1;
        }
    
        // Direct3D initialisieren
        if(!Direct3D.Init(hWnd,FALSE))
        {
            return -1;
        }
    
        ResourceManager.Init(Direct3D.GetDevice());
    
        // Maus-Cursor verstecken
        ShowCursor(FALSE);
    
        // Farbe die beim Löschen verwendet werden soll
        Direct3D.SetClearColor(D3DCOLOR_XRGB(0,0,0));
    
        int i;
    
        // Zufallsgenerator initialisieren
        srand(timeGetTime());
    
        // Grafiken (Texturen) laden
        char Filename[128];
    
        // Frequenz speichern, wenn Counter vorhanden
        if(!QueryPerformanceFrequency(
                       (LARGE_INTEGER*)&Frequency))
        {
            MessageBox(0,"Performancecounter nicht vorhanden.","Fehler",MB_OK);
            return -1;
        }
    
        // Abstand zwischen zwei Frames berechnen
        Offset = Frequency / Framerate;
    
        // aktuellen Zählerstand Zeit speichern
        QueryPerformanceCounter((LARGE_INTEGER*)&CurCount);
    
        // berechnen wann nächstes Frame dargestellt wird 
        NextFrame = CurCount + Offset;
    
        // Struktur, in der Informationen zur Nachricht gespeichert werden
        MSG msg = { 0 };
    
        while(msg.message != WM_QUIT)
        {
            if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            else
            {
                // aktuellen Zählerstand holen
                QueryPerformanceCounter((LARGE_INTEGER*)&CurCount);
    
                // wenn es Zeit für das nächste Frame ist
                if(CurCount > NextFrame)
                {
                    Direct3D.BeginScene();
    
                    Direct3D.EndScene();
    
                    // Abstand zum nächsten Frame berechnen
                    NextFrame = CurCount + Offset;
                }
            }
        }
    
        // Rückgabewert an Windows
        return 0;
    }
    


  • Danke, Kuldren!


Anmelden zum Antworten