2017-10-08 12 views
1

J'ai expérimenté avec le multi-threading un moteur de jeu. À titre d'exemple, voici la structure de base de mon code.Est-il mauvais de créer de nouveaux threads de travail à chaque image dans un jeu multi-thread?

#include <thread> 

int main() { 

    std::thread physics_thread; 
    std::thread particles_thread; 
    std::thread graphics_thread; 

    while (!shouldClose) { 

    physics_thread = thread(doPhysics, &someData1); 
    particles_thread = thread(doParticles, &someData2); 
    graphics_thread = thread(doGraphics, &someData3); 

    physics_thread.join(); 
    particles_thread.join(); 
    graphics_thread.join(); 

    } 

} 

Est-ce une pratique incroyablement mauvaise? J'utilise Linux sur un système assez faible et la création de ces threads à chaque mise à jour est assez bon marché. En termes de toutes les plates-formes cependant, est-ce juste une mauvaise idée? Sur une note de côté, j'ai essayé d'exécuter constamment des threads de travail avec des mutex et des variables de condition sur le wazoo et parfois je peux le faire fonctionner, mais cela semble absurdement compliqué pour ce que j'essaie d'accomplir.

+1

ressources Réaffectation dans la boucle est certainement une mauvaise pratique. Dans ce cas particulier, vous pouvez utiliser un pool de threads quelconque. Cependant, la réaffectation inutile ne constitue pas le plus gros problème avec cet extrait. Une telle boucle met une synchronisation stricte des tâches de threads de travail au lieu de les exécuter de manière asynchrone. – VTT

+0

Créer des threads est coûteux. –

+0

La solution compliquée est forcément un peu plus efficace. Cela dépend de votre application si vous avez vraiment besoin de cette efficacité supplémentaire ou non. Pourquoi ne pas faire quelques tests et voir combien créer des threads ronge votre taux de trame? Ensuite, décidez si vous devez créer une solution plus complexe. – Galik

Répondre

1

Bien que cela semble bon marché, ce n'est pas le cas. Les fils ont besoin de soulever des objets lourds et si vous savez que vous en aurez besoin à nouveau (encore moins de les réutiliser plusieurs fois), vous devriez essayer de l'éviter.

La solution classique est d'utiliser un pool de threads pour exécuter vos tâches lorsque vous en avez besoin, puis laisser les travailleurs dorment jusqu'à la prochaine fois.

Le coût d'avoir N fils de couchage supplémentaire est minime et ne sera pas affecter les performances de l'application.

Voici un en-tête simple simple mais très puissant thread pool library je l'ai écrit.