Seltsames Problem mit Wieder-Initialisierung nach aufräumen...



  • Hallo allerseits!

    Ich nutze DirectX innerhalb eines Fenstes aufgerufen von einer MFC Anwendung.
    Wenn ich das Fenster schließe, räume ich "brav" den Speicher auf und das funktioniert auch, wie ein Blick in den Taskmanager offensichtlich zeigt:

    VOID Cleanup()
    {
        if( g_pd3dDevice != NULL) 
            g_pd3dDevice->Release();
    
        if( g_pD3D != NULL)
            g_pD3D->Release();
    
    	for (int buff = 0; buff < bufferanzahl; buff++)
    	{
    		if( g_pVBar[buff] != NULL )
            g_pVBar[buff]->Release();
    	}
    }
    

    mit

    LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDevice
    LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering device
    LPDIRECT3DVERTEXBUFFER9 g_pVBar[100]; // Bufferarray to hold vertices
    

    Will ich das Fenster danach allerdings erneut aufrufen, bekomme ich eine Fehlermeldung.
    Das ganze läuft folgendermaßen ab:
    Die entsprechende Codestelle (die beim ersten Aufruf funktioniert) ist:

    // Initialize Direct3D
        if( SUCCEEDED( InitD3D( hWnd ) ) )
        { 
            // Show the window
    		MessageBox(L"Marke1.");
    		::ShowWindow( hWnd, SW_SHOWDEFAULT );
    		MessageBox(L"Marke2.");
    		::UpdateWindow( hWnd );
    		MessageBox(L"Marke3.");
                    InitGeometry();
    		MessageBox(L"Die Geometrie wurde initialisiert.");
    		Render();
                    ....
    

    Nach der MessageBox "Marke1" [natürlich zu Debug Zwecken eingebaut...] erscheint folgende Meldung:

    Unhandled exception at 0x4fde448c in mfc-test.exe: 0xC0000005: Access violation reading location 0x0000001c.

    und der Debugger zeigt auf folgende Codezeile:

    g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, yBloecke*xBloecke*2 );
    

    welche sich, und das ist jetzt das komische, innerhalb der Funktion Render() befindet, die dort doch noch gar nicht aufgerufen wurde!
    Auch beim durchsteppen (F10) beim debuggen kann ich diesen Sprung nicht so recht nachvollziehen: Beim Aufruf von

    ::ShowWindow( hWnd, SW_SHOWDEFAULT );
    

    wird plötzlich in erwähnte Zeile in der Render Funktion gesprungen.

    Kann mir jemand erklären, was da passiert? 😕
    Und wie kann ich das vemeiden?

    (Wenn ich in der CleanUp Funktion auf das sauberMachen des Bufferarrays verzichte, tritt dieser Fehler übrigens nicht auf, was auch gut zu der Zeile vor der Zeile in der Render() Funktion paßt, die nach dem Fehler angezeigt wird:

    g_pd3dDevice->SetStreamSource( 0, g_pVBar[buff], 0, sizeof(CUSTOMVERTEX) ); // die Zeile, wo der Buffer verwendet wird
    g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, yBloecke*xBloecke*2 ); // die Zeile, die beim Fehler angezeigt wird
    

    )

    Danke und Gruß!



  • Oh weija, abends um 23 Uhr lässt meine Denkfähigkeit scheinbar erschreckend nach:

    dong schrieb:

    Und wie kann ich das vemeiden?

    Ganze einfach läßt sich das vermeiden:
    Durch Initialisierung des DirectX Buffers bereits bevor das Fenster aufgerufen wird:

    if( SUCCEEDED( InitD3D( hWnd ) ) )
        { 
            // Show the window
    		MessageBox(L"Marke1.");
    		InitGeometry();
    		MessageBox(L"Die Geometrie wurde initialisiert.");
    		::ShowWindow( hWnd, SW_SHOWDEFAULT );
    		MessageBox(L"Marke2.");
    		::UpdateWindow( hWnd );
    		MessageBox(L"Marke3.");
                     //InitGeometry();  hier war es vorher
    		//MessageBox(L"Die Geometrie wurde initialisiert.");
    		Render();
    

    Warum bereits vorher in die Render() Funktion gesprungen wurde ist mir zwar immer noch nicht klar, aber immerhin gibt es jetzt keinen Speicherzugriffsfehler. 🙂

    Gruß,
    dong


Anmelden zum Antworten