Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Phili

unregistriert

1

07.08.2006, 14:35

Schwerwiegender Fehler in der Initialisiereng?

Irgendwie glaub ichs nicht mehr. Jetzt prog ich schon so lange mit DX und doch kann einen die Initialisierung immer wieder wahnsinnig machen.folgender Code funktioniert bei mir einwandfrei, scheint aber bei allen, die keine 6600GT im PC haben abzustürzen :cry:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#ifndef _PH3DDEVICE_
#define _PH3DDEVICE_
#include <windows.h>
#include <D3D9.h>
using namespace std;

class PH3DDevice
{
public:
    IDirect3DDevice9 *D3DDev;
    D3DPRESENT_PARAMETERS pp;
    void Init();
    void Exit();
};
void PH3DDevice::Init()
{
    WNDCLASSEX wndclassex = {sizeof(WNDCLASSEX), CS_CLASSDC, DefWindowProc, 
        0, 0, NULL, NULL, NULL, NULL, NULL, L"Philip", NULL};
    RegisterClassEx(&wndclassex);
    HWND hwnd=CreateWindowEx(NULL, L"Philip", L"Philips Prog", WS_VISIBLE|WS_OVERLAPPEDWINDOW, 
        0, 0, 10, 10, NULL, NULL, NULL, NULL);
    IDirect3D9 *D3D=Direct3DCreate9(D3D_SDK_VERSION);

    pp.BackBufferWidth=1024;
    pp.BackBufferHeight=768;
    pp.BackBufferCount=2;
    if(!D3D->CheckDeviceFormat(NULL, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, D3DFMT_X8R8G8B8))
        pp.BackBufferFormat=D3DFMT_X8R8G8B8;
    else 
        if(!D3D->CheckDeviceFormat(NULL, D3DDEVTYPE_HAL, D3DFMT_X1R5G5B5, D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, D3DFMT_X1R5G5B5))
            pp.BackBufferFormat=D3DFMT_X1R5G5B5;
        else
            if(!D3D->CheckDeviceFormat(NULL, D3DDEVTYPE_HAL, D3DFMT_R5G6B5, D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, D3DFMT_R5G6B5))
                pp.BackBufferFormat=D3DFMT_R5G6B5;
    pp.EnableAutoDepthStencil=TRUE;
    if(!D3D->CheckDeviceFormat(NULL, D3DDEVTYPE_HAL, pp.BackBufferFormat, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D32))
        pp.AutoDepthStencilFormat=D3DFMT_D32;
    else
        if(!D3D->CheckDeviceFormat(NULL, D3DDEVTYPE_HAL, pp.BackBufferFormat, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D24S8))
            pp.AutoDepthStencilFormat=D3DFMT_D24S8;
        else
            if(!D3D->CheckDeviceFormat(NULL, D3DDEVTYPE_HAL, pp.BackBufferFormat, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16))
                pp.AutoDepthStencilFormat=D3DFMT_D16;
    pp.FullScreen_RefreshRateInHz=NULL;
    pp.hDeviceWindow=hwnd;
    if(!D3D->CheckDeviceMultiSampleType(NULL, D3DDEVTYPE_HAL, pp.BackBufferFormat, NULL, D3DMULTISAMPLE_16_SAMPLES, NULL))
        pp.MultiSampleType=D3DMULTISAMPLE_16_SAMPLES;
    else 
        if(!D3D->CheckDeviceMultiSampleType(NULL, D3DDEVTYPE_HAL, pp.BackBufferFormat, NULL, D3DMULTISAMPLE_8_SAMPLES, NULL))
            pp.MultiSampleType=D3DMULTISAMPLE_8_SAMPLES;
        else 
            if(!D3D->CheckDeviceMultiSampleType(NULL, D3DDEVTYPE_HAL, pp.BackBufferFormat, NULL, D3DMULTISAMPLE_4_SAMPLES, NULL))
                pp.MultiSampleType=D3DMULTISAMPLE_4_SAMPLES;
            else 
                if(!D3D->CheckDeviceMultiSampleType(NULL, D3DDEVTYPE_HAL, pp.BackBufferFormat, NULL, D3DMULTISAMPLE_2_SAMPLES, NULL))
                    pp.MultiSampleType=D3DMULTISAMPLE_2_SAMPLES;
                else
                    if(!D3D->CheckDeviceMultiSampleType(NULL, D3DDEVTYPE_HAL, pp.BackBufferFormat, NULL, D3DMULTISAMPLE_NONE, NULL))
                        pp.MultiSampleType=D3DMULTISAMPLE_NONE;
    pp.MultiSampleQuality=NULL;
    pp.SwapEffect=D3DSWAPEFFECT_DISCARD;
    pp.PresentationInterval=NULL;
    pp.Windowed=NULL;
    pp.Flags=NULL;
    
    if(D3D->CreateDevice(NULL, D3DDEVTYPE_HAL, hwnd, 
        D3DCREATE_MIXED_VERTEXPROCESSING, &pp, &D3DDev))
    {
        pp.BackBufferWidth=800;
        pp.BackBufferHeight=600;
        if(D3D->CreateDevice(NULL, D3DDEVTYPE_HAL, hwnd, 
            D3DCREATE_MIXED_VERTEXPROCESSING, &pp, &D3DDev))
        {
            pp.BackBufferWidth=640;
            pp.BackBufferHeight=480;
            iD3D->CreateDevice(NULL, D3DDEVTYPE_HAL, hwnd, 
                D3DCREATE_MIXED_VERTEXPROCESSING, &pp, &D3DDev);
        }
    }
}
void PH3DDevice::Exit()
{
    D3DDev->Release();
}
PH3DDevice PH3DDev;

