JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Backbuffer der Fenstergröße anpassen
Gehe zu Seite Zurück  1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jörg47
Mini JLI'ler



Anmeldedatum: 07.02.2007
Beiträge: 26

Medaillen: Keine

BeitragVerfasst am: 14.06.2007, 18:45    Titel: Antworten mit Zitat

Hi Otschu,

das ist leider kein triviales Problem. Du mußt diese Nachrichten behandel.

WM_ENTERSIZEMOVE:
WM_SIZE:
WM_EXITSIZEMOVE:

Schau Dir die Funktion "HandlePossibleSizeChange();" und den Message Handler der Applikationsbasisklasse im SDK bei z.B. Text3D an.

Das Soiel anhalten, die gesamte Spielsituation spiechen und hinterher restaurieren, Graphikspeicher(Backbuffer), Texturen usw. neu initialisieren.

Am Besten schaust Du dir im Directx Sdk das Beispiel Text3D an. In der Basis Anwendungsklasse wird das gemanaged. Nimm dir den debugger und beobachte was die da machen.

Ansonsten als Tipp: Nimm Dir ein Beispiel aus dem SDK, wirf alles raus was Du nicht brauchst und ersetzte es / erweitere es mit deinem Code.
Das geht schneller und ist sicherer als wenn du alles selbst neu programmiert. Falls Du so vorgehen willst, mußt Du deine eigene Anwendungsklasse von der Basisklasse aus dem SDK ableiten und die wichtigen virtuellen Funktionen überschreiben.


Ich hoffe, das hilft Dir weiter.

Jörg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


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

BeitragVerfasst am: 15.06.2007, 12:26    Titel: Antworten mit Zitat

Fallen hat Folgendes geschrieben:
Und wo genau entfernst du zb den Font bevor du Resset aufrufst, bzw wo genau wird dem Font gesagt das er gleich sterben soll?

Denn genau daher wird dein Fehler kommen Smile

Schön wärs Very Happy . Nur hab ich auch schon mal alles was mit dem Font zu tun hat auskommentiert (war ja ne so viel) und das resten hat trotzdem nicht funktioniert. Crying or Very sad

@Jörg47
HandlePossibleSizeChange() hab ich nur einmal bei Text3D gefunden und da wars ein auskommentierter Aufruf der Funktion. Die entsprechende
Funktion selbst war garnicht vorhanden Sad

Die Managerfunktion ist doch im SDK die DXUTChangeDevice(), oder ?
Die bin ich mal durchgegangen, aber da wird so oft auf andere Funktionen zurückgegriffen, dass ich mich dort überhaupt nicht zurecht fand Rolling Eyes

Aber irgendwie wär das doch eine tolles Thema für ein Tut Very Happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jörg47
Mini JLI'ler



Anmeldedatum: 07.02.2007
Beiträge: 26

Medaillen: Keine

BeitragVerfasst am: 16.06.2007, 10:48    Titel: Antworten mit Zitat

Hi Leute,

Microsoft hat die Beispiele zum DirectX SDK geändert. Ich wuste das nicht, weil ich schon länger keine Tutorials mehr bearbeitet habe.

Aber es bleibt dabei: Die vollständige Lösung für Eure Fragen sind im Text3D und zugehörigem Common Verzeichnis zu finden, in der
DirectX Version 9.0 die dem Jetzt Lerne Ich... Buch
beilag. Auf der CD hat die Installations Exe das Datum 16.04.2003 09:44
Die von mir angesprochenen c++ Quellen sind alle vom November oder Dezember 2002. Aus diesem SDK habe ich mein Wissen. Ich fand die Beisiele sehr gut und für mich aureichend.

Besorgt euch das Beispiel und geht wie beschrieben vor.

Jörg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


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

BeitragVerfasst am: 05.07.2007, 17:10    Titel: Antworten mit Zitat

Ich bins wieder.
Ich hab mir mal das Text3D angeschaut und deren Architektur bezüglich des reseten übernommen. Nur eins verstehe ich net :
Man kann ein Device nur reseten wenns verloren ging. Ich verliers aber nie was mir TestCooperativeLevel() zeigt.
Gibt es da dann irgend ne Methode dem Device absichtlich in Resetstimmung zu verleiten oder ganz gemein das Device per hand "losten" ? Twisted Evil

Weil wie gesagt ohne LostDevice kein Device->Reset(); Evil or Very Mad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 05.07.2007, 18:11    Titel: Antworten mit Zitat

Windows+L sollte ein DeviceLost provozieren, wenn es bei dir nicht klappt probiere mal den Bildschirmschoner.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


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

BeitragVerfasst am: 05.07.2007, 18:31    Titel: Antworten mit Zitat

Fallen hat Folgendes geschrieben:
Windows+L sollte ein DeviceLost provozieren, wenn es bei dir nicht klappt probiere mal den Bildschirmschoner.

Spaßvogel Laughing
Ich lass dann immer die Fehlermeldung kommen:"Bitte drücken sie Win+L um das Programm zu reseten" Very Happy
Nochmal:
Wenn ich den Backbuffer ändern will, muss ich das Direct3D-Device reseten
Wenn ich das Direct3D-Device reseten will, brauch ich angeblich ein LostDevice

Hier mal ne Demo von meiner GUI
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 05.07.2007, 19:19    Titel: Antworten mit Zitat

Otscho hat Folgendes geschrieben:
Fallen hat Folgendes geschrieben:
Windows+L sollte ein DeviceLost provozieren, wenn es bei dir nicht klappt probiere mal den Bildschirmschoner.

Spaßvogel Laughing
Ich lass dann immer die Fehlermeldung kommen:"Bitte drücken sie Win+L um das Programm zu reseten" Very Happy
Nochmal:
Wenn ich den Backbuffer ändern will, muss ich das Direct3D-Device reseten
Wenn ich das Direct3D-Device reseten will, brauch ich angeblich ein LostDevice

Hier mal ne Demo von meiner GUI


Ich hab das so verstanden das du einen wirklich prvozieren wolltest zb zum testen. Aber wenn nicht... dann rufe einfach device->Reset() auf du brauchst dazu kein LostDevice zustand.

Dennoch musst du natürlich darauf achten alle nonManaged Resourcen etc freizugeben und danach neu zu erstellen.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


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

BeitragVerfasst am: 08.07.2007, 11:34    Titel: Antworten mit Zitat

Irgendwie weiß ich jetzt immer noch nicht, wie ich ein Device erfolgreich resete. Drum hab ich jetzt die Holzhammermethode genommen und auf Teufel komm raus bei jeder Fenstergrößenänderung ein neues Device erstellt. Hier mal das Beispiel
Allerdings muss ich ja bei jedem Neuerstellen des Devices alle Resoucen freigeben und anschließend wieder laden. Bis jetzt funtzt das noch recht gut da ich noch net allzu viele Graphiken verwende. Aber irgendwann könnte ich mir vorstellen, wird das sehr auf die Performance gehen.
Kann man Resoucen im SXSTEMMEM Pool evt. von verschiedenen Devices nutzten lassen ?
Dann könnte ich mir das ganze von Festplatte Lesen und Decoden sparen. Eine Kopie vom System-RAM in den Graka-RAM würde mit sicherheit viel schneller zu erstellen sein, als das Neueinlesen. Bei einer Bandbreite von zB. 2.1GB/sec würde das wahrscheinlich nur noch kurz flutsch machen Laughing
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 08.07.2007, 16:17    Titel: Antworten mit Zitat

Beim Devicereset, wozu willst du da auf die Performnce achten, klar ne tolle Sache, aber niemand erwartet doch wirklich das er bei nem Devicereset highperformance Aufgaben erledigen kann.

Und nutze managed Resourcen, denen interessiert ein DeviceReset nicht besonders.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


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

BeitragVerfasst am: 09.07.2007, 10:10    Titel: Antworten mit Zitat

Fallen hat Folgendes geschrieben:
Und nutze managed Resourcen, denen interessiert ein DeviceReset nicht besonders.

Oh, ich glaube da hab ich mich ein wenig unklar ausgedrückt.
Ich reste das Device nicht in dem Sinne, dass ich die Funktion IDirect3DDevice9::Reset verwende,
sondern ich release das device IDirect3DDevice9::Release und erstelle es anschileßend wieder komplett neu.
Darum muss ich (oder glaube zu müssen) alle Resoucen neu einlesen. Crying or Very sad
Toll wärs da halt ne Kopie im RAM zu haben. Aber beim Releasen des Devices wird die Resouce dann wohl irgendwo ins Nirvana verschwinden.
Oder kann man mit dem alten Zeiger dennoch drauf zu greifen ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 38
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 09.07.2007, 13:56    Titel: Antworten mit Zitat

Otscho hat Folgendes geschrieben:
Ich reste das Device nicht in dem Sinne, dass ich die Funktion IDirect3DDevice9::Reset verwende, [...]

Wieso machst du das denn nicht?
Ein Aufruf von Reset() inklusive notfalls neuerstellen der Ressourcen(Texturen, Meshes, Shader, ...) reicht doch.
_________________
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
Otscho
Super JLI'ler


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

