JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=a07500f4177c8af06499a73b83a91ff1Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Problem mit SurfaceLoading

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
C++progging
Senior JLI'ler


Alter: 30
Anmeldedatum: 03.10.2005
Beiträge: 244
Wohnort: Sauerland
Medaillen: Keine

BeitragVerfasst am: 17.03.2008, 13:24    Titel: Problem mit SurfaceLoading Antworten mit Zitat

Hi,
im folgenden Programm werden die Surfaces zwar problemlos angezeigt,
beim Beenden kommt die Meldung, dass ein Haltepunkt erzeugt wurde.
Beim Starten ohne Debugging wird von einer unbehandelten Ausnahme berichtet:

Direct3D9: :BackBufferCount not specified, considered default 1
Direct3D9: :Subclassing window 000104e4
Direct3D9: :StartExclusiveMode
Direct3D9: :WM_DISPLAYCHANGE: 800x600x32
"WdM20.exe": "C:\WINDOWS\system32\usp10.dll" wurde geladen
Direct3D9: :WM_ACTIVATEAPP: BEGIN Deactivating app pid=00000eec, tid=00000ee4
Direct3D9: :DoneExclusiveMode
Direct3D9: :INACTIVE: 00000eec: Restoring original mode (1024x768x22x60) at adapter index 0
Direct3D9: :WM_DISPLAYCHANGE: 1024x768x32
Direct3D9: :*** Active state changing
Direct3D9: :WM_ACTIVATEAPP: DONE Deactivating app pid=00000eec, tid=00000ee4
Direct3D9: :*** WM_NCDESTROY unhooking window ***
Direct3D9: :*** Unhooking window proc
Direct3D9: :====> ENTER: DLLMAIN(010cd6e0): Process Detach 00000eec, tid=00000ee4
Direct3D9: (INFO) :MemFini!
Direct3D9: (WARN) :Memory still allocated! Alloc count = 111
Direct3D9: (WARN) :Current Process (pid) = 00000eec
WdM20.exe hat einen Haltepunkt ausgelöst.
Das Programm "[3820] WdM20.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.


Und hier der Code:
Direct3D.h
CPP:
#include <d3d9.h>
#include <d3dx9.h>
#include "global.h"



class CDirect3D
{
   public:

        CDirect3D();
        virtual ~CDirect3D();

        BOOL Init(HWND hWnd, BOOL bWindowed = TRUE);
        void SetClearColor(D3DCOLOR Color);
        void DrawText(LPCSTR Text,
                      int x, int y,
                      D3DCOLOR TextColor);

        void BeginScene(void);
        void EndScene(void);

        void DrawIcon(void);
      void DrawButA(void);
      void DrawButB(void);
      void DrawButC(void);

   protected:

        void CreateFont(void);
        void CleanUp(void);


        D3DXIMAGE_INFO m_SrcInfo;

        D3DCOLOR          m_ClearColor;

        LPDIRECT3D9       m_lpD3D;
        LPDIRECT3DDEVICE9 m_lpD3DDevice;
        LPD3DXFONT        m_lpD3DFont;

        LPDIRECT3DSURFACE9 m_lpBackBuffer;
        LPDIRECT3DSURFACE9 m_lpSurface;
};

Direct3D.cpp
CPP:
#include "Direct3D.h"
#include <dxerr9.h>

// Dateinamen der zu ladenden Grafiken
const char* ICON      = "../../Test/Resources/icon.bmp";
const char* BUTTON_A  = "../../Test/Resources/ButtonA.bmp";
const char* BUTTON_B  = "../../Test/Resources/ButtonB.bmp";
const char* BUTTON_C  = "../../Test/Resources/ButtonC.bmp";


CDirect3D::CDirect3D()
{
    m_lpD3D        = NULL;
    m_lpD3DFont    = NULL;
    m_lpSurface    = NULL;
    m_lpD3DDevice  = NULL;
    m_lpBackBuffer = NULL;
}

CDirect3D::~CDirect3D()
{
    CleanUp();
}