#endif


Seht ihr da irgendwo einen(oder auch mehrere) Fehler?

Anonymous

unregistriert

2

07.08.2006, 14:39

Einmal vorab: Grauenvoller Code, sehr schwer zu lesen und zu verstehen.

Fehlende Sicherheitsabfrage, alles total lieblos zusammen gequetscht und total unübersichtlich.

Lesen, lernen, staunen, verstehen:
http://old.germangamedev.de/index.php?site=article&id=4

Stefan

Alter Hase

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

3

07.08.2006, 14:40

Konstruktor fehlt, würde D3DDev usw. auf NULL setzen.
Für meinen Laptop muss ich immer alle Pointer im Konstruktor auf NULL setzen sonst stürzt er gerne ab, auf meinem Standpc läuft es aber trozdem immer...


cya,
Stefan

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

07.08.2006, 14:42

Das ist ja grausig.
Und du verwendest NULL, wo eigentlich eine normale 0 hin sollte.
NULL verwendet man eigentlich nur bei Zeigern. Es macht zwar keinen Unterschied (weil NULL als 0 definiert ist), aber wozu andere verwirren und 4 Zeichen schreiben, wenn eines reicht?

flux

Treue Seele

  • Private Nachricht senden

5

07.08.2006, 14:53

Ich muss den anderen zustimmen. Ich wollte in etwa das Gleiche schrieben, bin immer zu langsam. Aber ich hab noch was gesehen: Vielleicht unterstüzt nicht jede GraKa VertexProcessing. Eine Abfrage der D3DCAPS hilft da. Und vllt mal vernünftig aufräumen. Da krieg ich als erfahrener Anfänger ja schon äähh... egal :lol:

Überarbeite das mal und guck dir die Tutorials von Patrick an. Die sind wirklich sehr gut. Jetzt versteh ich auch, warum dein Testprogramm aus dem Tutorial so hässlich abgestürzt ist -> Neu booten. Dass du dann in deinen Tutorials keine Fehlerabfragen hast ist mir dann auch klar.

Phili

unregistriert

6

07.08.2006, 15:05

Eure Meinung, dass mein Code schwer zu lesen und unübersichtlich ist wird daran liegen, dass er zu breit geschrieben ist und deswegen in meinem Beitrag nicht richtig dargestellt wird. Ich hebe Davids Voschlag allerdings beherzigt-ich hatte wirklich manchmal unsinnige Verwendungen für NULL.
Am eigentlichen Code ändert das allerdings nichts...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
class PH3DDevice
{
public:
    IDirect3DDevice9 *D3DDev;
    D3DPRESENT_PARAMETERS pp;
    void Init();
    void Exit();
};
void PH3DDevice::Init()
{
    WNDCLASSEX wndclassex = {sizeof(WNDCLASSEX), CS_CLASSDC, DefWindowProc, 
        0, 0, NULL, NULL, NULL, NULL, NULL, L"Philip", NULL};
    RegisterClassEx(&wndclassex);
    HWND hwnd=CreateWindowEx(NULL, L"Philip", L"Philips Prog", WS_VISIBLE|WS_OVERLAPPEDWINDOW, 
        0, 0, 10, 10, NULL, NULL, NULL, NULL);
    IDirect3D9 *D3D=Direct3DCreate9(D3D_SDK_VERSION);

    pp.BackBufferWidth=1024;
    pp.BackBufferHeight=768;
    pp.BackBufferCount=2;
    if(!D3D->CheckDeviceFormat(NULL, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, 
        D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, D3DFMT_X8R8G8B8))
        pp.BackBufferFormat=D3DFMT_X8R8G8B8;
    else 
        if(!D3D->CheckDeviceFormat(NULL, D3DDEVTYPE_HAL, D3DFMT_X1R5G5B5, 
            D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, D3DFMT_X1R5G5B5))
            pp.BackBufferFormat=D3DFMT_X1R5G5B5;
        else
            if(!D3D->CheckDeviceFormat(NULL, D3DDEVTYPE_HAL, D3DFMT_R5G6B5, 
                D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, D3DFMT_R5G6B5))
                pp.BackBufferFormat=D3DFMT_R5G6B5;
    pp.EnableAutoDepthStencil=TRUE;
    if(!D3D->CheckDeviceFormat(NULL, D3DDEVTYPE_HAL, pp.BackBufferFormat, 
        D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D32))
        pp.AutoDepthStencilFormat=D3DFMT_D32;
    else
        if(!D3D->CheckDeviceFormat(NULL, D3DDEVTYPE_HAL, pp.BackBufferFormat, 
            D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D24S8))
            pp.AutoDepthStencilFormat=D3DFMT_D24S8;
        else
            if(!D3D->CheckDeviceFormat(NULL, D3DDEVTYPE_HAL, pp.BackBufferFormat, 
                D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16))
                pp.AutoDepthStencilFormat=D3DFMT_D16;
    pp.FullScreen_RefreshRateInHz=NULL;
    pp.hDeviceWindow=hwnd;
    if(!D3D->CheckDeviceMultiSampleType(NULL, D3DDEVTYPE_HAL, pp.BackBufferFormat, 
        FALSE, D3DMULTISAMPLE_16_SAMPLES, 0))
        pp.MultiSampleType=D3DMULTISAMPLE_16_SAMPLES;
    else 
        if(!D3D->CheckDeviceMultiSampleType(NULL, D3DDEVTYPE_HAL, pp.BackBufferFormat, 
            FALSE, D3DMULTISAMPLE_8_SAMPLES, 0))
            pp.MultiSampleType=D3DMULTISAMPLE_8_SAMPLES;
        else 
            if(!D3D->CheckDeviceMultiSampleType(NULL, D3DDEVTYPE_HAL, pp.BackBufferFormat, 
                FALSE, D3DMULTISAMPLE_4_SAMPLES, 0))
                pp.MultiSampleType=D3DMULTISAMPLE_4_SAMPLES;
            else 
                if(!D3D->CheckDeviceMultiSampleType(NULL, D3DDEVTYPE_HAL, pp.BackBufferFormat, 
                    FALSE, D3DMULTISAMPLE_2_SAMPLES, 0))
                    pp.MultiSampleType=D3DMULTISAMPLE_2_SAMPLES;
                else
                    if(!D3D->CheckDeviceMultiSampleType(NULL, D3DDEVTYPE_HAL, pp.BackBufferFormat, 
                        FALSE, D3DMULTISAMPLE_NONE, 0))
                        pp.MultiSampleType=D3DMULTISAMPLE_NONE;
    pp.MultiSampleQuality=NULL;
    pp.SwapEffect=D3DSWAPEFFECT_DISCARD;
    pp.PresentationInterval=NULL;
    pp.Windowed=NULL;
    pp.Flags=NULL;
    
    if(D3D->CreateDevice(NULL, D3DDEVTYPE_HAL, hwnd, 
        D3DCREATE_MIXED_VERTEXPROCESSING, &pp, &D3DDev))
    {
        pp.BackBufferWidth=800;
        pp.BackBufferHeight=600;
        if(D3D->CreateDevice(NULL, D3DDEVTYPE_HAL, hwnd, 
            D3DCREATE_MIXED_VERTEXPROCESSING, &pp, &D3DDev))
        {
            pp.BackBufferWidth=640;
            pp.BackBufferHeight=480;
            D3D->CreateDevice(NULL, D3DDEVTYPE_HAL, hwnd, 
                D3DCREATE_MIXED_VERTEXPROCESSING, &pp, &D3DDev);
        }
    }
        D3D->Release();
}
void PH3DDevice::Exit()
{
    D3DDev->Release();
}

