 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
C++progging Senior JLI'ler

Alter: 31 Anmeldedatum: 03.10.2005 Beiträge: 244 Wohnort: Sauerland Medaillen: Keine
|
Verfasst am: 17.03.2008, 13:24 Titel: Problem mit SurfaceLoading |
|
|
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
 _________________ 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 |
|
 |
Otscho Super JLI'ler

Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 17.03.2008, 14:04 Titel: |
|
|
Ä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 |
|
 |
C++progging Senior JLI'ler

Alter: 31 Anmeldedatum: 03.10.2005 Beiträge: 244 Wohnort: Sauerland Medaillen: Keine
|
Verfasst am: 17.03.2008, 18:04 Titel: |
|
|
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 |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 17.03.2008, 19:14 Titel: |
|
|
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 |
|
 |
C++progging Senior JLI'ler

Alter: 31 Anmeldedatum: 03.10.2005 Beiträge: 244 Wohnort: Sauerland Medaillen: Keine
|
Verfasst am: 17.03.2008, 20:00 Titel: |
|
|
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 |
|
 |
|
|
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
|