BOOL CDirect3D::Init(HWND hWnd, BOOL bWindowed)
{
    m_lpD3D = Direct3DCreate9(D3D_SDK_VERSION);

    if(NULL == m_lpD3D)
    {
        return FALSE;
    }
    D3DPRESENT_PARAMETERS PParams;
    ZeroMemory(&PParams, sizeof(PParams));

    PParams.SwapEffect       = D3DSWAPEFFECT_DISCARD;
    PParams.hDeviceWindow    = hWnd;
    PParams.Windowed         = bWindowed;

    PParams.BackBufferWidth  = SCR_WIDTH;
    PParams.BackBufferHeight = SCR_HEIGHT;
    PParams.BackBufferFormat = D3DFMT_A8R8G8B8;

    HRESULT hr;
    if(FAILED(hr = m_lpD3D->CreateDevice(
                                 D3DADAPTER_DEFAULT,
                                 D3DDEVTYPE_HAL,
                                 hWnd,
                                 D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                 &PParams,
                                 &m_lpD3DDevice)))
    {
        const char* Err = DXGetErrorDescription9(hr);
        DXTRACE_MSG(Err);
        MessageBox(NULL, Err, "CreateDevice", MB_OK);
        return FALSE;
    }

    CreateFont();
    return TRUE;
}

void CDirect3D::SetClearColor(D3DCOLOR Color)
{
    m_ClearColor = Color;
}

void CDirect3D::DrawText(LPCSTR Text, int x, int y, D3DCOLOR TextColor)
{
    RECT r = { x, y, 0, 0 };

    m_lpD3DFont->DrawText(NULL, Text, -1, &r, DT_CALCRECT, TextColor);
    m_lpD3DFont->DrawText(NULL, Text, -1, &r, DT_CENTER, TextColor);
}


void CDirect3D::BeginScene(void)
{
    m_lpD3DDevice->Clear(0, 0,
                        D3DCLEAR_TARGET,
                        m_ClearColor,
                        0, 0);

    m_lpD3DDevice->BeginScene();
}


