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

DirectX Discussion :

DirectX perturbe les calculs ?!?


Sujet :

DirectX

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 264
    Points : 144
    Points
    144
    Par défaut DirectX perturbe les calculs ?!?
    Bonjour,

    Je suis face à un phénomène que je qualifierais de paranormal sauf si quelqu'un arrive à me l'expliquer :

    Le calcul de Math.Pow(10, -1) renvoie tout naturellement la valeur 0.1 ...

    Sauf que lorsque je crée des animations DirectX, j'obtiens de manière répétitive la valeur 0.10000000149011612 !!!!!

    MAIS QUE SE PASSE T-IL ???

  2. #2
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Par défaut lors de la création du device pour favoriser la performance Direct3D passe automatiquement la précision des calculs flottants de double à simple précision. Il est possible de changer ce comportement en faisant appel à l'argument D3DCREATE_FPU_PRESERVE à la création.

    D3DCREATE_FPU_PRESERVE

    MAIS :

    Ce faisant tu changes aussi le comportement des flottants à l'intérieur de Direct3D et ce jusqu'au drivers que Direct3D appelle.

    Si tu veux vraiment faire des calculs en double précision et continuer à utiliser Direct3D et éviter que les calculs internes à Direct3D soient modifiés tu peux :
    - faire tes calculs double précision dans un autre thread que celui qui appele Direct3D (direct3d ne modifie que le thread appelant).
    - sauver le control word avant d'appeler Direct3D et le restaurer après les appels pour tes calculs.

    Tu peux aussi utiliser le flag FPU_PRESERVE, du moment que tu ne fais que modifier la précision (et pas d'autres comportements comme les exceptions flottantes) ça ne devrait pas forcément poser de gros problèmes (tu peux essayer de mesurer les différences de perfs avant et après pour voir si c'est significatif dans ton cas).

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 264
    Points : 144
    Points
    144
    Par défaut
    Merci beaucoup LeGreg !

    Je vais donc tester ces solutions ...

    Par contre, je suis surpris que l'on gagne en performances en passant de double à float ... Il me semblait même que (paradoxalement) ça allait plus vite avec des doubles ...

  4. #4
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Cela dépend du cpu et du type d'opération utilisé.. Typiquement les divisions seraient du genre à bénéficier de moins de précision. Ceci dit comme je dis il vaut mieux faire des benchmarks sur un couple charge donnée/machine en particulier pour voir si ça fait une différence.

    Microsoft a cessé de changer la précision avec Direct3D 10.

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 264
    Points : 144
    Points
    144
    Par défaut
    Bon et bien finalement j'ai opté pour la solution d'ajouter le flag D3DCREATE_FPU_PRESERVE lors de la crétion du divice et ça marche impec !

    La syntaxe est la suivante :

    Device device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing | CreateFlags.FpuPreserve, presentParams);

    Je n'ai pas vu de perte de performances (il faut dire que je fais des graphiques mathématiques 3D qui ne bougent pas trop ...)

    Merci encore LeGreg !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. DirectX, récupérer les images d'une vidéo
    Par edid dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 18/01/2007, 19h05
  2. [PHP-JS] En php, les calculs !
    Par halez dans le forum Langage
    Réponses: 2
    Dernier message: 27/12/2006, 17h53
  3. separer l affichage et les calculs
    Par ggwal dans le forum OpenGL
    Réponses: 9
    Dernier message: 03/03/2006, 11h29
  4. [TP7] Question sur les calculs en tp7
    Par argon dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 07/10/2005, 05h42
  5. Conserver l'affichage pendant les calculs ?
    Par ceugniet dans le forum C++Builder
    Réponses: 5
    Dernier message: 31/03/2004, 12h19

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