Wieso "ruckeln" meine DX Anwendungen ab und zu?
-
Dann ist das wohl ein Fehler in Deinem Spiel und hat nichts mit DirectX zu tun?
-
mit "bin ich ganz wo anders" meine ich dass meine Blickrichtung verschoben ist. Ja, dass irgendwo ein Fehler liegen muss ist mir auch klar, jedoch muss er irgendwo bei DX und seinen Initialisierungen liegen, da das Problem schon immer besteht, wenn der Freelookmode verfügbar ist! Klar könnte es sein, dass in dem ein Fehler ist, jedoch glaube ich das weniger, da er aus einem, zu mindestet denke ich gutem, Tutorial ist. Ihr könnt ihn euch ja mal ansehn:
lMouseX = 0; lMouseY = 0; dIn_obj->GetMouseMove(lMouseX,lMouseY); if (( lMouseX !=0) || (lMouseY !=0)) { // Neue Winkelverschiebungen berechnen und von den alten // Winkeln abziehen m_fYaw -= 0.002f*lMouseX; m_fPitch -= 0.002f*lMouseY; // Da wir den Kopf ja nicht ausrenken wollen, begrenzen // wir nach unten und nach oben den Winkel auf etwa 60° if (m_fPitch > 1.5f ) m_fPitch = 1.5f; if (m_fPitch < -1.5f) m_fPitch = -1.5f; // Richtungsvektor ermitteln vDirection.x = (float)(cos(m_fYaw)*cos(m_fPitch)); vDirection.y = (float)(sin(m_fPitch)); vDirection.z = (float)(sin(m_fYaw)*cos(m_fPitch)); // Blickrichtung neu berechnen m_vLookAt = m_vPosition + vDirection; } D3DXVec3Normalize(&vDirection,&(m_vLookAt - m_vPosition)); D3DXVec3Cross(&vLeft,&vDirection,&m_vUp); D3DXVec3Normalize(&vLeft,&vLeft); vDirection.y = 0; if (dIn_obj->IsKeyDown(DIK_RIGHT) || dIn_obj->IsKeyDown(DIK_D)) { m_vPosition -= vLeft*m_fSpeed*cTimer->GetTimeBetweenFrames(); m_vLookAt -= vLeft*m_fSpeed*cTimer->GetTimeBetweenFrames(); } //hier ginge es noch weiter mit den anderen Tasten, jedoch überflüssig // Erstellen der Kameramatrix D3DXMatrixLookAtLH( &m_mViewMatrix, &m_vPosition, &m_vLookAt, &m_vUp); // Kameramatrix setzen dd_obj->lpD3DDevice->SetTransform( D3DTS_VIEW, &m_mViewMatrix); }
Debugmethoden um auf den Fehler zu kommen gibt es auch keine oder?
Kevin
-
Ich hab bei mir auch so Ruckler drin die ich mir nicht erklären kann, allerdings nur im Fenstermodus und wenn kein Winamp oder irgendwas in der Art läuft
Ich glaube der D3D Initialisierungscode wäre interessanter...oder vielleicht was die Funktion GetMouseMove() macht.
Schonmal Vollbild bzw. im Fenster ausprobiert?
-
Hallo!
Im Vollbildmodus ist es glaube ich nicht so extrem!
GetMouseMove macht nichts besonderes.
Aber mal was anderes, angenommen ich rufe pro Frame eine Funktion auf bei der zum Beispiel am Anfang immer steht:float Distance;
kostet es dann mehr Performance als wenn ich einmal - am Start der Anwendung - float Distance deklariert hätte und dies dann immer benutzen würde, oder ist es im Prinzip egal? Oder "frisst" es sogar pro Aufruf immer mehr Speicher (ok - glaube ich nicht, aber wer weiß :))
Das wäre mal gut zu wissen, weil, ich weiß nicht ob es Einbildung ist, ich habe beim Rendern zu meinen Objekten immer einen Zeiger auf mein DX_Object mitgeliefert, das habe ich mal geändert, dass beim Rendern keine Parameter mehr übergeben werden müssen und - ob Einbildung oder nicht - es scheint schneller zu gehen, kann das sein?Hier mal der Initialisierungscode:
void Init(HWND main_window_handle, BOOL _bWindowed) { //_bWindowed = FALSE; bWindowed = _bWindowed; lpD3D = Direct3DCreate8(D3D_SDK_VERSION); lpD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm); ZeroMemory(&d3dpp, sizeof(d3dpp)); if(!bWindowed) { d3dpp.Windowed = FALSE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//D3DSWAPEFFECT_FLIP; d3dpp.BackBufferFormat = d3ddm.Format; d3dpp.BackBufferWidth = SCREEN_WIDTH; d3dpp.BackBufferHeight = SCREEN_HEIGHT; d3dpp.BackBufferCount = 1; d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_ONE; d3dpp.hDeviceWindow = main_window_handle; } if(bWindowed) { d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//D3DSWAPEFFECT_FLIP;////D3DSWAPEFFECT_COPY_VSYNC;//D3DSWAPEFFECT_FLIP; d3dpp.BackBufferFormat = d3ddm.Format; } d3ddm.Format = CheckDisplayMode(800,600, 32); if(d3ddm.Format != D3DFMT_UNKNOWN) { //Width x Height x 32bit has been selected d3ddm.Width = 800; d3ddm.Height = 600; } else { d3ddm.Format = CheckDisplayMode(800, 600, 16); if(d3ddm.Format != D3DFMT_UNKNOWN) { //Width x Height x 16bit has been selected d3ddm.Width = 800; d3ddm.Height = 600; } } if(lpD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D32) == D3D_OK) { // MessageBox(hwnd, "32", 0, 0); d3dpp.AutoDepthStencilFormat = D3DFMT_D32; d3dpp.EnableAutoDepthStencil = TRUE; } else if(lpD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D24X8) == D3D_OK) { // MessageBox(hwnd, "24", 0, 0); d3dpp.AutoDepthStencilFormat = D3DFMT_D24X8; d3dpp.EnableAutoDepthStencil = TRUE; } else if(lpD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16) == D3D_OK) { // MessageBox(hwnd, "16", 0, 0); d3dpp.AutoDepthStencilFormat = D3DFMT_D16; d3dpp.EnableAutoDepthStencil = TRUE; } else { MessageBox(hwnd, "Critical Error occured!", 0, 0); } d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; if(lpD3D->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, d3ddm.Format, FALSE)==D3D_OK) { lpD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, main_window_handle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &lpD3DDevice); } else { lpD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF , main_window_handle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &lpD3DDevice); } lpD3D->GetAdapterIdentifier(D3DADAPTER_DEFAULT, 0, &AdapterIdentifier); //SetWindowText(main_window_handle, AdapterIdentifier.Description); lpD3DDevice->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &lpBackbuffer); //lpD3DDevice->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(255,255,255)); lpD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); lpD3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); lpD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); lpD3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); lpD3DDevice->SetRenderState(D3DRS_NORMALIZENORMALS, TRUE); }
Vielen Dank für die Hilfe!!!!
Kevin
-
Surkevin schrieb:
...angenommen ich rufe pro Frame eine Funktion auf bei der zum Beispiel am Anfang immer steht:
float Distance;
kostet es dann mehr Performance als wenn ich einmal - am Start der Anwendung - float Distance deklariert hätte...Schau dir das mal an:
http://www.c-plusplus.net/forum/viewtopic.php?t=63420
-
zeig mal wie du deine "window messages" abfragst...
-
Hallo!
Ich mache nicht besonders viel mit den WMs...wozu auch?LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HDC hDC; switch(message) { case WM_DESTROY: delete [] m_cube.dwIndicies; delete [] m_cube.m_vertizes; delete [] m_cube.v; delete [] m_player.dwIndicies; delete [] m_player.m_vertizes; delete [] m_player.v; PostQuitMessage(0); return 0; break; } return DefWindowProc(hWnd, message, wParam, lParam); }
Was noch interessant wäre, ist mein "messageverlauf":
while( msg.message != WM_QUIT && msg.message != WM_DESTROY ) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else { dinput_obj->Update(); if(dinput_obj->IsKeyDown(DIK_E)) { m_cube.bDebug = FALSE; } if(dinput_obj->IsKeyDown(DIK_G)) { m_cube.bDebug = TRUE; } if(dinput_obj->IsKeyDown(DIK_ESCAPE)) { PostMessage(hWnd, WM_QUIT, 0, 0); } m_timer->Refresh(); m_kamera->Update(); Render(); } }
Vielleicht könnt ihr damit noch was anfangen!
Kevin
-
Surkevin schrieb:
delete [] m_cube.dwIndicies; delete [] m_cube.m_vertizes;
Ah, das tut mir in den Augen weh!
1.) Einmal "Englisch", einmal Deutsch
2.) "Indicies" wird ohne das zweite "i" geschrieben...Und warum nicht einfach:
delete m_cube; delete m_player;
Die Klassen für Cube und Player sollen ihre Daten gefälligst selber löschen, und zwar in deren Destruktor!
-
dIn_obj->GetMouseMove(lMouseX,lMouseY);
Ich vermute den Fehler darin!
Wenn du die Mausbewegungen als WM_ - Nachrichten abfängst (in der Klasse meine ich) dann ruckelt das Ding. Die Windowmessages sind nicht so schnell beim verarbeitet werden.
Das war bei mir halt so.
Wenn du die Maus nicht bewegst dann geht das Spiel flüßig, oder?
-
HI! Jo wenn ich die Maus bewege ruckelt es nur manchmal, jedoch mache ich das nicht über WM_Messages, guckst du hier:
VOID DInput::GetMouseMove(LONG &X, LONG &Y) { X = m_lMouseMoveX; Y = m_lMouseMoveY; } void DInput::Update() { DI_Keyb->GetDeviceState( sizeof(keys), &keys ); DIMOUSESTATE2 MouseState; DI_Mouse->GetDeviceState(sizeof(DIMOUSESTATE2), &MouseState); // X/Y-Werte der Mausbewegung speichern m_lMouseMoveX = MouseState.lX; m_lMouseMoveY = MouseState.lY; // Neue Mausposition berechnen m_lMousePositionX += m_lMouseMoveX; m_lMousePositionY += m_lMouseMoveY; // Maustasten abfragen und Status zwischenspeichern for (DWORD i=0; i<8; i++) mouse[i] = MouseState.rgbButtons[i]; }
Kevin