![]() |
|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Ouvrir sur le forum | Recherche | Messages du jour | Marquer les forums comme lus |
Tutoriels Tutoriels dédiés au développement sur d'autres supports |
Publicité |
![]() |
|
Outils de la discussion | Modes d'affichage |
![]() |
#1 |
Super Modérateur
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 229
|
![]() Hello tout le monde
![]() Voici un tuto qui vous permettra de créer et manipuler des nombres à virgule fixe très simplement en C++, comme si c'étaient des float, mais avec une énorme amélioration de vitesse: Code PHP:
![]() Tout d'abord, on va devoir travailler en C++, car le C ne permet pas de faire ça (si vous voulez faire du C, regardez un autre tuto sur les fixed point ![]() Bien heureusement, le C est compatible C++ (mais pas l'inverse) et en général un programme C compilera en C++ sans souci. Il suffit de renommer les fichiers .c en .cpp pour spécifier que c'est du C++. Note: Les performances d'un même programme peuvent varier suivant qu'il est compilé en C ou en C++. Pour créer ce nouveau type de données, nous allons profiter des fonctionnalités propres au C++ que sont les classes et la surcharge d'opérateurs. Tout d'abord, une classe, c'est simplement une évolution des structures en C: elle est designée pour contenir plusieurs paramètres, tel qu'un objet dans un jeu: Code PHP:
Code PHP:
Code PHP:
Code PHP:
Code PHP:
C'est également possible pour toutes les autres opérations, comme l'addition, où on peut dire que 'fixed + x' est équivalent à 'fixed.value + x * 256'. Sans oublier les autres types, par exemple la valeur entière: '(int)fixed = fixed.value / 256'. Pour le code: Code PHP:
Finalement, suite à un assignement, on doit toujours retourner la valeur de l'assignement lui même, c'est une spécificité du C/C++: (i = 2) * 3 => 6. En l'occurence, la valeur de retour c'est notre classe 'fixed' passée en paramètre, nommée 'f'. Le '&' pour les paramètres est une spécificité du C++, il définit les paramètres passés en référence, comme par exemple: Code PHP:
Finalement, il va falloir écrire du code pour tous les opérateurs vers tous les types supportés (en l'occurence, ma classe gère les int, float et double, et tout ce qui peut être converti vers l'un de ces types, tel que 'short'). Si jamais vous avez besoin de plus d'informations, regardez mon code, car le bout que j'ai présenté ici n'est pas optimisé du tout, c'est juste pour expliquer ![]() Ensuite, si vous incluez mon fichier .h, vous pouvez modifier le #define VIRGULE au début pour y mettre le nombre de bits que vous voulez après la virgule. En général, 12 est une bonne valeur pour les positions de vos personnages, car elle offre une précision à 0.00024 près, tout en laissant 20 bits pour la partie entière (valeurs entre +/- 500'000), donc aucun problème pour les grandes maps ![]() Et l'utilisation se fait comme montré en haut de ce post, exactement comme des floats quoi ![]() Question performances, c'est quand même légèrement plus lent que des fixed faits à la main (enfin ça dépend du compilo, parce que théoriquement ça devrait être pareil s'il fait bien son boulot), et j'ai pas de DS donc je peux pas tester. Ce tuto s'applique également à la GBA et à la PSP ![]() ![]() ![]() Téléchargement: http://oslib.palib.info/oth/fixed_tuto.zip Benchmarks (temps écoulé, plus bas = mieux): Code:
Int (C): 807 Int (C++): 809 Fixed: 933 Float: 1174 Double: 22000 (et augmente selon la taille du nombre) ![]() Voilà, si vous avez des questions, n'hésitez pas ![]()
__________________
[10.12.2018] PatrickBoy: codez vos jeux avec la puissance d'une borne d'arcade 16 bits! [21.01.2010] Emu Game Boy et GUI pour la coloration de jeux GB Partagez vos meilleures musiques de jeu vidéo! ![]() ![]() ![]() Dernière modification par Brunni ; 19/04/2006 à 22h12. |
![]() |
![]() |
Publicité |
![]() |
#2 |
Membre confirmé
Date d'inscription: 14/11/2005
Messages: 346
|
![]() J'ai fait un petit test pour voir si la ds est si lente que ca avec les floats...:
Code:
while(var<1000000) var=var*1.0001; PA_OutputText(1,0,4,"var: %f4 ", var); A-t-on vraiment besoin de multiplier plus de 100 000 fois par seconde un float ? Je ne dis pas que ton tutoriel est inutile, je veux seulement comprendre ![]() |
![]() |
![]() |
![]() |
#3 | |
Bitchy Little Girl...
Date d'inscription: 29/10/2005
Messages: 3 201
|
![]() Citation:
__________________
>> On garde :: On améliore :: On kill << |
|
![]() |
![]() |
![]() |
#4 |
Super Modérateur
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 229
|
![]() Dans ton cas, le compilo optimise de lui-même parce qu'il peut déjà calculer le résultat final à la compilation, c'est pour ça que c'est si rapide
![]() Rêve pas, déjà sur PSP sans le support des float en hardware t'en fais pas 1 million par seconde, donc sur DS y'a aucune chance ![]() Et déjà rien que dans un moteur de collisions si tes positions (et uniquement elles) sont en float tu auras déjà plusieurs dizaines de milliers d'accès par seconde (additions, tests, indices de la map, divisions obligatoires, *60 fps), après si tu les utilises ailleurs (affichage du perso, moteur physique, etc.) ben tu arrives vite à ton million, et à ce moment là tu seras déjà à moins de 0.2 image/seconde, et ça c'est sans parler de tout le reste du code que tu as à faire en dehors de ça ![]() De toute façon on voit bien la différence sur mes benchs, entre 20'000 et 40'000 unités de temps pour un float/double contre moins de 1'000 pour les fixed (sans oublier les conversions à faire entre float/int, le fait qu'on ne peut pas optimiser avec des décalages, ...) donc le choix est vite fait si tu as un minimum besoin de vitesse ![]() |
![]() |
![]() |
![]() |
#5 |
Administrateur
Date d'inscription: 09/11/2005
Messages: 3 750
|
![]() Merci Brunni, si seulement il y avait + de tutos dans le genre
![]() |
![]() |
![]() |
![]() |
#6 |
Membre confirmé
Date d'inscription: 10/11/2005
Messages: 830
|
![]() traitre tu est passé au c++
![]() ![]() ca me servira pas, mais je te dit quand meme merci pour les autres ![]() Dernière modification par Nesgba ; 20/04/2006 à 21h05. |
![]() |
![]() |
![]() |
#7 |
Administrateur
|
![]() merci pour le tuto Brunni !!
c'est vrai que ça manque de tutos depuis le nouveau PA, mais heureusement que tu es là !!! (mais oui toi aussi yodajr ![]()
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner] Projet en cours: [Ne plus abandonner de projet...] |
![]() |
![]() |
![]() |
Liens sociaux |
Publicité |
Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invité(s)) | |
Outils de la discussion | |
Modes d'affichage | |
|
|