Des conseils pour créer des jeux multi-plateformes? [fermé]

39

Avez-vous des conseils / recommandations pour créer un jeu multiplate-forme en C / C ++?

Matias Valdenegro
la source

Réponses:

44

Masquer tout ce qui est spécifique à la plateforme derrière les couches d'abstraction

Cela signifie des éléments tels que le rendu, l'audio, les entrées utilisateur et les entrées / sorties de fichiers. Une astuce courante pour résumer le fait que sans induire de pénalité de performances d'exécution est constituée par les en-têtes indépendants de la plate-forme avec des fichiers d'implémentation spécifiques à la plate-forme:

// FileSystem.h
class FileSystem {
public:
    FileHandle OpenFile(const char * path);
    // other stuff...
}

// FileSystemWindows.cpp
FileHandle FileSystem::OpenFile(const char * path) {
    // call windows API...
}

Ensuite, configurez les versions pour chaque plate-forme afin de créer le fichier .cpp approprié.

Faites en sorte que vos pipelines de contenu soient lus dans des actifs indépendants de la plate-forme et produisent du contenu spécifique à chaque plate-forme

Par exemple, créez vos textures au format .tga ou simplement .psd, puis créez un pipeline capable de les convertir automatiquement en différents formats spécifiques à la plate-forme dont vous avez besoin.

Ne supposez pas une disposition de mémoire spécifique ou une finalité dans vos données

Les plates-formes peuvent varier en fonction de l'ordre des octets, du remplissage, de l'alignement et de la taille des mots. Tout code qui se soucie de cela doit être minutieusement testé sur toutes les plateformes.

Testez sur toutes les plateformes, tout le temps

Vous serez piqué par des bogues spécifiques à la plate-forme. Préférez-vous être mordu maintenant ou juste quand vous essayez de faire sortir le jeu?

munificent
la source
2
manque de #ifdef PLATFORM_WINftw
tenpn
Vous n'échapperez jamais à cela. Vous pouvez simplement espérer le minimiser.
munificence
8
Un bon moyen de le faire est de déplacer tout le code spécifique à la plate-forme dans un ensemble de bibliothèques partagées avec la même interface. Vous pouvez donc limiter le # ifdef à l'amorçage de la bibliothèque appropriée pour la plate-forme.
Neel
1
+1, excellent commentaire. N'oubliez pas que même le STL dépend de la plate-forme (et oui, certaines fonctions font différentes choses sur différents compilateurs).
Simon
Appeler une fonction supplémentaire va sûrement diminuer les performances. La CPU doit charger ou déplacer des données à partir de registres ou pire, de mémoire encore lente. Un appel système ne suffirait-il pas?
TheBlueCat
10
  • Utilisez une API comme opengl / sdl qui vous évitera des tracas lorsque vous irez de plateforme en plateforme.

  • Assurez-vous de connaître les plateformes que vous souhaitez prendre en charge. N'utilisez pas opengl simplement parce que vous pensez pouvoir prendre en charge plusieurs plates-formes à l'avenir. Commencez comme vous voulez continuer.

  • Sachez quelles sont les limitations matérielles sur chacune des plates-formes que vous souhaitez prendre en charge.

SD021
la source
Le deuxième point ne peut pas être assez souligné. Assurez-vous de savoir à qui le jeu est destiné (c’est-à-dire que, s’il s’agit d’un jeu occasionnel, vous voudriez l’avoir au moins sous OSX et Windows, donc OpenGL serait la meilleure option). En ce qui concerne le troisième point - et c’est là que le moteur entre en jeu - est également important. Il serait illogique d’utiliser un moteur riche en fonctionnalités et lourd en ressources comme Unreal pour créer un jeu DS. Le point est également lié à ce que j’ai dit concernant le second: Déterminez à qui le jeu est destiné. Si vous optez pour un jeu occasionnel, les ordinateurs de la plupart des gens ne gèrent pas, par exemple, les particules.
7

Essayez d'éviter de disperser #if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endiftout le code.

Parfois, cela semble être le moyen le plus facile, mais cela vous causera des problèmes à long terme. Vous devriez essayer de les limiter à leur propre fichier, afin que chaque implémentation de plate-forme soit autonome.

L'ajout d'une plate-forme devrait principalement concerner l'ajout de nouveaux fichiers d'implémentation, et simplement modifier les quelques fichiers existants nécessaires.

NocturnDragon
la source
4

Il y a beaucoup de bibliothèques qui sont elles-mêmes multiplates-formes; vous n'avez pas besoin d'écrire directement dans OpenGL pour fonctionner n'importe où. OGRE est un excellent exemple de moteur de rendu qui fonctionne sur toute plate-forme que vous souhaitez nommer.

D'après mon expérience, la principale préoccupation concerne votre système de construction. Si vous développez sous Windows avec Visual Studio, votre code peut être compilé sous Linux, mais vous aurez du mal à le générer facilement. Examinez les systèmes de compilation tels que CMake, qui peuvent utiliser les mêmes instructions de génération pour générer des fichiers de projet spécifiques à la plate-forme (makefiles sur Linux, VS Projects sous Windows, XCode Projects sous Mac, etc.).

Karantza
la source
4

Lorsque vous écrivez vos fonctions pour enregistrer et charger des fichiers, ou que vous communiquez sur un réseau, n’oubliez pas l’ endianness .

Au lieu de lire une grande structure avec un seul appel à fread / fwrite ou quelque chose de tel niveau bas, créez un ReadByte / WriteByte et un ReadFloat / WriteFloat. Vous disposerez alors de moins de places pour effectuer des modifications si vous décidez de cibler une autre plateforme ultérieurement.

kevin42
la source
+1 * 9000. Je suppose que cela ne s'appliquerait vraiment qu'aux téléphones mobiles en termes d'architectures modernes / usagées (RISC); mais toujours crucial.
Jonathan Dickinson