Avez-vous des conseils / recommandations pour créer un jeu multiplate-forme en C / C ++?
Avez-vous des conseils / recommandations pour créer un jeu multiplate-forme en C / C ++?
Réponses:
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?
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.
Essayez d'éviter de disperser #if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endif
tout 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.
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.).
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.
#ifdef PLATFORM_WIN
ftw