BeitragVerfasst am: 09.07.2007, 19:42    Titel: Antworten mit Zitat

Klappt aus einem mir unbekannten Grund net.
Krieg immer invalid call Crying or Very sad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 38
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 10.07.2007, 03:09    Titel: Antworten mit Zitat

Code her Wink

DirectX-Doku sagt, dass bei Invalid Call möglicherweise falsche Parameter angegeben wurden.
_________________
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
Otscho
Super JLI'ler


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

BeitragVerfasst am: 10.07.2007, 10:01    Titel: Antworten mit Zitat

Zitat:
DirectX-Doku sagt, dass bei Invalid Call möglicherweise falsche Parameter angegeben wurden.
Das hab ich auch gelesen. Und da steht auch:
CPP:
HRESULT Reset(     
    D3DPRESENT_PARAMETERS* pPresentationParameters
);
Ich hab der Funktion lediglich die selben D3DPRESENT_PARAMETERS übergeben, welche ich zum erstellen des Devices verwende. Ok BackBufferWidth und BackBufferHeight hab ich angepasst, sollte allerdings nicht der Grund für ne invalid call sein, da es ja mit der alternativen Variante des Devicenererstellens funktioniert.
Hier mal die Funktion die das managed:
So funktioniert sie zwar, das Device wird jedoch nicht wiklich resetet.

CPP:
void CDirect3D::CheckForWindowSizeChange(){
   RECT rcCurrentClient;
   GetClientRect( m_hWnd, &rcCurrentClient );

   if(((UINT)rcCurrentClient.right != PParam.BackBufferWidth) ||
      ((UINT)rcCurrentClient.bottom != PParam.BackBufferHeight)) {

         ResManager::GetSingletonPtr()->FreezRes();
         DeInitComponents();

         CreateDirect3DDevice();
         ResManager::GetSingletonPtr()->ReFreezRes();

         m_OnResetDevice();

   }
}


So sollte sie funktionieren, tut sie aber nicht(invalid call)

CPP:
void CDirect3D::CheckForWindowSizeChange(){
   RECT rcCurrentClient;
   GetClientRect( m_hWnd, &rcCurrentClient );

   if(((UINT)rcCurrentClient.right != PParam.BackBufferWidth) ||
      ((UINT)rcCurrentClient.bottom != PParam.BackBufferHeight)) {

         PParam.BackBufferWidth = (UINT)rcCurrentClient.right;
         PParam.BackBufferHeight = (UINT)rcCurrentClient.bottom;

         ResManager::GetSingletonPtr()->FreezRes();

         HRESULT hr = m_lpD3DDevice->Reset(&PParam);

         if(D3D_OK == hr) Logbook::GetSingletonPtr()->Succed(L"Device->Reset() (Resized)");
         else Logbook::GetSingletonPtr()->Error(L"Device->Reset()", hr, 10011);

         
         //DeInitComponents();

         //CreateDirect3DDevice();
         ResManager::GetSingletonPtr()->ReFreezRes();

         m_OnResetDevice();

   }
}


Am Resoucenmanager kann es kaum liegen, da ich auch den gleichen Fehler erhalte, wenn er auskommentiert ist(und natürlich auch alles was Resoucen verwendet).

Zuerst habe ich diese Funktion immer vor der IDirect3DDevice9::BeginScene() aufgerufen. Nach einigen Ratschlägen dann immer nach der Nachricht WM_EXITSIZEMOVE. Das hat aber nix gebracht. Zudem hat diese Nachricht immer das Maximieren und Minimieren des Fensters verschwiegen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 38
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 10.07.2007, 13:24    Titel: Antworten mit Zitat

Was enthalten die beiden Methoden FreezRes() und ReFreezRes()?

Hast du mal geschaut, was dir die Present()-Methode des Devices zurückgibt? Ich bin mir nicht sicher, ob du das Device resetten kannst, wenn es noch gar nicht verloren ist. Möglicherweise bekommst du dein lost device auch gar nicht nur dadurch, dass die Fenstergröße geändert wird.

Ich würde einfach mal testen, was dir Present() zurückgibt und ob Reset() nicht fehlschlagen würde, wenn du z.B. das Programm minimierst und wieder maximierst. Wenn das klappt, wäre es evtl. eine Möglichkeit, bei Änderung der Fenstergröße das Device künstlich zu verlieren(?).
_________________
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
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Gehe zu Seite Zurück  1, 2, 3  Weiter
Seite 2 von 3

 
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