[DirectX] Quelque chose a ne pas faire dans InitDeviceObjects() ?

Quelque chose a ne pas faire dans InitDeviceObjects() ? [DirectX] - C++ - Programmation

Marsh Posté le 03-02-2006 à 03:08:43    

Bonjour,
 
Je m'amuse un peu avec direct3D et j'utilisais jusqu'a present des mesh (D3DX) sans aucun probleme.
 
J'ai voulu realiser un terrain a heuteur aleatoire avec Vertex Buffer et Index Buffer.
 
Tout marche sauf lorsque j'essaye de redimensionner la fenetre ou de la passer en plein ecran. J'obtiens alors ce message d'erreur :  
"Could not reset the Direct3D device" et l'application se ferme.
 
J'ai pu isoler la ligne fautive et elle se trouve dans la fonction InitDeviceObjects().  
C'est un appel de la fonction qui crée le vertex buffer et l'index buffer pour mon terrain (mon terrain est une classe contenant entre autre un VB et un IB).
 
Jusqu'a present j'initialisais mes mesh dans cette fonction et j'ai donc fait pareil pour le terrain mais je ne sais pas si c'est le bon endroit pour faire cela... ca serait mieux dans oneTimeSceneInit() (je reviens editer le message parce que qu'apparemnt c pas dans OneTimeSceneInit) ?
 
si c'est bien le bon endroit, y a-t-il des choses a ne pas faire lors de mon initialisation ? quel pourrait etre l'origine de ce message lors du redimensionnement ?
 
merci :)
 
@ bientot


Message édité par Bouteille le 03-02-2006 à 03:51:53
Reply

Marsh Posté le 03-02-2006 à 03:08:43   

Reply

Marsh Posté le 03-02-2006 à 08:40:46    

bah heuh j'ai tjs trouvé que le petit framework a ms pour d3d puait, donc bon

Reply

Marsh Posté le 03-02-2006 à 20:06:52    

c'est a dire ?

Reply

Marsh Posté le 04-02-2006 à 00:58:27    

ok j'ai fini par trouver... en fait j'utilisais D3DPOOL_DEFAULT au lieu de D3DPOOL_MANAGED pour la creation du Vertex Buffer.
 
Maintenant je vais essayer de comprendre pourquoi ;)
 
@ bientot

Reply

Marsh Posté le 04-02-2006 à 10:35:21    

Pour la simple raison que si tes ressources sont crées en pool Default, tu dois les détruire puis les recréer en cas de DeviceLost.
Donc en fait normalement, au moment ou tu appelle ton Device.Present(), tu dois faire avant un CheckCooperativeLevel, et en cas de DeviceLostException, libérer les ressources, les recréer.
 
Exemple :

Code :
  1. try
  2.             {
  3.                 bool bDeviceOk = this.dDevice.CheckCooperativeLevel();
  4.                 this.dDevice.Present();
  5.             }
  6.             catch (DeviceNotResetException)
  7.             {
  8.                 // Reset des ressources
  9.                 this.dDevice.Reset(this.ppPresentParams);
  10.                 // Recréation des ressources
  11.             }


Ce code est un peu degueu, mais bon , c'est 10h30 du mat, tete dans le cul toussa  [:dodo]  
 
PS : Les ressources en Pool.Managed n'ont pas besoin d'être virées puis reinitialisées.
PS2: En fait je me demande si la verif du CooperativeLevel sers vraiment, vu que en theorie c'est le Present() qui va thrower l'exception DeviceNotReset  [:pingouino]

Message cité 1 fois
Message édité par x1800+ le 04-02-2006 à 23:16:27
Reply

Marsh Posté le 04-02-2006 à 22:03:55    

eheh le managed ca ira tres bien ;)
 
merci de l'explication en tout cas...

Reply

Marsh Posté le 05-02-2006 à 01:06:42    

Concernant le Pool.Managed, apres lecture de différents articles sur le net, il semble que ca soit pas totalement rose, parceque à ce que j'ai compris, ca charge une fois la ressources dans la mémoire vidéo, et en plus ca la charge dans la ram (ou alors j'ai mal compris, mais visiblement c'est chargé en double  [:pingouino] ), resultat ca peut bouffer plus peut-être  [:canaille]

Reply

Marsh Posté le 11-02-2006 à 00:05:02    

chrisbk a écrit :

bah heuh j'ai tjs trouvé que le petit framework a ms pour d3d puait, donc bon


+1

Reply

Marsh Posté le 11-02-2006 à 00:07:59    

x1800+ a écrit :

Pour la simple raison que si tes ressources sont crées en pool Default, tu dois les détruire puis les recréer en cas de DeviceLost.
Donc en fait normalement, au moment ou tu appelle ton Device.Present(), tu dois faire avant un CheckCooperativeLevel, et en cas de DeviceLostException, libérer les ressources, les recréer.
 
Exemple :

Code :
  1. try
  2.             {
  3.                 bool bDeviceOk = this.dDevice.CheckCooperativeLevel();
  4.                 this.dDevice.Present();
  5.             }
  6.             catch (DeviceNotResetException)
  7.             {
  8.                 // Reset des ressources
  9.                 this.dDevice.Reset(this.ppPresentParams);
  10.                 // Recréation des ressources
  11.             }


Ce code est un peu degueu, mais bon , c'est 10h30 du mat, tete dans le cul toussa  [:dodo]  
 
PS : Les ressources en Pool.Managed n'ont pas besoin d'être virées puis reinitialisées.
PS2: En fait je me demande si la verif du CooperativeLevel sers vraiment, vu que en theorie c'est le Present() qui va thrower l'exception DeviceNotReset  [:pingouino]


 
d'où quelle sort l'exception DeviceNotResetException ?
c'est du C++ managed ?

Reply

Marsh Posté le 11-02-2006 à 00:15:28    

Le code que j'ai écrit c'est du C#  [:pingouino]  
 
Pour le DeviceNotResetException :  
http://msdn2.microsoft.com/en-us/l [...] ption.aspx
 
EDIT : Meme si c'est un lien pour les Mobile device, elle existe bel et bien pour le DX "normal" (la preuve je l'utilise pour mon moteur 3D  [:canaille] )


Message édité par x1800+ le 11-02-2006 à 00:26:37
Reply

Marsh Posté le 11-02-2006 à 00:15:28   

Reply

Marsh Posté le 12-02-2006 à 17:46:31    

okay.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed