| |||||
| Dernière réponse | ||
|---|---|---|
| Sujet : DirectX avec les MFC | ||
| LeGreg |
|
|
| Aperçu |
|---|
| Vue Rapide de la discussion |
|---|
| LeGreg |
|
| leander | Moi j'ai fais un éditeur d'animation avec les MFC et direct3D. Et tout marchait très bien.
Lorsque j'étais en mode édition je ne reaffichait la fenêtre que lorsque windows m'envoyait un message WM_PAINT ou alors lorsque l'utilisateur avait modifié le squelette de mon personnage. Et lorsque je voulais "jouer" une animation, j'activait le timer windows (WM_TIMER) en lui demandant de m'envoyer 60 messages par secondes. C'est largement suffisant pour visualiser une animation ou n'importe quel moteur 3D dans un éditeur. Et si mon PC ramait trop pour afficher 60 images par secondes, ce n'était pas grave car windows effaçait les messages WM_TIMER en retard. A mon avis, c'est la solution la plus simple pour un éditeur. Leander |
| n0mad |
[edtdd]--Message édité par n0mad--[/edtdd] |
| El_gringo |
|
| n0mad | ahala ces smiley débiles... |
| n0mad | El_Gringo>
Ta boucle avec le dispatch message etc..., tu la mets dans la méthode virtuelle CWinApp::Run() et dans le cas où tu n'as plus de message à traiter, tu envoies une invalidation (InvalidateRect) ce qui va provoquer l'appel de CView::OnDraw(CDC* pDC) dans lequel tu dessines tes objets. Je trouve que c'est la méthode la moins "magouillatoire" avec les MFC. Les perfs ne seront pâs au top mais c'est pas le but. |
| LeGreg |
[edtdd]--Message édité par legreg--[/edtdd] |
| youdontcare |
je peux t'en sortir un autre :
|
| BENB | LEGREG > je connais le multi threading ;)
je pense qu'il n'etait inutile de mettre le point sur le fait que une seule thread doit dessiner a un instant donne, et en general il est preferable que ce soit la thread principale... |
| LeGreg |
|
| El_gringo | haaa, merde, j'avais même pas fait gaffe que CView hérite de CWnd. Je sais pas pourquoi, j'étais persuadé du contraire... d'ailleur, g failli te répondre que "non" sans vérifier !:D
Bah du coup j'imagine qu'y a pas de problème ! :D J'pourrais pas essayer avant ce soir. Mais je verrai, vous aurez de mes nouvelles de toute façon ! Merci... |
| youdontcare |
je ne connais pas CView ... mais c'est une classe qui encapsule une fenêtre, non ? :D tu as une fenêtre ... tu as une classe que tu peux dériver ... dx ne demande qu'un hwnd pour être initialisé ... où est le problème ? où es tu bloqué ? |
| El_gringo |
|
| LeGreg |
|
| youdontcare |
et pourquoi donc ? ça permet d'avoir la gui qui répond tout le temps, le rendu qui ne bloque rien. pour prendre un parallèle connu, c'est ce qui se passe dans photoshop : tu as une thread gui, et une thread qui calcule les effets (genre gaussian blur) et qui balance le résultat à la thread gui pour qu'elle update les fenêtres. |
| youdontcare | dans l'app sur laquelle je bosse en ce moment, le rendu est fait dans un thread. il communique par messages avec la thread gui. ce n'est pas moi qui me suis occupé de ce bout de code, mais je crois me souvenir qu'il n'y a aucun code spécifique mutex/critical sections/etc. on peut très bien faire du multithreading 'simple' : ici, les deux threads ne partagent jamais les mêmes données, l'un alloue, l'autre désalloue. bref, c'est un cas 'particulier' de multithreading mais ça marche bien.
il n'y a pas de problèmes de multithreading venant de directx, la preuve, ça marche :D ça marche également très bien dans un contrôle activex, aucun problème. le OnIdle(), on avait essayé, le framerate était erratique car wm_idle est envoyé un peu n'importe quand. je maintiens qu'un InvalidateRect() marche très bien (même si c'est trèèès crade. en attendant mieux ...) |
| El_gringo |
|
| BENB |
|
| LeGreg |
|
| El_gringo |
|
| z51 | Le plus simple c'est de rafraîchir l'affichage sur l'événement OnIdle de l'appli principale.
Edit : ça a déjà été dit, désolé :) [edtdd]--Message édité par z51--[/edtdd] |
| LeGreg |
|
| youdontcare |
le plus simple : pourquoi ne fais-tu pas une thread qui s'occupe de tout le temps rafraîchir ta fenêtre ? |
| El_gringo | Donc personne à jammais tenté DirectX avec les MFC... pourquoi vous avez pas essayé ?
Le truc qui m'interre surtout, c de savoir comment afficher un Device D3D dans une vue (CView), parce que les vue, elle ont ce message Draw qui redessine le contenu de la vue régulièrement... et là, c géré correctement... je vais pas refaire toute la gestion du temps... [edtdd]--Message édité par El_Gringo--[/edtdd] |
| LeGreg |
|
| El_gringo |
|
| El_gringo |
|
| youdontcare | il suffit d'utiliser un timer (pas wm_timer car pas assez précis, regarde les autres timers comme les timers multimédia), où encore d'y aller brutal à coups d'InvalidateRect() dans le OnPaint() (pas très recommandé). |
| bjone | bin je sais po, moi je suis parti de la structure des tutoriaux.....
mais effectivment, le draw (message paint je suppose) n'est envoyé que lorsque un surface doit être retracée..... donc ta fonction qui doit retraçer l'image D3D, doit être appellée de ta boucle générale de l'app, où l'on consomme les messages.... en fait, ta fenêtre peut parfaitement acceuillir une surface D3D, mais fo que le traçage soit lancé d'ailleurs que le draw (et même qu'une méthode de ta classe fenêtre) |
| LeGreg |
|
| El_gringo | en fait, vu que j'aime pas trop l'APIWin32, je me suis dis, tien, tu vas pas faire comme tout l'monde, et ton DirectX, tu vas l'apprendre avec les MFC. ça va, je m'suis démerdé, mais y reste un pb.. et pas des moindres !
Attention, accrochez vous, j'explique: c au niveau de l'appel de ma fonction D3DDraw (celle qui contient BeginScene, EndScene, etc...). Avec l'API Win32, on met l'appel à cette fonction dans le main, au niveau du DispatchMessage et compagnie. En MFC, g décidé de remplacer le createwindow par une CWnd (ce qui parait logique...). le pb, c au niveau des message. Apparement, dans une CWnd, y a pas de message Draw envoyé régulièrement pour redessiner le contenu de la fenêtre, bref, si on fait rien, qu'on reste sans bouger la souris ni rien, aucun message n'est envoyé ! j'imagine donc qu'il est impossible dans ce cas là d'utiliser une CWnd pour acueillir un Device D3D. Mais je dois utiliser quoi alors !? une view peut être, ms dans ce cas, je l'utilise comment ? Je sais pas trop si y aura des réponses, vu que mon explication est bordelique (:D) et que g jammais vu personne utiliser les MFC avec DirectX (pourquoi d'ailleur, c très bien les MFC). Mais bon... je crois en vous !:D [edtdd]--Message édité par El_Gringo--[/edtdd] |




