IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

quake 3 isqrt en C++ ?


Sujet :

C++

Vue hybride

deadalnix quake 3 isqrt en C++ ? 17/08/2008, 22h29
deadalnix J'ai trouvé la solution en... 18/08/2008, 08h00
Laurent Gomila Les unions ça fonctionne ne... 18/08/2008, 09h01
deadalnix Je sais bien, mais je suis... 18/08/2008, 10h23
Invité ça c'est le genre de code C... 18/08/2008, 11h03
yan Salut. Attention... 18/08/2008, 09h09
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut quake 3 isqrt en C++ ?
    Bonjour, c'est encore moi avec mes problèmes tordus Je suis en pleine période je martyrise mon pauvre gcc.

    Au menu du jour, la fonction qui calcule l'inverse d'une racine carré a la sauce quake 3. L'original est en C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        long i;
        float x2, y;
        const float threehalfs = 1.5F;
     
        x2 = number * 0.5F;
        y  = number;
        i  = * ( long * ) &y;  // evil floating point bit level hacking
        i  = 0x5f3759df - ( i >> 1 ); // what the fuck?
        y  = * ( float * ) &i;
        y  = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
        // y  = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
        return y;
    Voila ce que donne l'original.

    Mais ici on est en C++ et ces cast mode C ne font pas propres ! j'ai donc essayé différentes chose, mais impossible de faire gober ca a mon gcc sans qu'il ne se fache :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i = reinterpret_cast<long>(y);   // evil floating point bit level hacking
    Donne une erreur : invalide cas from type float to type long int.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i = *reinterpret_cast<long*>(&y);   // evil floating point bit level hacking
    Donne quand a lui attention : déréférencement du pointeur type-punned brisera les strictes d'aliases . Il est possible de compiler quand même mais le code ne fonctionne pas.

    Google ne m'aide pas beaucoups sur ce coup la. je crois qu'il ne m'aime aps ces temps-ci . . .

    A noter que sans l'option de compilation -O3, le second code marche.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut
    J'ai trouvé la solution en fouinant sur cette page : http://gcc.gnu.org/onlinedocs/gcc/Op...timize-Options

    Il faut utiliser une union du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    union converter {
       long i;
       float y;
    };

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Les unions ça fonctionne ne pratique mais pas en théorie, donc à éviter. Ceci-dit je pense qu'il n'y a que ça qui fonctionne avec les options d'optimisations poussées.

    A part ça, les hacks de ce genre c'est bien mais c'est plus trop utile. Si tu finis ton jeu et lances un profiler, tu verras que ce n'est pas là que les pertes de performances se trouvent. Alors ne te prends pas trop la tête avec ce genre de code.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    A part ça, les hacks de ce genre c'est bien mais c'est plus trop utile. Si tu finis ton jeu et lances un profiler, tu verras que ce n'est pas là que les pertes de performances se trouvent. Alors ne te prends pas trop la tête avec ce genre de code.
    Je sais bien, mais je suis dans une période ou je teste un peu tout et n'importe quoi pour voir comment ça réagit. Je ne compte pas recoder intégralement la lib mathématique

  5. #5
    NairodDorian
    Invité(e)
    Par défaut
    ça c'est le genre de code C totalement inutile et illisible mais optimisé.
    deux instructions asm et c'est réglé avec des perfs supérieur.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut
    Je ne penses pas que carmack ou tarolli puissent être traités de branlo faisant du mauvais code

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut.
    Attention normalement, le chiffre magique ne fonctionne que sur 32 bits et
    long et float doit être de même taille.

    Si ca t'intéresse, voici un benchmark
    ktd.club.fr/programmation/fichiers/FastMath.pdf

Discussions similaires

  1. Support des shaders quake III : Irrlicht, Ogre ou aucun ?
    Par inertia dans le forum Moteurs 3D
    Réponses: 2
    Dernier message: 27/02/2006, 20h00
  2. Model de quake 3
    Par Wyatt dans le forum OpenGL
    Réponses: 3
    Dernier message: 30/11/2005, 10h00
  3. Code source Quake 3
    Par SteelBox dans le forum OpenGL
    Réponses: 20
    Dernier message: 29/08/2005, 10h40
  4. Quake 3: couldn't open openGL
    Par poxvx dans le forum OpenGL
    Réponses: 2
    Dernier message: 25/06/2003, 17h53
  5. bsp Quake 2
    Par Argh! dans le forum OpenGL
    Réponses: 3
    Dernier message: 12/09/2002, 17h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo