Denkproblem mit IDirect3DDevice9
-
Das bringt mir ja viel, weil da ja alles so klappt wie es soll
Was mich aber auch wundert ist, dass dieses Problem im Internet anscheinend gar nciht existiert und ich der einzige Idiot bin, bei dem ständig das Programm abkratzt.
-
Kannst ja mal versuchen über ne log Datei oder so rauszufinden wo es ca. abkackt...
-
Hab ich ja schon, das macht es bei CreateDevice. Aber ich bin schon weitergekommen... oder auch nicht. Jetzt läuft zwar alles, aber eine Menge Code wird übersprungen. Der Debugger sagt dann:
Der Haltepunkt wird momentan nicht erreicht. Mit dieser Zeile ist kein ausführbarer Code verbunden. Mögliche Ursachen: Präprozessordirektiven oder Compiler-/Linkeroptimierungen
Als Präprozessordirektive ist mir im moment nur WIN32_LEAN_AND_MEAN eingefallen, aber das ist es nicht. Optimierungen habe ich zum Test mal alle ausgestellt.
Hier ist der Code, die übersprungenen Codezeilen sind markiert:WNDCLASSEX wc; ZeroMemory(&wc, sizeof(WNDCLASSEX)); wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wc.lpfnWndProc = StaticWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(0,IDI_APPLICATION); wc.hCursor = LoadCursor(0,IDC_ARROW); wc.hbrBackground= 0; wc.lpszMenuName = 0; wc.lpszClassName= className; wc.hIconSm = 0; // registrate WindowClass if (!RegisterClassEx(&wc)) { std::cerr << "Window Klasse konnte nicht registriert werden" << std::endl; return false; } // Settings for fullscreen-mode if (fullscreen) { DEVMODE dmScreenSettings; ZeroMemory(&dmScreenSettings, sizeof(DEVMODE)); dmScreenSettings.dmSize = sizeof(DEVMODE); dmScreenSettings.dmPelsWidth = width; dmScreenSettings.dmPelsHeight = height; dmScreenSettings.dmBitsPerPel = bpp; dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; // change settings for fullscreen-mode if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) { if (MessageBox(0,L"Fullscreen Modus wird von ihrer Grafikkarte\nnicht unterstützt! Fenstermodus benutzen?",L"PROBLEM", MB_YESNO|MB_ICONEXCLAMATION) == IDYES) { fullscreen = false; } else { MessageBox(0,L"Programm wird geschlossen!",L"ERROR",MB_OK|MB_ICONERROR); return false; } } } DWORD dwExStyle; DWORD dwStyle; if (fullscreen) { dwExStyle = WS_EX_APPWINDOW; dwStyle = WS_POPUP; } else { dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; dwStyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_BORDER | WS_MINIMIZEBOX; } //adjust windowsize RECT windowRect; windowRect.left = static_cast<long>(0); windowRect.top = static_cast<long>(0); windowRect.right = static_cast<long>(width); windowRect.bottom = static_cast<long>(height); AdjustWindowRectEx(&windowRect, dwStyle, false, dwExStyle); // bis hier läuft es, danach wird eine Menge übersprungen if (!(hWnd = CreateWindowExW( dwExStyle, className, title, WS_CLIPSIBLINGS | WS_CLIPCHILDREN | dwStyle, GetSystemMetrics(SM_CXSCREEN) / 2 - width / 2, GetSystemMetrics(SM_CYSCREEN) / 2 - height / 2, fullscreen ? 0 : windowRect.right - windowRect.left, fullscreen ? 0 : windowRect.bottom - windowRect.top, 0, 0, hInstance, this))) { std::cerr << "Fenster konnte nicht erstellt werden" << std::endl; return false; } if (!(d3d = Direct3DCreate9(D3D_SDK_VERSION))) { std::cerr << "Direct3D Interface konnte nicht erstellt werden" << std::endl; return false; } if (d3d->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, !init.fullscreen)) { std::cerr << "Benötigter Device Type nicht verfügar" << std::endl; return false; } D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.BackBufferWidth = width; d3dpp.BackBufferHeight = height; d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = hWnd; d3dpp.Windowed = !fullscreen; if ((d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &d3dd)) != D3D_OK) { if ((d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &d3dd)) != D3D_OK) { if ((d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3dd)) != D3D_OK) { std::cerr << "Kann keinen Direct3D Device erstellen" << std::endl; return false; } } } // bis hier ist alles übersprungen, aber hier läuft es wieder weiter ShowWindow(hWnd,SW_SHOW); SetForegroundWindow(hWnd); SetFocus(hWnd);
-
Habe deinen Quellcode jetzt nicht gelesen, doch wenn das ganze im Fenstermodus klappt, im Vollbildmodus jedoch nicht, könnte das an der Auflösung liegen die du einstellst. Im Vollbildmodus musst du eine gültige Auflösung verwenden die von deiner Graphikkarte unterstützt wird, irgendwelche exotischen Dinge woe 500x500 könnten da zum Absturz führen.