Programm hat Hänger
-
Ich habe mir einen kleinen Level gebastelt den ich rendern lasse und mit Tastatur und Maus durchfliegen kann.
Das Problem ist jetzt, dass das Programm ca. alle 3 Sekunden kurz (für weniger als eine Sekunde) langsamer wird, als ob es von irgendwas gebremst wird.
Die Eingabe mache ich mit DirecInput. Da scheint das Problem aber nicht zu liegen, ich habe schon versucht Maus und Tastatur wegzulassen, es ruckelt trotzdem.
Anzeigen tu' ich alles mit DrawIndexedPrimitive. MemoryLeaks sind auch keine drin, der RAM-Verbrauch bleibt konstant. Timer sind keine an.Mein System: Win2k, Dx9
Jetzt kommt der Bonus: Wenn ich den windows Media Player an hab, ruckelt's nicht. Der braucht nur an sein, es muss kein Video laufen.
Eine weitere Seltsamkeit ist, dass die Prozessorauslastung bei 0-3% liegt während das Programm läuft. Und das, obwohl es eine Endlosschleife ist in der immer gerendert wird. Aber gut, das ist ja nicht unbedingt schlecht.Kennt das Problem mit dem Ruckeln jemand?
-
besorg dir die neusten treiber, ich hatte das mal mit einigen treiberversionen auch. die vom support schrieben mir, dass deren treiber halt alle zeitlang ein wenig optimiert um z.B. die fragmentierung von speicher aufzulösen und ich solle den AGP cache im bios auf höcher stellen damit das besser läuft... naja, half nicht wirklich.
die cpu auslastung ist 3%? hmm.. in einer endlosschleife... komisch komisch. ich hab immer 100% wenn ich sowat mache, du wartest in deiner endlosschleife nicht irgendwo zufällig auf ein event wie z.B. einen windows timer?
rapso->greets();
-
Hm nö die Treiber haben nichts geändert.
So sieht meine Schleife aus, mit Timern oder sonstwas hab ich gar nix gemacht:
while(true) { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if( msg.message == WM_QUIT ) return 0; TranslateMessage(&msg); DispatchMessage(&msg); } g_Input.Abfrage(); //[...] Bewegung der Kamera level.Culling(); level.Render(); }
Naja ich werd dann mal weiter nach der Ursache forschen, wenn jemand noch ne Idee hat, bitte hier reinschreiben.
-
Sers,
Das Problem hatte ich auch mal. Das kann unter anderem daran liegen, dass du bei der Kamerabewegung falsch mit Datentypen umgehst. Falls du falsch rundest macht die Kameraposition kleine Hopser in eine flüssige Bewegung, ob dir das hilft weiss ich nicht.ciao
-
Hi, ich bins nochmal. Ich hab das Problem bis jetzt nicht lösen können, habe es aber stark eingeschränkt.
Also:
Die Geschwindigkeitseinbrüche tauchen grundsätzlich nur im Fenster-Modus auf.
Es hängt von der Größe des (Windows-)Fensters ab. Nicht aber von der Auflösung, in der gerendert wird.
D.h. ich kann beim Erstellen des Device zB. die Backbuffergröße auf 32x32 stellen und es ruckelt trotzdem.
Wenn ich das Fenster aber ganz klein mache, zB 300x200, läuft es immer schnell, auch wenn der Backbuffer 2000x2000 groß ist.Es muss also irgendwie mit dem Kopiervorgang des Backbuffers auf das Fenster zusammenhängen. Ich kann aber nicht entdecken, was ich falsch gemacht habe.
Ihr könnt ja mal, wenn ihr Lust habt, meinen Code anschauen. Vielleicht fällt Euch ja was auf.
///////////////////////////// ////// ERSTELLEN DES FENSTERS HWND FensterErstellen( HINSTANCE this_inst, WORD breite, WORD hoehe, bool bVollbild ) { HWND win; // Main window handle WNDCLASS wc; // Window class ZeroMemory( &wc, sizeof( WNDCLASS ) ); wc.lpfnWndProc = WindowProc; wc.hInstance = this_inst; wc.hIcon = NULL; wc.hCursor = LoadCursor(this_inst, IDC_ARROW); wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW; GetStockObject(BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "bl2"; if (!RegisterClass(&wc)) return false; DWORD style; if( bVollbild ) { style = WS_POPUP; } else { style = WS_CAPTION|WS_SYSMENU; } // Create the window win = CreateWindow( "bl2", "M.E.S.H.", style, // style 0, // init. x pos 0, breite, hoehe, NULL, // parent window NULL, // menu handle this_inst, // program handle NULL); // create parms ShowWindow(win, SW_SHOW); return win; } ///////////////////////////////////////////////////// /////// ERZEUGEN DES DEVICE D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.BackBufferCount = 1; d3dpp.Windowed = 1; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.BackBufferWidth = 2000; d3dpp.BackBufferHeight = 2000; if( FAILED( pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pDev ) ) ) { return false; }
Bin echt am Ende mit meinem Latein. Danke fürs Durchlesen.