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

Der Dude

Treue Seele

  • »Der Dude« ist der Autor dieses Themas

Beiträge: 73

Wohnort: Elleringhausen-City

Beruf: ITA

  • Private Nachricht senden

1

13.08.2005, 15:30

Vollbildmodus ist kapput

Aloa,

ich habe ein Fenster erstellt und auch das Device erstellt. Leider kommt immer eine Exception, wenn ich den Vollbildmodus nutze. Im Fenstermodus ist alles ok.
Folgenden Source habe ich:

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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
public Form1()
        {
            this.ClientSize = new System.Drawing.Size(1024, 768);
            InitPresentParameters();
           

            //Cube

            System.Drawing.Color[] Colors = new System.Drawing.Color[6];
            Colors[0] = System.Drawing.Color.Green;
            Colors[1] = System.Drawing.Color.Red;
            Colors[2] = System.Drawing.Color.Purple;
            Colors[3] = System.Drawing.Color.Silver;
            Colors[4] = System.Drawing.Color.Snow;
            Colors[5] = System.Drawing.Color.Violet;
            c1 = new Cube(50, 50, 50, 50, 50, 50, Colors, m_Device);

            InitializeComponent();
        }

        private void InitDevice()
        {
        }

        private void InitPresentParameters()
        {
            m_PresentParameters = new PresentParameters();
            m_PresentParameters.Windowed = true;
            m_PresentParameters.SwapEffect = SwapEffect.Discard;


            //

            // For each adapter, examine all of its display modes to see if any 

            // of them can give us the hardware support we desire.

            //


            bool desiredAdapterModeFound = false;

            // For each Adapter...

            foreach (AdapterInformation adapter in Manager.Adapters)
            {
                // Examine each display mode available.

                foreach (DisplayMode display in adapter.SupportedDisplayModes)
                {
                    // Does this adapter mode support a mode of 640 x 480?

                    if (display.Width != 640 || display.Height != 480)
                        continue;

                    // Does this adapter mode support a 32-bit RGB pixel format?

                    if (display.Format != Format.X8R8G8B8)
                        continue;

                    // Does this adapter mode support a refresh rate of 75 MHz?

                    if (display.RefreshRate != 75)
                        continue;

                    // We found a match!

                    desiredAdapterModeFound = true;
                    break;
                }
            }

            if (desiredAdapterModeFound == false)
            {
                // TODO: Handle lack of support for desired adapter mode...

                MessageBox.Show("HELP");
                return;
            }

            //

            // Here's the manual way of verifying hardware support.

            //


            // Can we get a 32-bit back buffer?

            if (!Manager.CheckDeviceType(Manager.Adapters.Default.Adapter,
                                          DeviceType.Hardware,
                                          Format.X8R8G8B8,
                                          Format.X8R8G8B8,
                                          false))
            {
                // TO DO: Handle lack of support for a 32-bit back buffer...

                MessageBox.Show("32 Bit Back Buffer Problem");
                return;
            }

            // Does the hardware support a 16-bit z-buffer?

            if (!Manager.CheckDeviceFormat(Manager.Adapters.Default.Adapter,
                                            DeviceType.Hardware,
                                            Manager.Adapters.Default.CurrentDisplayMode.Format,
                                            Usage.DepthStencil,
                                            ResourceType.Surface,
                                            DepthFormat.D16))
            {
                // POTENTIAL PROBLEM: We need at least a 16-bit z-buffer!

                MessageBox.Show("16 Bit Z buffer Problem");
                return;
            }

            //

            // Do we support hardware vertex processing? if so, use it. 

            // If not, downgrade to software.

            //


            Caps caps = Manager.GetDeviceCaps(Manager.Adapters.Default.Adapter,
                                               DeviceType.Hardware);
            CreateFlags flags;

            if (caps.DeviceCaps.SupportsHardwareTransformAndLight)
                flags = CreateFlags.HardwareVertexProcessing;
            else
                flags = CreateFlags.SoftwareVertexProcessing;

            //

            // Everything checks out - create a simple, full-screen device.

            //


            PresentParameters d3dpp = new PresentParameters();

            m_PresentParameters.Windowed = true;
            m_PresentParameters.EnableAutoDepthStencil = true;
            m_PresentParameters.AutoDepthStencilFormat = DepthFormat.D16;
            m_PresentParameters.SwapEffect = SwapEffect.Discard;
            m_PresentParameters.BackBufferWidth = 640;
            m_PresentParameters.BackBufferHeight = 480;
            m_PresentParameters.BackBufferFormat = Format.X8R8G8B8;
            m_PresentParameters.PresentationInterval = PresentInterval.Immediate;

            m_Device = new Device(0, DeviceType.Hardware, this, flags, m_PresentParameters);

            // Register an event-handler for DeviceReset and call it to continue

            // our setup.

            m_Device.DeviceReset += new System.EventHandler(this.OnResetDevice);
            OnResetDevice(m_Device, null);

            m_mProjection = Matrix.PerspectiveFovLH((float)Math.PI / 4, (float)ClientSize.Width / (float)ClientSize.Height, 1.0f, 100.0f);
            m_Device.SetTransform(TransformType.Projection, m_mProjection);
        }

 private void OnApplicationIdle(object sender, EventArgs e)
        {

            double tstart = 0.0f;
            double tstop = 0.0f;
            double ttime = 0.0f;

            int result;

            while (AppStillIdle)
            {
                tstart = Tools.PerformanceCounter.Time;
              
                if(!m_Device.CheckCooperativeLevel(out result))
                {
                    if(result == (int)ResultCode.DeviceLost) 
                    {
                        // nichts zu machen, warte ein bisschen

                       
                        //Thread.CurrentThread.Sleep(50);

                        continue; // nächste schleife

                    } 
                    else 
                    if(result == (int)ResultCode.DeviceNotReset) 
                    {
                        m_Device.Reset(m_PresentParameters);
                    }
                }
  
                move(ttime);
                try
                {
                    render(ttime);
                }
                catch (DeviceLostException dle)
                {
                }

                tstop = Tools.PerformanceCounter.Time;
                ttime = tstop - tstart;
            } 
        }

        private bool AppStillIdle
        {
            get
            {
                NativeMethods.Message msg;
                return !NativeMethods.PeekMessage(out msg, IntPtr.Zero, 0, 0, 0);
            }
        }



