Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1554 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1298251
Bouteille
Posté le 03-02-2006 à 03:08:43  profilanswer
 

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
mood
Publicité
Posté le 03-02-2006 à 03:08:43  profilanswer
 

n°1298268
chrisbk
-
Posté le 03-02-2006 à 08:40:46  profilanswer
 

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

n°1298833
Bouteille
Posté le 03-02-2006 à 20:06:52  profilanswer
 

c'est a dire ?

n°1298950
Bouteille
Posté le 04-02-2006 à 00:58:27  profilanswer
 

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

n°1298965
x1800+
Posté le 04-02-2006 à 10:35:21  profilanswer
 

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
n°1299180
Bouteille
Posté le 04-02-2006 à 22:03:55  profilanswer
 

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

n°1299230
x1800+
Posté le 05-02-2006 à 01:06:42  profilanswer
 

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]

n°1303322
bjone
Insert booze to continue
Posté le 11-02-2006 à 00:05:02  profilanswer
 

chrisbk a écrit :

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


+1

n°1303323
bjone
Insert booze to continue
Posté le 11-02-2006 à 00:07:59  profilanswer
 

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 ?

n°1303324
x1800+
Posté le 11-02-2006 à 00:15:28  profilanswer
 

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
mood
Publicité
Posté le 11-02-2006 à 00:15:28  profilanswer
 

n°1303790
bjone
Insert booze to continue
Posté le 12-02-2006 à 17:46:31  profilanswer
 

okay.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[DirectX] D3DXLoadMeshFromX et vertex buffersCollisions 2D en DirectX 9
comment avoir un menu tout simple en css ou autre choseDirectX et vba
recherche Programmeur C++/DirectX/OpenGL - Son Of Destiny - RPG 2D/3DCharger un gros textes dans une surface (DirectX)
ouvrir un fichier excel depuis Access en VBA, encore une petite choseDessiner sur une surface directx d'une apllication externe
ou telecharger les anciens sdk de directx?C# et DirectX Managed -- pb de FPS --
Plus de sujets relatifs à : [DirectX] Quelque chose a ne pas faire dans InitDeviceObjects() ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR