Vous parlez de "difficultés multithreads" mais de quelles difficultés parlez-vous réellement? D'une certaine manière, vous citez un problème fantôme qui n'existe peut-être même pas. Le vrai défi est celui que vous vous lancez - si vous êtes absolument déterminé à tirer le maximum de puissance d'un morceau de matériel, cela implique d'utiliser le matériel au mieux, mais cela élargit également l'écart entre la machine la plus puissante et les moins puissants. L'implication de ceci est que si vous avez un jeu qui tire vraiment le meilleur parti d'une PS3 (par exemple), vous ne pouvez pas vraiment l'exécuter sur un téléphone portable bon marché de toute façon, donc votre problème n'est plus "comment puis-je obtenir 1 programme pour travailler sur du matériel très différent "mais devient" comment puis-je implémenter 1 idée de jeu de différentes manières pour qu'elle fonctionne sur du matériel de puissance différente ".
Alors qu'une bibliothèque comme SDL fournit une API wrapper multiplateforme pour le filetage, je pense qu'il serait naïf de supposer que cela conduit directement au développement facile de jeux sur des plates-formes très différentes (ordinateur de bureau / mobile).
Développement facile de jeux - bien sûr. Multithreading optimal, non. Mais vous n'avez pas besoin de multithreading pour créer des jeux. Pour en faire de hautes performances, cela aide certainement. Mais de nombreux grands jeux fonctionnent sur un seul thread.
Quelle est la meilleure façon d'aborder le développement de cette manière (compte tenu de toute API de threading multiplateforme) compte tenu des éléments suivants:
- différents nombres de noyaux
- capacités de traitement très différentes par cœur
- Une architecture de systèmes généralement différente avec par exemple. différentes latences pour le cache, la RAM et l'accès aux E / S
Au lieu d'essayer d'affecter des systèmes à des threads, affectez des tâches aux threads. Donnez à chaque tâche les données dont elle a besoin pour exécuter et regrouper les tâches selon le matériel disponible. Habituellement, vous aurez une sorte de pool de threads pour abstraire les différents cœurs ou processeurs, et un gestionnaire de tâches qui a une file d'attente de tâches et les renvoie aux différents threads lorsque le thread signale qu'il a terminé la tâche précédente et est prêt pour un nouveau. Le matériel avec plus de cœurs accomplira évidemment les tâches plus rapidement et pourra rendre plus rapidement. La spécialisation de ce système pour travailler de manière optimale sur des systèmes ayant des caractéristiques différentes devient un problème d'optimisation avancé, mais peut être basée sur certaines heuristiques (par exemple, une tâche qui ne fonctionne pas).
Cependant, la décomposition des fonctionnalités du jeu en tâches discrètes est une question assez complexe et ne vaut souvent pas la peine à moins que vous ne soyez très sûr d'avoir besoin des performances, donc la plupart ne tenteront même pas.
Quelques lectures supplémentaires:
http://www.gamasutra.com/view/feature/1830/multithreaded_game_engine_.php - voir la section «données parallèles». Avec ce modèle, les données sont réparties sur plusieurs tâches identiques et regroupées sur des threads individuels.
http://software.intel.com/en-us/articles/designing-the-framework-of-a-parallel-game-engine/ - assez dense, décrit les choses au niveau du système d'exploitation plutôt qu'au niveau du jeu.
http://drdobbs.com/high-performance-computing/216500409 - pas spécifique au jeu, mais tout à fait pertinent pour vous dire comment vous devez répartir les tâches.
http://www.itfgaming.com/news/tech-focus-crysis-2-and-the-future-of-cryengine-3 - à mi-chemin de cette interview est une anecdote sur la façon dont ils ont migré vers un système basé sur les tâches .