Bin über jede Hilfe sehr dankbar.


MFG
TIM
"Wenn ich morgens doppelt so schnell über den Flur laufe, kann ich 2 Minuten länger schlaften!" - leider war es ein Irrtum.

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

2

13.08.2005, 15:52

Welche Exceptions werden geworfen?
Welche Fehler geben die DirectX-Funktionen zurück?
usw.

Fragen die UNS sehr helfen könnten DEIN Problem SCHNELL und EFFEKTIV lösen zu KÖNNEN. :help:

Der Dude

Treue Seele

  • »Der Dude« ist der Autor dieses Themas

Beiträge: 73

Wohnort: Elleringhausen-City

Beruf: ITA

  • Private Nachricht senden

3

13.08.2005, 16:33

Also in der MainLoop

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
public void MainLoop()
        {
            // Hook the application's idle event

             
                System.Windows.Forms.Application.Idle += new EventHandler(OnApplicationIdle);
                System.Windows.Forms.Application.Run(this);
           
            
        }


Kommt bei der Application.Run(this);

InvalidCallException was unhandled

Microsoft.DirectX.Direct3D.InvalidCallException:

{"Error in the application."}


Ich vermute das hilft nicht wirklich weiter :(

MFG
TIM
"Wenn ich morgens doppelt so schnell über den Flur laufe, kann ich 2 Minuten länger schlaften!" - leider war es ein Irrtum.

4

23.06.2006, 17:18

Ich hab einfach mal diesen alten Thread, weil ich gerade das gleiche Problem hab. Es geht irgendwie um die "neuste" MessageLoop von Tom Miller. Hab meinen TFT mit der nativen Auflösung von 1280 x 1024 laufen, wenn ich dann der Fullscreenmodus in einem anderen Seitenverhältnis (bspw. 1024 x 768) laufen hab. Schmeißt der die schon genannte Exception. Der Stacktrace sagt, dass sie in der Device.Resize()-Methode von D3D geschmissen wird.

Aber keine Ahnung warum.

mfg
Bobba

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

23.06.2006, 17:31

Re: Vollbildmodus ist kapput

Zitat von »"Der Dude"«

C-/C++-Quelltext

1
2
3
                    // Does this adapter mode support a refresh rate of 75 MHz?

                    if (display.RefreshRate != 75)
                        continue;

75 MHz... den Monitor würde ich gerne mal sehen :D

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

24.06.2006, 01:50

Tjaja....eine vernünftige Initialisierung der Parameter ist die halbe Miete :). Nicht um sonst kann man alle Unterstützen Formate abfragen ;).
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

7

24.06.2006, 21:18

Okay.. ich habe nicht den Code vom Dude, sondern eine sehr abgespeckte, meines Erachtens fehlerfreie Version. Die Tatsache, die mich besonders Stutzig macht ist, dass das Programm nicht immer abstürzt sondern "nur" ungefähr jedes dritte mal. Und auch das nur im Fullscreen mit einem anderen Seitenverhältnis als dem, was ich als Desktopresolution eingestellt hab.

Beispiel:
Desktopres: 1280 x 1024
Gameres: 1280 x 1024
=> Ohne Fehler

Desktopres: 1024 x 768
Gameres: 1024 x 768 oder 800 x 600
=> Ohne Fehler

Desktopres: 1280 x 1024
Gameres: 1024 x 768 oder 800 x 600
=> Das Prgramm stürzt ÖFTERS aber nicht immer(!!!) ab

Aber hier mal mein Init-Code

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
pParams = new D3D.PresentParameters();
pParams.Windowed = isWindowed;
pParams.SwapEffect = D3D.SwapEffect.Discard;

pParams.BackBufferWidth = window.ClientSize.Width;
pParams.BackBufferHeight = window.ClientSize.Height;

pParams.BackBufferFormat = D3D.Manager.Adapters.Default.CurrentDisplayMode.Format;
                
if (!isWindowed)
    pParams.PresentationInterval = D3D.PresentInterval.Immediate;

device = new D3D.Device(0, D3D.DeviceType.Hardware, window, D3D.CreateFlags.SoftwareVertexProcessing, pParams);
EventHandler(OnDeviceReset);


Also nichts außergewöhnliches

mfg
Bobba

john

Alter Hase

Beiträge: 786

Beruf: Schüler

  • Private Nachricht senden

8

24.06.2006, 21:29

Abrexxes
Verlesen ?^^ "Missverständnis" ..
mfg
john

9

25.06.2006, 14:34

Hmm ich denke, dass ich eine Lösung gefunden habe.
Mann muss nur den Device.Resize-Eventhandler ausschalten.

nach der Deviceerstellung

C-/C++-Quelltext

1
device.DeviceResizing += new CancelEventHandler(this.CancelResize);


Eventhandler:

C-/C++-Quelltext

1
2
3
4
protected void CancelResize(object sender, CancelEventArgs e)
{
    e.Cancel = true;
}


mfg
Bobba

[EDIT]
Zumindest dachte ich das. Es hat sich schon verbessert, allerdings stürzt das Programm doch noch ab und zu ab. Das schlimme dabei: Der Bug ist nicht wirklich reproduzierbar. Er tritt nicht regelmäßig auf. Ich kann das Programm starten und beim nächsten, ohne etwas verändert zu haben, mal stürzt es ab.

*ratlos sei*

10

25.06.2006, 16:53

[gelöst]Fullscreenmodus kaputt

Das obere Canceln des Devicehandlers isses doch. :)
Warum mein Programm jetzt abstürzt hat andere Ursachen. :(

mfg
Bobba

Werbeanzeige