Anonymous

unregistriert

7

07.08.2006, 15:13

Den Code guckt sich keiner freiwillig an! Nicht mal ich, und ich guck mir vieles an!

Diese extreme If-Verschwachtelung ist ein Witz. Der Code ist eine Gefahr für jeden Computer, da er keine Sicherheitsabfragen beinhaltet und keinerlei Logik aufweist!

Nimm es mir nicht übel, wenn ich das jetzt sage - aber: Lern bitte Anständig Coden und bau nicht so einen Murks! Und wenn man schon viele Formate testen will, dann mact man das sicherlich nicht so!

Ich weigere mich richtig diesen Code weiterhin zu betrachten!

Phili

unregistriert

8

07.08.2006, 15:20

@nix da
Sag mir eins: funktionieren diese if-Verschachtelungen? Wenn ja, dann seh ich keinerlei Änderungsbedarf, weil man das meiner Meinung nach nciht praktischer oder übersichtlicher gestalten kann. Wenn nein, dann sag mir, wie man das als "pro" mach, ok.

Anonymous

unregistriert

9

07.08.2006, 15:26

Phili
Ich wage zu bezweifeln das an diesem Code überhaupt etwas Funktioniert!

Du Testest weder:
- Ob ein Fenster erstellt wurde
- Ob Direct3D vorhanden ist
- Ob das Object erzeugt wurde
- Ob das Device erzeugt wurde
- Ob die Auflösung möglich ist
- Ob Daten existieren
und überhaupt! Du greifst auf Zeiger zu die nicht mal existent sein könnten - daher auch der Absturz.

Wenn Du es wie ein Pro machen willst dann folgende Grundsätze:
- Fehlerabfragen (Hätte den Topic hier erspart)
- Variablen INITIALISIEREN!!!!!!! Wenn ich sowas schon sehe. Argh.
- Sinnvoll Coden (Anstatt wie verrückt CheckDevice zu machen: IDirect3D9::EnumAdapterModes Method)

Sorry, so wie der Code aktuell ist, ist dies wie Perlen vor die Säue geworfen.

Außerdem habe ich einen Link gepostet wie man Anständig Coden kann! Selbst Flux sagt gutes darüber und er ist bekannterweise sehr Kritisch solchen Sachen gegenüber.

flux

Treue Seele

  • Private Nachricht senden

10

07.08.2006, 15:26

Also das ist wirklich super unsicher. Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
pp.BackBufferWidth=1024;
    pp.BackBufferHeight=768;
    pp.BackBufferCount=2;
    if(!D3D->CheckDeviceFormat(NULL, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8,
        D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, D3DFMT_X8R8G8B8))
        pp.BackBufferFormat=D3DFMT_X8R8G8B8;
    else
        if(!D3D->CheckDeviceFormat(NULL, D3DDEVTYPE_HAL, D3DFMT_X1R5G5B5,
            D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, D3DFMT_X1R5G5B5))
            pp.BackBufferFormat=D3DFMT_X1R5G5B5;
        else
            if(!D3D->CheckDeviceFormat(NULL, D3DDEVTYPE_HAL, D3DFMT_R5G6B5,
                D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, D3DFMT_R5G6B5))
                pp.BackBufferFormat=D3DFMT_R5G6B5; 

pp ist nicht initialisiert und im Konstruktor wirds wohl auch nicht gemacht, weil du keinen hast. Welchen Wert hat dann pp.BackBufferFormat, wenn alle 3 if-Alternativen fehlschlagen?...

Werbeanzeige