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

Jonsen

Frischling

  • »Jonsen« ist der Autor dieses Themas

Beiträge: 36

Wohnort: Unter der Brücke

  • Private Nachricht senden

1

12.05.2009, 19:18

DirectX: nach neuinitialisierung weißes Menü

Hallo

Da hab ich so eine Art Profilmanagement in Galactica eingebaut, also dass man mehrere Profile erstellen kann und jedes hat eigene DirectX-Einstellungen.

Bei Wechsel zu einem anderen Profil wird dieses übernommen, in dem das hier aufgerufen wird:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Führt die DX-Einstellungen des Profils ein
tbResult cGalactica::RefreshProfile()
{
    tbConfig config = Profile_Profile2tbConfig(m_ActiveProfile);

    // Herunterfahren
    tbDirect3D::Instance().Exit();
    tbDirectSound::Instance().Exit();

    // Neustarten
    if(tbDirect3D::Instance().Init(&config, APP_NAME))
    {
        TB_ERROR("Initialisieren von Direct3D fehlgeschlagen!", TB_ERROR);
    }

    if(tbDirectSound::Instance().Init(&config))
    {
        TB_ERROR("Initialisieren von DirectSound fehlgeschlagen!", TB_ERROR);
    }

    return TB_OK;
}


So, DirectSound funktioniert perfekt.
Direct3D liefert aber im Hauptmenü (im Spiel noch nicht ausprobiert, da Cursor nicht mehr sichtbar!) einen weißen Bildschirm. Musik läuft noch und gerendert wird auch munter vor sich hin.

-> Kann mir einer sagen, warum das so ist?

Vielen Dank im Voraus
Jonsen

PS: Die Funktion wird während MainMenu_GUIMessageProc() aufgerufen!
-=:{( <=> )}:=-

2

12.05.2009, 20:27

Üblicherweise erledigt man das über LostDevice und ResetDevice.

Verwendest du irgendwelche Ressourcen (Texturen etc.), die ebenfalls aktualisiert werden müssen?
fka tm

Jonsen

Frischling

  • »Jonsen« ist der Autor dieses Themas

Beiträge: 36

Wohnort: Unter der Brücke

  • Private Nachricht senden

3

12.05.2009, 21:33

Meinst du sowas wie Avatare? -> Nein!
Alle Bilder sind Profilunabhängig!

-> Habs ausprobiert - jetzt sieht man garnichts mehr :(
Keine Fehler aber auch kein Bild - nur ein Schwarzer Bildschirm mit Musik ...

Was mach ich da Falsch?
Kann es vielleicht sein, dass die Funktion nicht in der MessageProc aufgerufen werden darf?

Neuer Quelltext:

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
tbResult cGalactica::RefreshProfile()
{
    // Direct3D

    tbConfig config = Profile_Profile2tbConfig(m_ActiveProfile);

    D3DPRESENT_PARAMETERS PresentParams     = tbDirect3D::Instance().GetPresentParams();
// Hab die Veränderungen Auskommentiert!

//  PresentParams.BackBufferFormat          = PROFILE.GraphicInfo.Direct3D.BackBufferFormat;

//  PresentParams.BackBufferHeight          = PROFILE.GraphicInfo.Direct3D.Videomodus.Height;

//  PresentParams.BackBufferWidth           = PROFILE.GraphicInfo.Direct3D.Videomodus.Width;

//  PresentParams.FullScreen_RefreshRateInHz= PROFILE.GraphicInfo.Direct3D.Videomodus.RefreshRate;

//  PresentParams.Windowed                  = PROFILE.GraphicInfo.Direct3D.bWindowed;

//  PresentParams.MultiSampleType           = PROFILE.GraphicInfo.Direct3D.MultySamplingType;

//  PresentParams.MultiSampleQuality        = PROFILE.GraphicInfo.Direct3D.dwMultySamplingQuality;

//  PresentParams.Flags                     = PROFILE.GraphicInfo.Direct3D.dwFlags;

//  if(PROFILE.GraphicInfo.Direct3D.bVSync)

//      PresentParams.PresentationInterval  = D3DPRESENT_INTERVAL_ONE;

//  else

//      PresentParams.PresentationInterval  = D3DPRESENT_INTERVAL_IMMEDIATE;

//  PresentParams.EnableAutoDepthStencil    = FALSE;

//  PresentParams.AutoDepthStencilFormat    = PROFILE.GraphicInfo.Direct3D.ZStencilBufferFormat;


    tbDirect3D::Instance()->Reset(&PresentParams);

    // DirectSound

    tbDirectSound::Instance().Exit();
    if(tbDirectSound::Instance().Init(&config))
    {
        TB_ERROR("Initialisieren von DirectSound fehlgeschlagen!", TB_ERROR);
    }

    return TB_OK;
}
-=:{( <=> )}:=-

4

12.05.2009, 21:41

Mit Ressourcen meinte ich, wie schon gesagt, Texturen, Fonts, Vertexbuffer usw..
Irgendwie wirst du das Menü ja darstellen!?
fka tm

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

5

12.05.2009, 23:28

Ich weiß nicht ob das auch bei dieser Art von DeviceLost vorkommt, aber in der Regel kann man ein Lost Device am HRESULT vom Device->Present erkennen.
Das ist in der Regel D3DERR_DEVICELOST.
Wie gesagt, ich weiß nicht ob das auch in so einem Fall passiert, aber kannst den Status ja mal überprüfen.
Ansonsten stimme ich TrikkieMikkie voll zu, klingt nach dem üblichen LostDevice, man muss also fast alles komplett neu initialisieren.

MfG,
MCP

Jonsen

Frischling

  • »Jonsen« ist der Autor dieses Themas

Beiträge: 36

Wohnort: Unter der Brücke

  • Private Nachricht senden

6

13.05.2009, 17:53

Quellcode

1
Der Aufruf von Device->Reset() verursachte den DirectX-Fehler D3DERR_INVALIDCALL! Beschreibung: Invalid call


Hab gelesen, dass InvalidCall durch falsche Parameter ausgelöst wird - Aber ich hole die doch direkt von tbDirect3D ... :(

Ja, ich benutze Texturen, Fonts und einen Vertexbuffer im Hauptmenü und einen Effect zum rendern! (-> tbGUI)
Aber bei DirectSound funktioniert das doch auch, das neustarten - warum muss ich dann bei Direct3D alle Texturen etc neu initialisieren :?:

-> Mach das jetzt aber wieder so, wie am Anfang - nur, dass ich die Graphischen Sachen neu lade - wie ihr gesagt habt ;)
Funktioniert bestens :)

Quellcode

1
2
3
4
5
6
7
8
9
GraphikenLöschen()...
tbTextureManager::Instance().Exit();
tbDirect3D::Instance().Exit();
tbDirect3D::Instance().Init(~);
tbTextureManager::Instance().Init();
GraphikenNeuLaden()...

tbDirectSound::Instance().Exit();
tbDirectSound::Instance().Init(~);


Danke!

mfg
Jonsen
-=:{( <=> )}:=-

7

13.05.2009, 18:36

Zitat von »"Jonsen"«

Ja, ich benutze Texturen, Fonts und einen Vertexbuffer im Hauptmenü und einen Effect zum rendern! (-> tbGUI)
Aber bei DirectSound funktioniert das doch auch, das neustarten - warum muss ich dann bei Direct3D alle Texturen etc neu initialisieren :?


Kommt darauf an, wo die Ressourcen beim Laden abgelegt werden: D3DPOOL_DEFAULT, D3DPOOL_MANAGED usw..

Siehe DX-Doku. ;)


Für Effekte und Fonts sollte ein OnLostDevice und OnResetDevice reichen.
Siehe dazu ebenfalls DX-Doku. ;)
fka tm

Werbeanzeige