void CDirect3D::DrawIcon(void)
{   
   HRESULT hr;
    if(FAILED(hr = D3DXGetImageInfoFromFile(ICON, &m_SrcInfo)))
    {
        const char* Err = DXGetErrorDescription9(hr);

        DXTRACE_MSG(Err);

        MessageBox(NULL, Err, "D3DXGetImageInfoFromFile", MB_OK);

 
    }


    // Offscreen-Surface anlegen
    m_lpD3DDevice->CreateOffscreenPlainSurface(
                                        m_SrcInfo.Width, 
                                        m_SrcInfo.Height, 
                                        D3DFMT_A8R8G8B8, 
                                        D3DPOOL_DEFAULT,   
                                        &m_lpSurface,     
                                        0);               
    RECT r = { 200, 0, 200 + m_SrcInfo.Width, 0 + m_SrcInfo.Height };

    D3DXLoadSurfaceFromFile(m_lpSurface,   
                            NULL,           
                            NULL,           
                            ICON,       
                            NULL,           
                            D3DX_FILTER_NONE,
                            0,               
                            NULL);

    m_lpD3DDevice->GetBackBuffer(0, 0,
                                 D3DBACKBUFFER_TYPE_MONO,
                                 &m_lpBackBuffer);

    // Offscreen-Surface kopieren
    m_lpD3DDevice->StretchRect(m_lpSurface,
                               NULL,
                               m_lpBackBuffer,
                               &r,
                               D3DTEXF_NONE);

}
void CDirect3D::DrawButA(void)
{   
   HRESULT hr;
    if(FAILED(hr = D3DXGetImageInfoFromFile(BUTTON_A, &m_SrcInfo)))
    {
        const char* Err = DXGetErrorDescription9(hr);

        DXTRACE_MSG(Err);

        MessageBox(NULL, Err, "D3DXGetImageInfoFromFile", MB_OK);

    }


    // Offscreen-Surface anlegen
    m_lpD3DDevice->CreateOffscreenPlainSurface(
                                        m_SrcInfo.Width, 
                                        m_SrcInfo.Height,
                                        D3DFMT_A8R8G8B8,   
                                        D3DPOOL_DEFAULT, 
                                        &m_lpSurface,     
                                        0);               
    RECT r = { 100, 400, 100 + m_SrcInfo.Width, 400 + m_SrcInfo.Height };

    D3DXLoadSurfaceFromFile(m_lpSurface,
                            NULL,     
                            NULL,       
                            BUTTON_A,
                            NULL,           
                            D3DX_FILTER_NONE,
                            0,               
                            NULL);

    m_lpD3DDevice->GetBackBuffer(0, 0,
                                 D3DBACKBUFFER_TYPE_MONO,
                                 &m_lpBackBuffer);

    // Offscreen-Surface kopieren
    m_lpD3DDevice->StretchRect(m_lpSurface,
                               NULL,
                               m_lpBackBuffer,
                               &r,
                               D3DTEXF_NONE);

}
void CDirect3D::DrawButB(void)
{   
   HRESULT hr;
    if(FAILED(hr = D3DXGetImageInfoFromFile(BUTTON_B, &m_SrcInfo)))
    {
        const char* Err = DXGetErrorDescription9(hr);

        DXTRACE_MSG(Err);

        MessageBox(NULL, Err, "D3DXGetImageInfoFromFile", MB_OK);
    }


   
    m_lpD3DDevice->CreateOffscreenPlainSurface(
                                        m_SrcInfo.Width, 
                                        m_SrcInfo.Height, 
                                        D3DFMT_A8R8G8B8,   
                                        D3DPOOL_DEFAULT,   
                                        &m_lpSurface,     
                                        0);               
    RECT r = { 250, 400, 250 + m_SrcInfo.Width, 400 + m_SrcInfo.Height };

    D3DXLoadSurfaceFromFile(m_lpSurface,     
                            NULL,           
                            NULL,           
                            BUTTON_B,       
                            NULL,             
                            D3DX_FILTER_NONE,
                            0,               
                            NULL);

    m_lpD3DDevice->GetBackBuffer(0, 0,
                                 D3DBACKBUFFER_TYPE_MONO,
                                 &m_lpBackBuffer);

    // Offscreen-Surface kopieren
    m_lpD3DDevice->StretchRect(m_lpSurface,
                               NULL,
                               m_lpBackBuffer,
                               &r,
                               D3DTEXF_NONE);

}
void CDirect3D::DrawButC(void)
{   
   HRESULT hr;
    if(FAILED(hr = D3DXGetImageInfoFromFile(BUTTON_C, &m_SrcInfo)))
    {
        const char* Err = DXGetErrorDescription9(hr);

        DXTRACE_MSG(Err);

        MessageBox(NULL, Err, "D3DXGetImageInfoFromFile", MB_OK);;
    }


    // Offscreen-Surface anlegen
    m_lpD3DDevice->CreateOffscreenPlainSurface(
                                        m_SrcInfo.Width,   
                                        m_SrcInfo.Height, 
                                        D3DFMT_A8R8G8B8, 
                                        D3DPOOL_DEFAULT,   
                                        &m_lpSurface,     
                                        0);               
    RECT r = { 400, 400, 400 + m_SrcInfo.Width, 400 + m_SrcInfo.Height };

    D3DXLoadSurfaceFromFile(m_lpSurface,     
                            NULL,             
                            NULL,             
                            BUTTON_C,       
                            NULL,             
                            D3DX_FILTER_NONE,
                            0,               
                            NULL);

    m_lpD3DDevice->GetBackBuffer(0, 0,
                                 D3DBACKBUFFER_TYPE_MONO,
                                 &m_lpBackBuffer);

    // Offscreen-Surface kopieren
    m_lpD3DDevice->StretchRect(m_lpSurface,
                               NULL,
                               m_lpBackBuffer,
                               &r,
                               D3DTEXF_NONE);

}
void CDirect3D::EndScene(void)
{
    m_lpD3DDevice->EndScene();

    m_lpD3DDevice->Present(0, 0, 0, 0);
}

// Erzeugen der D3D-Schrift
void CDirect3D::CreateFont(void)
{
    D3DXFONT_DESC FontDesc = { 0 };
    strcpy_s(FontDesc.FaceName, "Arial");
    D3DXCreateFontIndirect(m_lpD3DDevice,
                           &FontDesc,
                           &m_lpD3DFont);
}

