Le moteur C ++ sur lequel je travaille actuellement est divisé en plusieurs gros threads: génération (pour créer mon contenu procédural), gameplay (pour l'IA, les scripts, la simulation), la physique et le rendu.
Les threads communiquent entre eux par le biais de petits objets de message, qui passent d'un thread à l'autre. Avant de marcher, un thread traite tous ses messages entrants - mises à jour pour transformer, ajouter et supprimer des objets, etc. Parfois, un thread (Génération) crée quelque chose (Art) et le transmet à un autre thread (Rendu) pour une propriété permanente.
Au début du processus, j'ai remarqué quelques choses:
Le système de messagerie est encombrant. Créer un nouveau type de message signifie sous-classer la classe Message de base, créer une nouvelle énumération pour son type et écrire une logique pour la façon dont les threads doivent interpréter le nouveau type de message. C'est un ralentisseur pour le développement et est sujet aux erreurs de style typo. (Sidenote - y travailler m'a fait apprécier à quel point les langages dynamiques peuvent être géniaux!)
Y a-t-il une meilleure manière de faire cela? Dois-je utiliser quelque chose comme boost :: bind pour rendre cela automatique? Je crains que si je le fais, je perds la capacité de dire, de trier les messages en fonction du type ou quelque chose. Je ne sais pas si ce type de gestion deviendra même nécessaire.
Le premier point est important car ces fils communiquent beaucoup. Créer et transmettre des messages est un élément important pour faire bouger les choses. J'aimerais rationaliser ce système, mais aussi être ouvert à d'autres paradigmes qui pourraient être tout aussi utiles. Existe-t-il différents modèles multithread auxquels je devrais penser pour faciliter la tâche?
Par exemple, certaines ressources sont rarement écrites, mais fréquemment lues à partir de plusieurs threads. Dois-je être ouvert à l'idée d'avoir des données partagées, protégées par des mutex, auxquelles tous les threads peuvent accéder?
C'est la première fois que je conçois quelque chose avec le multithreading à l'esprit. À ce stade précoce, je pense que ça se passe très bien (compte tenu), mais je m'inquiète de la mise à l'échelle et de ma propre efficacité à mettre en œuvre de nouvelles choses.