11
votes

Quand s'inquiéter de l'endianness?

J'ai vu d'innombrables références sur l'endansion et ce que cela signifie. Je n'ai aucun problème à ce sujet ... Cependant, mon projet de codage est un jeu simple à exécuter sur Linux et Windows, sur le matériel standard "Gamer". Dois-je m'inquiéter de l'endansion dans ce cas? Quand devrais-je avoir besoin de m'en soucier? Mon code est simple C et SDL + GL, les seules données complexes sont les fichiers multimédia de base (PNG + WAV + XM) et les données de jeu sont principalement des chaînes, des booléens entiers (pour les drapeaux et tels) et des tableaux de taille statique. Jusqu'à présent, aucun utilisateur n'a eu de problèmes. Je me demande donc si l'ajout de chèques est nécessaire (sera effectué ultérieurement, mais il y a des problèmes plus urgents IMO).


4 commentaires

Cette question me rappelait la fin général Custer. Pas sûr exactement pourquoi ...


Les chaînes (à partir de fichiers de ressources) peuvent être un problème, si vous utilisez un codage comme UTF-16, où chaque valeur de base est> 1 octet.


Merci pour vos réponses. Il est en effet open source mais devrait être utilisé sur le matériel conventionnel PC (en toute honnêteté, je viens de faire la version Linux parce que c'est mon système d'exploitation principal et j'ai un moment plus facile à faire la charge de travail) ... Fondamentalement x86. Il n'y a pas de données en réseau et les fichiers de sauvegarde sont très simples chaînes longues (je n'aijoute aucune "défense de piratage de sauvegarde" ... Le joueur décide finalement et ils tricheront de toute façon). Les données de jeu sont ouvertes à être modifiées ou prises par les utilisateurs. Cela signifie que quelqu'un utilisant un Mac pour modifier ou ajouter des images causerait un crash ou pire? (Erreurs sans blocage clair / débogage)


@kristofera amusant vous mentionnez Custer comme un seul personnage est basé sur lui ...


7 Réponses :


1
votes

Il vous suffit de vous soucier de cela si votre jeu doit fonctionner sur différentes architectures matérielles. Si vous êtes certain que cela fonctionnera toujours sur le matériel Intel, vous pouvez l'oublier. S'il s'exécutent sur Linux, bien que de nombreuses personnes utilisent différentes architectures que d'Intel et que vous devrez y penser.


2 commentaires

En outre, il n'est important que lorsque vous échangez des données entre ordinateurs ou lorsque vous stockez des données au format binaire.


Ou lorsque vous transférez des données en série et que vous devez choisir l'octet d'envoyer d'abord.



1
votes

Distribuez-vous votre jeu dans le formulaire de code source?

Parce que si vous distribuez votre jeu en tant que binaire uniquement, vous savez exactement quels familles de processeur votre jeu sera exécuté. De plus, les fichiers multimédia, sont-ils générés par l'utilisateur (éventuellement via un éditeur de niveau) ou sont-ils vraiment uniquement fournis par vous-même?

S'il s'agit d'un environnement vraiment fermé (vos fichiers binaires de distribution et vos actifs de jeu ne sont pas destinés à être personnalisés), vous connaissez vos propres risques pour les Endians et je ne voudrais personnellement pas tromper avec elle.

Cependant, si vous distribuez une source et / ou si vous espérez que les gens personnaliseront leur jeu, vous avez un potentiel de préoccupation. Cependant, avec la plupart des ordinateurs de bureau / ordinateurs portables autour de ces jours passant à X86, je pense que c'est une préoccupation décroissante.


1 commentaires

J'ai les fichiers de données "juste pose là-bas" intentionnellement des utilisateurs de prendre / éditer / modifier / ajouter des trucs. Les niveaux utilisent un éditeur mais la sortie est une semence et une longue chaîne (je leur suis un peu habitué). Le reste est procédural. Certes, la version la plupart des utilisateurs toucheront seront la Win32 une, qui sera précompilée au moment de la distribution. (En tant qu'AnecDote seulement, j'ai utilisé les constructions Linux ou Source) Merci de votre réponse.



3
votes

Si vous voulez dire un PC par "Matériel de joueur standard", vous n'avez pas à vous soucier de l'endiangité car ce sera toujours petit Endian sur x86 / x64. Mais si vous voulez porter le projet à d'autres architectures, vous devez la concevoir de manière indépendante.


4 commentaires

C'est une bricolage sur le domaine le plus important des problèmes de Endian: la programmation réseau. Toujours convertir entre l'ordre des octets d'hôte et du réseau lors de l'envoi de valeurs multi-octets (comme Int ou Long).


Bon point, vous devez utiliser hton et des fonctions similaires lors de la programmation des sockets. Mais vous utiliserez généralement des bibliothèques qui abstraient ces différences.


@gnud: Non, c'est faux. Si vous vous attendez à ce que tous vos serveurs et vos clients soient petits-Endian, il est pratique de définir un format ou un protocole, y compris des valeurs multi-octets de petites octets. Cela se produit chaque fois qu'un fichier zip est envoyé sur le réseau, car les numéros magiques et les tailles de PKZIP sont peu-endian, pas de commande réseau. Il n'est pas encore écrasé. Si vous avez besoin d'un client ou d'un serveur Big-Endian, vous pouvez échanger en toute sécurité des octets si nécessaire. HTON est nécessaire pour spécifier les adresses et les ports IP, et est un moyen pratique de spécifier des formats de données Safe-Safedian, mais ce n'est pas le seul moyen.


Oui, j'aurais dû dire «sauf si le format du fil définit l'endoignement».



0
votes

Le problème se produit avec la mise en réseau et la manière dont les données sont envoyées et lorsque vous effectuez un tripage de bits sur différents processeurs, car différents processeurs peuvent stocker les données différemment en mémoire.


0 commentaires

1
votes

Chaque fois que vous recevez / transmettez des données d'un réseau, remetber à convertir / depuis l'ordre des octets du réseau et de l'hôte. Les fonctions C HTONS , HTONL ETC ou équivalents de votre langue doivent être utilisés ici.

Chaque fois que vous lisez des valeurs multi-octets (comme UTF-16 caractères ou 32 bits Ints) à partir d'un fichier, car ce fichier aurait pu être originaire d'un système avec une endansité différente. Si le fichier est UTF 16 ou 32, il a probablement une naissance (marquage d'octet-ordre). Sinon, le format de fichier devra spécifier l'endansité d'une manière ou d'une autre.


0 commentaires

0
votes

Je pense que Power PC a l'endansion opposée des planches Intel. Peut-être peut-être avoir une routine qui définit l'endansité dépendant de l'architecture? Je ne sais pas si vous pouvez réellement dire ce que l'architecture matérielle est en code ... peut-être que quelqu'un plus intelligent puis moi connais la réponse à cette question.

Rendre maintenant à votre déclaration "Standard" Gamer H / W, je dirais généralement que vous allez examiner le consommateur hors des solutions d'étagère, c'est vraiment ce que la plupart des joueurs standard utilisent, donc vous allez presque Pour sûr, obtenez le même endian à travers le tableau. Je suis sûr que quelqu'un ne sera pas d'accord avec moi mais c'est ma 0,02 $

ha ... je viens de remarquer sur la droite il y a un lien qui se présente sur la suggestion que j'avais ci-dessus.

Trouvez Endianness à travers le programme AC


0 commentaires

7
votes

TEMPS Lorsque vous devez vous soucier de l'endianesse:

  • Vous envoyez des données binaires entre les machines ou les processus (à l'aide d'un réseau ou d'un fichier). Si les machines peuvent avoir un ordre d'octet différent ou que le protocole utilisé spécifie un ordre d'octets particulier (qu'il devrait), vous devrez faire face à l'endianesse.
  • Vous avez du code qui accède à la mémoire bien que les pointeurs de différents types (disent que vous accédez à un non signé INT via un char * ).

    Si vous faites ces choses que vous avez affaire à des octets d'octet, que vous sachiez que vous le savez ou non - il se peut que vous y occupiez en supposant qu'il soit un moyen ou l'autre, ce qui pourrait fonctionner aussi longtemps que votre code n'a pas à gérer une plate-forme différente.

    Dans une veine similaire, vous devez généralement traiter des problèmes d'alignement dans ces mêmes cas et pour des raisons similaires. Encore une fois, vous pourriez en faire affaire en ne faisant que rien et que tout fonctionne bien parce que vous n'avez pas à traverser les frontières de la plate-forme (qui pourraient revenir vous mordre sur la route si cela devient une exigence).


0 commentaires