// Freigeben der Objekte
void CDirect3D::CleanUp(void)
{
    if(NULL != m_lpSurface)
    {
        m_lpSurface->Release();
        m_lpSurface = NULL;
    }

    if(NULL != m_lpD3DFont)
    {
        m_lpD3DFont->Release();
        m_lpD3DFont = NULL;
    }

    if(NULL != m_lpBackBuffer)
    {
        m_lpBackBuffer->Release();
        m_lpBackBuffer = NULL;
    }

    if(NULL != m_lpD3DDevice)
    {
        m_lpD3DDevice->Release();
        m_lpD3DDevice = NULL;
    }

    if(NULL != m_lpD3D)
    {
        m_lpD3D->Release();
        m_lpD3D = NULL;
    }
}

Global.h:
CPP:
const int SCR_WIDTH  = 800;
const int SCR_HEIGHT = 600;

Test.cpp
CPP:
#include "Direct3D.h"


HWND CreateMainWindow(HINSTANCE hInstance);
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
HWND hWnd = 0;
CDirect3D Direct3D;


int WINAPI WinMain(HINSTANCE hInstance,     
                   HINSTANCE hPrevInstance, 
                   LPSTR lpCmdLine,         
                   int nCmdShow)             
{
    hWnd = CreateMainWindow(hInstance);
    if(0 == hWnd)
    {
        MessageBox(0, "Fenster konnte nicht erzeugt werden", "Fehler", MB_OK);
        return -1;
    }

    // Direct3D initialisieren
    if(!Direct3D.Init(hWnd,FALSE))
    {
        MessageBox(0 , "Fehler beim Initialisieren von Direct3D", "Fehler", MB_OK);
        return -1;
    }
    Direct3D.SetClearColor(D3DCOLOR_XRGB(16, 3, 189));

    MSG msg;

    while(GetMessage(&msg, NULL, 0, 0))
   {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

HWND CreateMainWindow(HINSTANCE hInstance)
{
    WNDCLASSEX wndClass =
    {
        sizeof(WNDCLASSEX),                             
        CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,   
        MessageHandler,                                     
        0,                                                 
        0,                                                 
        hInstance,                                         
        LoadIcon(NULL, IDI_WINLOGO),                       
        LoadCursor(NULL, IDC_ARROW),                       
        (HBRUSH)GetStockObject(WHITE_BRUSH),               
        NULL,                                             
        "WindowClass",                                     
        LoadIcon(NULL, IDI_WINLOGO)                       
    };

    // Klasse registrieren
    RegisterClassEx(&wndClass);

    return CreateWindowEx(NULL,                 
                          "WindowClass",         
                          "Test",   
                          WS_OVERLAPPEDWINDOW | 
                          WS_VISIBLE,           
                          50, 50,               
                          SCR_WIDTH, SCR_HEIGHT,
                          NULL,                   
                          NULL,                 
                          hInstance,             
                          NULL);                 
}

LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    D3DCOLOR ClearColor = D3DCOLOR_XRGB(0, 0, 0xFF);

    switch(msg)
    {
        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
             break;

        case WM_KEYDOWN:
               switch(wParam)
               {
                 case VK_ESCAPE:
                         DestroyWindow(hWnd);
                 break;
               }
             break;

        case WM_PAINT:
                Direct3D.BeginScene();

                Direct3D.DrawIcon();

                Direct3D.DrawButA();
            Direct3D.DrawButB();
            Direct3D.DrawButC();
                Direct3D.EndScene();

             break;
    }

    return DefWindowProc(hwnd, msg, wParam, lParam);
}

Und hier die Stelle in Assembler:
Code:

7C91122E  nop             
7C91122F  nop             
7C911230  int         3   //Haltepunkt
7C911231  ret             
7C911232  mov         edi,edi

Danke im Vorraus
Smile
_________________
http://gtsp.gt.funpic.de
NEU: http://gtspforum.gt.funpic.de - das dazugehörige board
ProjectX for PSP - Jetzt runterladen!!
unter http://www.pspsource.de/news.php?extend.4537
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 35
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 17.03.2008, 14:04    Titel: Antworten mit Zitat

Ähm, kann es sein dass du immer wieder aufs neue ein Surface mit dem Pointer m_lpSurface anlegst, diese dann aber nicht mehr freigibst, bevor du die nächste surface mit dem selben pointer anlegst.

Verwende entweder 4 Surfacepointer bzw. LPDIRECT3DSURFACE9 oder release dein LPDIRECT3DSURFACE9 bevor du es wieder mit einer neuen Bitmap füllst. So bekommst du afaik ein ziemlich großes Memmoryleak, wenn du ein paar Rendervorgänge ausführst.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
C++progging
Senior JLI'ler


Alter: 30
Anmeldedatum: 03.10.2005
Beiträge: 244
Wohnort: Sauerland
Medaillen: Keine

BeitragVerfasst am: 17.03.2008, 18:04    Titel: Antworten mit Zitat

Hmmm...
Dieses Problem hält sich immer noch.Das Programm lässt
sich problemlos ausführen und erzeugt trotzdem den Haltepunkt
beim Disassembly. Wenn ich die Funktionsaufrufe
CPP:
Direct3D.DrawIcon();
Direct3D.DrawButA();
Direct3D.DrawButB();
Direct3D.DrawButC();

mit // ausklammere funzt es ohne Haltepunkt. Vielleicht ein Speicherfehler?
_________________
http://gtsp.gt.funpic.de
NEU: http://gtspforum.gt.funpic.de - das dazugehörige board
ProjectX for PSP - Jetzt runterladen!!
unter http://www.pspsource.de/news.php?extend.4537
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 17.03.2008, 19:14    Titel: Antworten mit Zitat

Zeig doch mal, wie/wo du die entsprechenden Ressourcen wieder freigibst.
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
C++progging
Senior JLI'ler


Alter: 30
Anmeldedatum: 03.10.2005
Beiträge: 244
Wohnort: Sauerland
Medaillen: Keine

BeitragVerfasst am: 17.03.2008, 20:00    Titel: Antworten mit Zitat

Jetzt Klappts!!
Die Draw-Funktionen schaun jetzt so aus:
CPP:
void CDirect3D::DrawIcon(void)
{   
   HRESULT hr;
    if(FAILED(hr = D3DXGetImageInfoFromFile(ICON, &m_SrcInfo)))
    {
        const char* Err = DXGetErrorDescription9(hr);

        DXTRACE_MSG(Err);

        MessageBox(NULL, Err, "D3DXGetImageInfoFromFile", MB_OK);

 
    }


    // Offscreen-Surface anlegen
    m_lpD3DDevice->CreateOffscreenPlainSurface(
                                        m_SrcInfo.Width, 
                                        m_SrcInfo.Height, 
                                        D3DFMT_A8R8G8B8, 
                                        D3DPOOL_DEFAULT,   
                                        &m_lpSurface,     
                                        0);               
    RECT r = { 200, 0, 200 + m_SrcInfo.Width, 0 + m_SrcInfo.Height };

    D3DXLoadSurfaceFromFile(m_lpSurface,   
                            NULL,           
                            NULL,           
                            ICON,       
                            NULL,           
                            D3DX_FILTER_NONE,
                            0,               
                            NULL);

    m_lpD3DDevice->GetBackBuffer(0, 0,
                                 D3DBACKBUFFER_TYPE_MONO,
                                 &m_lpBackBuffer);

    // Offscreen-Surface kopieren
    m_lpD3DDevice->StretchRect(m_lpSurface,
                               NULL,
                               m_lpBackBuffer,
                               &r,
                               D3DTEXF_NONE);

   m_lpSurface->Release();
   m_lpSurface = NULL;
   m_lpBackBuffer->Release();//Neu
   m_lpBackBuffer = NULL;  //Neu
// Genau dasselbe mit DrawButA-C
}


Hab jeweils am ende der Draw-Funktionen zuerst nur den Surface
freigegeben. Das hatte aber anscheinend nicht die Wurzel beseitigt
dann habe ich in jeder Draw-Funktion auch den BackBuffer freigegeben
Dann hats geklappt
THANKS!
_________________
http://gtsp.gt.funpic.de
NEU: http://gtspforum.gt.funpic.de - das dazugehörige board
ProjectX for PSP - Jetzt runterladen!!
unter http://www.pspsource.de/news.php?extend.4537
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum