![]() |
| Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé. | |||||||
|
|||||||
| Développement 2D, 3D et Jeux Forum développement 2D, 3D et Jeux. Avant de poster : Les FAQs Programmation 2D, 3D et Jeux |
| Affichage des résultats du sondage: Pour ou contre le multithreading dans les moteurs 3D ? | |||
| Pour |
|
72 | 96,00% |
| Contre |
|
3 | 4,00% |
| Votants: 75. Vous ne pouvez pas participer à ce sondage. | |||
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Candidat au titre de Membre du Club
![]() |
Bonjour,
Voyant l'avancée technologique dans ce domaine, pensez-vous qu'il soit possible d'exploiter tous les threads disponibles d'un processeur pour un moteur 3D ? Vous n'êtes pas s'en savoir qu'Intel va lancer courant de l'année 2009 des nouveaux processeurs comportant 2 et 4 core avec chacun des core pouvant exploiter 2 threads. D'autre part les jeux n'exploite pas encore ces ressources des processeurs, et cela est bien dommage. Imaginez un processeur dont chaque thread aurait une(des) tâche(s) particulière(s), ce qui permettrait de monter en puissance au niveau des jeux, augmenter de par ce fait la qualité et la réalité. Est-ce donc possible ? |
|
|
|
|
|
#2 (permalink) |
![]() Date d'inscription: avril 2003
Localisation: Metz
Âge: 24
Messages: 10 476
|
Oui c'est possible. C'est même très utilisé dans les moteurs de jeu pro, car les consoles exploitent le parallèlisme avec plusieurs cores beaucoup plus fortement que les processeurs de PC.
Mais attention la parallèlisation est loin d'être triviale, surtout dans un moteur graphique. Tu as plutôt intérêt à savoir très exactement ce que tu fais.
__________________
- Les FAQs C / C++ et 2D / 3D / Jeux - Mes tutoriels de C++, programmation 3D et jeux vidéo - Mieux que la SDL : découvrez SFML Ma boîte MP n'est pas l'annexe du forum |
|
|
|
|
|
#4 (permalink) |
|
Membre émérite
![]() Date d'inscription: août 2007
Messages: 738
|
ca ne se fera pas comme ca, un jeu qui marche avec des threads pour des taches ne s'etend pas facilement avec les cores. par exemple, comment va fonctionner le jeu si tu as 4 coeurs au lieu de 2 ? aller deux fois plus vite ? ahum
mettons que tu prevoies large, tu fais un thread pour la physique, un pour le rendu, un pour le gameplay, un pour l'ia, un pour les particules, un pour le son. te voila avec 6 threads. Que faire lorsque du coup tu as un octo-core ? le futur semble aller vers plus et plus de core dont la fréquence stagne voire est reduit (je te parle la depuis un bi-quad-core, soit deux processeurs de 4 cores, chacun cadencés a 1.86GHz seulement). On est loin des 3,4GHz des pentiums 4 hein alors si tu ne sais pas metrte a l'echelle sur 2 ou 8 cores, le jeu va etre moisi. Le principe est de developper le jeu a l'aide de taches divisibles, et de partager ces taches sur les processeurs. par exemple, l'IA et le rendu; tu peux, d'un coté, faire l'IA sur le thread 1 et le calcul de visibilité des objets sur le thread 2. Que faire avec un troisieme proc ? bah... l'idée c'est de traiter l'IA par batchs divisibles; mettons que tu aies 40 npc sur la map, tu fais une fonction qui prend une liste e npc a mettre a jour, et tu les mets a jour. Et pour le calcul de visibilité, tu prends une liste d'objets en argument et tu verifies s'ils sont visibles ou pas. Maintenant, tu as deux coeurs; bah tu divise les listes en 2 et tu appelles la fonction deux fois, chacune sur un coeur et chacune sur une moitié de liste. Et lorsque c'est fini, tu divises ta liste d'objets en 2 et tu appelles le calcul de visibilité deux fois, sur deux moitiés de listes. Et si tu passes a 8 coeurs ? et bien tu divises ta liste en 8 au lieu de 2 et chaque coeur va faire un tout petit bout de l'IA (genre 5 npc chacun) et lorsque c'est fini, tu divises ta liste d'objets en 8 et chaque coeur va verifier la visibilité d'1/8 des objets. Cela marche tant que les taches sont independantes, ce qui DOIT etre le cas pour un code bien fait. Et voila, ainsi, peu importe le nombre de cores. Et si tu tombes sur une machine a un nombre incroyable de cores, tu peux rajouter des particules ou autres. |
|
|
|
|
|
#6 (permalink) |
|
Membre émérite
![]() Date d'inscription: août 2007
Messages: 738
|
c'est gentil. Du coup ca m'a mis de bonne humeur et je continue
La seule chose qui n'est pas parallelisable c'est l'envoi de commandes vers opengl ou directx (bien que directx 11 sera multithreadé), et il serait dommage que pendant qu'on envoie des commandes opengl/directx il ne se passe rien. Voila donc, pour un quad-core, comment je verrais les choses : - tu alloues 3 cores (en regle generale, n-1) core aux taches - tu reserves un core au rendu ensuite : - tu effectues tes taches aussi vite que possible avec tes 3 cores - la derniere tache consiste a copier ce que tu vas rendre, faire une copie de ton quad tree par exemple, pour pouvoir d'un coté le modifier et de l'autre lire la version - sur le premier core, tu lances le rendu de ce quad tree en envoyant les commandes - sur les 3 autres cores, tu commences la prochaine frame cela implique de separer la logique du jeu de la logique du rendu; par exemple, tu vas devoir stocker la position et l'animation actuelle du personnage de maniere a pouvoir la lire avec le rendu mais a modifier pour la frame suivante. Si jamais ton coeur adoré a fini le rendu, et bien tu peux lui dire d'aider a effectuer des taches pour le compte des autres cores (les "voler") pour leur rendre service, et des qu'ils ont fini hop tu te lances sur le rendu de la frame qui vient de se finir. Si les autres cores vont trop vite pour le rendu, cela signifie que ton rendu va "lagger", dans ce cas tu risques d'accumuler des frames de retard. Pour cela, bien evidemment, tu ne stockes pas une liste des frames a rendre, tu n'en stocke qu'une, et si le premier thread a du retard il va sauter directement a la frame la plus recente. Enfin, pour que tout ce beau monde fonctionne, tu as besoin d'un scheduler, qui va diviser les taches a effectuer et qui va egalement les ordonnancer sur plusieurs cores. mettons que tu divises ton IA sur 4 cores, et que tu aies 40 personnages; la logique veut que chaque core recoive 10 personnages. mais que se passe t'il si ts 10 premieres IA qui vont sur le coeur 1 jouent aux echecs, pendant que les 30 autres jouent a la bataille et ne monopolisent pas beaucoup de neurones ? ben le core 1 va ramer a mort sur ces 10 et les autres cores vont se tourner les pouces. dans ce cas, le plus simple est en fait de diviser les taches en k*n ou n est le nombre de cores et k un nombre de taches par core, que j'ai mis arbitrairement a 16 ou 32 et qui donnent de bons resultats. Dans ce cas, si le core 1 rame sur une tache, les cores 2 3 et 4 peuvent: - diviser une de ses taches dans sa queue et lui en voler la moitié - lui voler une tache complete et aider a la progression du core 1. Si tu n'as qu'une tache sur le core 1 et qu'il est deja dessus, tu ne peux pas l'aider. Enfin, comme je me sens utile et de tres bonne humeu, je vous recommande la bibliotheque intel "thread building blocks" et la doc qui va avec. J'ai commencé un moteur de jeu dont l'ambition est que la boucle principale envoie une tache dans la liste, cette tache a sa completion declenchera d'autres taches, etc etc, et que l'integralité du jeu soit donc des taches. J'ai donc pour cela commencé a faire une petite lib ressemblant a intel TBB, et je suis en train de travailler sur les taches pour pouvoir les enchainer et ainsi faire l'integralité d'un update de frame sur les taches, utilsiant au maximum les CPU - le son - le systeme de particule (effet graphique) - la balle et le calcul de ce qu'elle touche mais dans du code en C++ on se voit mal effectuer ces trois choses en parallele car on ne peut pas lancer un thread expres pour faire le bruit d'une balle, et un autre pour faire l'effet graphique. Si ces choses arrivent sur un evenement, c'est tres dur de paralleliser cela. Donc mon plan est de creer un langage qui permet de dire "effectue ces 3 choses la", va creer 3 taches et va les mettre dans le scheduler. Tout cela sans que le programmeur aient a tripatouiller WARNING: l'enorme probleme est que si tout est multithread, alors chaque unité peut mourir pendant qu'un autre core lui demande combien elle a de PV, ou autres problemes de synchro. il est important de proteger correctement ces variables. une idée pour cela est dans le moteur de valve je crois, qui consiste a avoir plein de copie d'objets et ce qu'isl appellent un "pipeline" qui permet de reconstruire un objet a partir des modifications appirtées par chaque thread. le multithread restecependant quelque chose de tres dur a maitriser et donne d'innombrables bugs tres difficiles a reproduire, etant donné que le scheduler a la main sur tout et qu'on a peu de controle sur lui. |
|
|
|
|
|
#7 (permalink) | |
![]() |
Citation:
Mais cela changera.. faut laisser le temps ...
__________________
--[[ Responsable, rubrique 2D / 3D / Jeux ]]-- Le blog de la rubrique 2D/3D/Jeux : http://blog.developpez.com/jeux (envie d'y participer, contactez moi) new Tuto DirectX, OpenGL : http://raptor.developpez.com/ Pensez au tag si vous avez eu votre réponse.
|
|
|
|
|
|
|
#9 (permalink) |
|
Membre émérite
![]() |
Petit ajout à ce qui a été dit (je n'en rajoute pas sur la physique, l'IA et la version Multithread de Direct3D 11) :
Le multithreading n'est pas *uniquement* lié à la gestion des multicore. Bien entendu le développement des CPUs multicore est important mais on a fait du multithreading (multitasking) depuis bien longtemps sur des CPUs simple core. Malgré tous les problèmes usuellement reliés à la programmation multithread, c'est l'un des moyens les plus productif de gérer des problèmes d'UI, de réponses serveur, de l'interactivité, du chargement de données asynchrones sans avoir à faire de l'ordonnancement de tâches explicites dans le code (ou à se limiter arbitrairement à des tâches très simples). Exemple : 1 - un navigateur fait une requête web, pendant ce temps là l'utilisateur continue à appuyer sur des boutons, déplace la fenêtre, etc. L'une des solutions est d'interrompre fréquement l'exécution de l'une des tâches pour vérifier que l'autre tâche ne fait rien, explicitement depuis le code du programme (multitâche collaboratif et explicite). L'autre solution est de créer deux threads indépendants et de reposer sur le scheduling implicite qui est géré en dehors de l'application par l'OS (multitâche préemptif et implicite). De plus en bonus, si on double le nombre de core disponibles, ces deux tâches peuvent s'exécuter deux fois plus vite car exécutée vraiment en parallèle. (la troisième, la plus mauvaise, solution c'est d'interrompre totalement A jusqu'à ce que B ait fini ce qui peut casser l'illusion d'interactivité et de temps réel). 2 - Jusqu'à récemment la plupart des jeux étaient programmés en multitâche explicite (division en tâches élémentaires qui devaient se terminer avant la fin de la frame courante), voire interrompait fréquemment le jeu pour charger les textures et autres données (interruption longue pour sauvegarde ou pour changement de niveau). C'est un modèle qui va rester vrai pour plusieurs jeux (même avec l'exploitation du multi-core), mais de plus en plus de jeux utilisent le modèle implicite et préemptif là où ils peuvent (il y a d'autres modèles comme les co-routines ou la parallélisation automatique mais laissons ça de côté pour l'instant). Sinon pour l'exploitation du multithreading dans votre moteur de rendu, n'oubliez pas que Direct3D n'est que partiellement multithread-safe : Direct3D et Multithreading. L'avis est également vrai pour Direct3D10 (même si les options par défaut ne sont pas les mêmes et même si la couche DXGI cache en partie les problèmes de Present() asynchrones). LeGreg
__________________
LeGreg | Bezier | Raytracer | Voxel | Zbuffer | D3D10 | Animation mentor | Mes articles | Mon blog |
|
|
|
|
|
#10 (permalink) | |
![]() Date d'inscription: juillet 2005
Localisation: Pau
Âge: 27
Messages: 8 218
|
Citation:
__________________
Je ne réponds pas aux questions par MP Lorsque vous avez la solution, n'oubliez pas de marquer le sujet résolu Tutos et critiques de livres : http://matthieu-brucher.developpez.com/ Tutos Boost : http://matthieu-brucher.developpez.c...els/cpp/boost/ Mes blogs : français et anglais Le blog de ma femme : http://www.eifelle.com/ Jeu : Battez-vous pour moi |
|
|
|
|
|
|
#11 (permalink) | |
![]() Date d'inscription: juillet 2005
Localisation: Pau
Âge: 27
Messages: 8 218
|
Citation:
Parallélisme en O(K) et non O(N), le suel vrai parallélisme qui a un intérêt à long terme sur PC.
__________________
Je ne réponds pas aux questions par MP Lorsque vous avez la solution, n'oubliez pas de marquer le sujet résolu Tutos et critiques de livres : http://matthieu-brucher.developpez.com/ Tutos Boost : http://matthieu-brucher.developpez.c...els/cpp/boost/ Mes blogs : français et anglais Le blog de ma femme : http://www.eifelle.com/ Jeu : Battez-vous pour moi Dernière modification par raptor70 ; 10/09/2008 à 22h37 Motif: mise en forme |
|
|
|
|
|
|
#12 (permalink) | |
|
Membre émérite
![]() |
Citation:
LeGreg
__________________
LeGreg | Bezier | Raytracer | Voxel | Zbuffer | D3D10 | Animation mentor | Mes articles | Mon blog |
|
|
|
|
|
|
#13 (permalink) | |
![]() Date d'inscription: juillet 2005
Localisation: Pau
Âge: 27
Messages: 8 218
|
Citation:
On peut essayer d'en faire, mais ce n'est pas toujours possible, comme l'a dit screetch. Dire qu'une architecture est faite pour le data-parallelism, c'est inverser le problème. Un problème est data-parallel ou task-parallel. Une architecture parallèle sera toujours plus efficace sur du data-parallel lors de son évolution qu'un task-parallel.
__________________
Je ne réponds pas aux questions par MP Lorsque vous avez la solution, n'oubliez pas de marquer le sujet résolu Tutos et critiques de livres : http://matthieu-brucher.developpez.com/ Tutos Boost : http://matthieu-brucher.developpez.c...els/cpp/boost/ Mes blogs : français et anglais Le blog de ma femme : http://www.eifelle.com/ Jeu : Battez-vous pour moi |
|
|
|
|
|
|
#14 (permalink) |
|
Membre émérite
![]() |
Ben le graphisme sur ordinateur est quelque chose qui n'existe pas ?
C'est bien une application qui est facilement transposable en data parallel qui a profité d'un processeur dédié depuis plus d'une décennie. PhysX sur le GPU n'existe pas non plus ?
__________________
LeGreg | Bezier | Raytracer | Voxel | Zbuffer | D3D10 | Animation mentor | Mes articles | Mon blog |
|
|
|
|
|
#15 (permalink) | |
![]() Date d'inscription: juillet 2005
Localisation: Pau
Âge: 27
Messages: 8 218
|
Citation:
Idem, tout dépend de l'algorithme utilisé, pas du support. C'est quoi pour toi un processeur task-parallel dans ce cas ?
__________________
Je ne réponds pas aux questions par MP Lorsque vous avez la solution, n'oubliez pas de marquer le sujet résolu Tutos et critiques de livres : http://matthieu-brucher.developpez.com/ Tutos Boost : http://matthieu-brucher.developpez.c...els/cpp/boost/ Mes blogs : français et anglais Le blog de ma femme : http://www.eifelle.com/ Jeu : Battez-vous pour moi |
|
|
|
|
|
![]() |
![]() |
||
Que peut apporter le multithread au développement de jeux ?
|
||
| Outils de la discussion | |
|
|