Je travaille actuellement sur des applications multi-plateforme et était tout simplement curieux de savoir comment les autres abordent des problèmes tels que:Quelle est votre façon préférée de gérer le développement multiplateforme?
- endianess
- soutien à virgule flottante (certains systèmes émulent dans le logiciel, très lent)
- I/O systèmes (par exemple l'affichage, le son, l'accès aux fichiers, réseau, etc.)
- Et bien sûr, la pléthore des différences de compilateur
Il est évident que cela est ciblé sur des langages comme c/C++ qui ne font pas abstraction de la plupart de ces choses (contrairement à java ou C#, qui ne sont pas supportés par beaucoup de systèmes).
Et si vous étiez curieux, les systèmes sur lesquels je travaille sont la Nintendo DS, la Wii, la PS3, la XBox360 et le PC.
EDIT
Il y a eu beaucoup de réponses vraiment bien ici, allant de la façon de gérer les différences vous-même, aux suggestions de la bibliothèque (même la suggestion de simplement donner et à l'aide du vin). Je ne cherche pas vraiment de solution (j'en ai déjà une), mais j'étais curieux de savoir comment les autres s'attaquaient à cette situation car il est toujours bon de voir comment les autres pensent/codent pour continuer à évoluer et à évoluer.
Voici comment j'ai abordé le problème (et, si vous ne l'avez pas deviné dans cette liste de systèmes ci-dessus, je développe des jeux console/windows). Gardez à l'esprit que les systèmes sur lesquels je travaille n'ont généralement pas de bibliothèques multi-plateformes déjà écrites pour eux (Sony recommande en fait d'écrire son propre moteur de rendu à partir de zéro et d'utiliser simplement leur implémentation OpenGL qui ne suit pas normes de toute façon, comme référence).
endianess
Tous nos actifs peuvent être fabriqués sur mesure pour chaque système. Toutes nos données brutes (à l'exception des textures) sont stockées en XML que nous convertissons en un format binaire spécifique au système lors de la construction du projet. Étant donné que nous développons des consoles de jeu, nous n'avons pas besoin de nous soucier du transfert de données entre plates-formes avec des formats différents (seul le PC permet aux utilisateurs de le faire, donc il est également isolé des autres systèmes) .
flottantes
La plupart des systèmes modernes prennent en charge des points ne valeurs à virgule flottante fin, l'exception est la Nintendo DS (et GBA, mais c'est à peu près une plate-forme morte pour nous ces jours-ci). Nous traitons cela à travers 2 classes différentes. La première est une classe de "point fixe" (modèle, peut spécifier quel type d'entier à utiliser et combien de bits pour la valeur décimale) qui implémente tous les opérateurs arithmétiques (en prenant soin des changements de bits) et automatise les conversions de type. La seconde est une classe de "virgule flottante", qui est essentiellement une enveloppe autour du flotteur pour la plupart, la seule différence est qu'elle implémente également les opérateurs de décalage. En implémentant les opérateurs de décalage, nous pouvons ensuite utiliser des changements de bits pour des multiplications/divisions rapides sur la DS, puis passer en toute transparence à des plates-formes qui fonctionnent mieux avec des flottants (comme le XBox360).
E/S Systèmes
Ceci est probablement le problème le plus délicat pour nous, parce que chaque système a leur propre méthode d'entrée de commande, graphiques (XBox360 utilise une variante de DirectX9, PS3 a OpenGL ou vous pouvez écrire votre propre à partir de zéro et la DS et Wii ont leurs propres systèmes propriétaires), le son et la mise en réseau (en réalité, seul le protocole DS diffère de beaucoup, mais ils ont chacun leur propre système de serveur que vous devez utiliser). La façon dont nous avons fini par aborder ceci était simplement d'écrire des wrappers de haut niveau pour chacun des systèmes (par exemple des maillages pour les graphiques, des systèmes de mappage de touches pour les contrôleurs, etc.) et tous les systèmes utilisent les mêmes fichiers d'en-tête. accès. Il suffit ensuite d'écrire des fichiers cpp spécifiques pour chaque plate-forme (formant ainsi «le moteur»).
Différences de compilation
C'est une chose qui ne peut pas être abordé trop facilement, car nous rencontrons des problèmes avec les compilateurs, nous enregistrons habituellement les informations sur un wiki local (pour que les autres peuvent voir ce qu'il faut pour et les solutions de contournement pour aller avec elle) et si possible, écrivez une macro qui va gérer la situation pour nous. Bien que ce ne soit pas la solution la plus élégante, cela fonctionne et vu que certains compilateurs sont simplement cassés à certains endroits, les solutions les plus élégantes ont tendance à casser les compilateurs de toute façon. (Je souhaite juste que tous les compilateurs implémentent la commande "#pragma once" de Microsoft, beaucoup plus facile que de tout empaqueter dans # ifdef)
je suis d'accord avec vous, l'utilisation de bibliothèques multi-plateformes est un très bon moyen de résoudre ce problème – thrantir