C++ Eigenes DirectX 11 Programm lädt sehr lange

  • Ersteller Ersteller Robert Alpha
  • Erstellt am Erstellt am
R

Robert Alpha

Gast
Hallo zusammen,
ich habe in letzter Zeit angefangen, in C++ und DirectX zu programmieren, ich halte mich dabei an ein Online- Tutorial.
In DirectX 9 hat alles funktioniert, dann habe ich versucht, mit DirectX 11 weiterzumachen.
Das meiste ist ja ganz ähnlich, wobei gleich am Anfang seltsam war, dass Visual Studio die Include- und Lib- Dateien im DirectX SDK Ordner nicht gefunden hat, die DX9 Dateien liegen am selben Ort, aber er findets erst, wenn ich den DX SDK Ordner in den Projekt Einstellungen hinzufüge.

Jetzt tritt bei der DX11 Version des Programms ein Problem auf, das bei der DX9 Version nicht aufgetreten ist: Nach dem Kompilieren öffnet sich das Fenster, bleibt aber grau, und das Bild wird erst nach ca. 20 Sekunden blau, so lange ist das Programm nicht ansprechbar. Beim Debuggen hängt das Programm diese ganze Zeit an der DX11- Methode D3D11CreateDeviceAndSwapChain() (Zeile 114), und Visual Studio zeigt an, mit dieser Zeile sei kein Code verknüpft, obwohl die Methode in der D3D11.h sehr wohl vorhanden ist :confused_alt:
Beim Debuggen bleibt VS auch an der Stelle hängen, und springt nicht, wie bei ZeroMemory() in die Unterdatei...

Und nach ca. 20 Sekunden schließlich läuft doch alles...

Jetzt die Frage, warum das Programm die 20 Sekunden bei der Funktion hängen bleibt, ist das bei DirectX 11 normal, weil es solange dauert, bis DX11 gestartet ist?

Hier der Programmcode:
Code:
// DirectX 11 Test
#include <windows.h>
#include <windowsx.h>
#include <d3d11.h>
#include <d3dx11.h>
#include <d3dx10.h>

#pragma comment (lib, "d3d11.lib")
#pragma comment (lib, "d3dx11.lib")
#pragma comment (lib, "d3dx10.lib")

IDXGISwapChain *swapchain;
ID3D11Device *dev;
ID3D11DeviceContext *devcon;
ID3D11RenderTargetView *backbuffer;

void InitD3D(HWND hWnd);
void RenderFrame(void);
void CleanD3D(void);
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);


int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    HWND hWnd;
    WNDCLASSEX wc;

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszClassName = L"WindowClass";

    RegisterClassEx(&wc);

    RECT wr = {0, 0, 800, 600};
    AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE);

    hWnd = CreateWindowEx(NULL,
                          L"WindowClass",
                          L"Our First Direct3D Program",
                          WS_OVERLAPPEDWINDOW,
                          300,
                          300,
                          wr.right - wr.left,
                          wr.bottom - wr.top,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

    ShowWindow(hWnd, nCmdShow);

    InitD3D(hWnd);

    MSG msg;

    while(TRUE)
    {
        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);

            if(msg.message == WM_QUIT)
                break;
        }

        RenderFrame();
    }

    CleanD3D();

    return msg.wParam;
}


LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY:
            {
                PostQuitMessage(0);
                return 0;
            } break;
    }

    return DefWindowProc (hWnd, message, wParam, lParam);
}


void InitD3D(HWND hWnd)
{
    DXGI_SWAP_CHAIN_DESC scd;

    ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));

    scd.BufferCount = 1;
    scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    scd.OutputWindow = hWnd;
    scd.SampleDesc.Count = 1;
    scd.SampleDesc.Quality = 0;
    scd.Windowed = TRUE;
    
    D3D11CreateDeviceAndSwapChain(NULL,
                                  D3D_DRIVER_TYPE_HARDWARE,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  D3D11_SDK_VERSION,
                                  &scd,
                                  &swapchain,
                                  &dev,
                                  NULL,
                                  &devcon);


    ID3D11Texture2D *pBackBuffer;
    swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);

    dev->CreateRenderTargetView(pBackBuffer, NULL, &backbuffer);
    pBackBuffer->Release();

    devcon->OMSetRenderTargets(1, &backbuffer, NULL);


    D3D11_VIEWPORT viewport;
    ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));

    viewport.TopLeftX = 0;
    viewport.TopLeftY = 0;
    viewport.Width = 800;
    viewport.Height = 600;

    devcon->RSSetViewports(1, &viewport);
}


void RenderFrame(void)
{
    devcon->ClearRenderTargetView(backbuffer, D3DXCOLOR(0.0f, 0.2f, 0.4f, 1.0f));
    swapchain->Present(0, 0);
}


void CleanD3D(void)
{
    swapchain->Release();
    backbuffer->Release();
    dev->Release();
    devcon->Release();
}
 
Wie sieht's denn aus, wenn du ein Release-Build generierst und das (nicht im Debugger sondern normal) ausführst? Dauert's dann auch so lange?
 
Nein, dann brauchts nur ca. 1 Sek, bis der blaue Hintergrund angezeigt wird.
Also ists ein Problem vom Debugger bzw. von Visual Studio?
Das muss doch irgendwie zu umgehen sein, das Programm nur zu erstellen, und manuell zu starten ist doch aufwändig. Und bei jeder kleinen Änderung ne halbe Minute warten is auch nicht das wahre...

EDIT:
Habe nun in den VS Menü Einstellungen die Option Ausführen ohne Debugging gefunden, da dauerts dann auch nur ca. 1 Sekunde.

Ist aber trotzdem seltsam, dass das Debuggen an der Stelle hängt... Woran könnte das liegen bzw. wie lässt sich das lösen?
 
Zuletzt bearbeitet:
Wahrscheinlich versucht der debugger, debugsymbole nachzuladen und hängt dabei(weil er sie nicht findet).
Edit: http://msdn.microsoft.com/en-us/library/windows/desktop/ee416588(v=vs.85).aspx

You can access the symbol server in one of the following ways:
* Enter the server address directly. In Visual Studio, from the Tools menu, choose Options, then choose Debugging, and then choose Symbols.
* Use the environment variable _NT_SYMBOL_PATH. We recommend this method.
 
Zuletzt bearbeitet:
Zurück
Oben