Quelque chose a ne pas faire dans InitDeviceObjects() ? [DirectX] - C++ - Programmation
Marsh Posté le 03-02-2006 à 08:40:46
ReplyMarsh 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
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 :
|
Ce code est un peu degueu, mais bon , c'est 10h30 du mat, tete dans le cul toussa
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
Marsh Posté le 04-02-2006 à 22:03:55
eheh le managed ca ira tres bien
merci de l'explication en tout cas...
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 ), resultat ca peut bouffer plus peut-être
Marsh Posté le 11-02-2006 à 00:05:02
ReplyMarsh 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.
|
d'où quelle sort l'exception DeviceNotResetException ?
c'est du C++ managed ?
Marsh Posté le 11-02-2006 à 00:15:28
Le code que j'ai écrit c'est du C#
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 )
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