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!