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

Delphi Discussion :

DirectX & DateTime


Sujet :

Delphi

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 17
    Par défaut DirectX & DateTime
    Bonjour,

    Voilà un petit bogue sympa : J'utilise depuis peu les Headers de DirectX 9 traduits pour Delphi par JEDI (Merci !). Les exemples fournis avec sont très pratiques et indique la marche à suivre pour créer une fenêtre paramétrée pour DirectX. Après l'appel à DXUTCreateDevice, la fonction Now de l'unité SysUtils passe d'une précision à la milliseconde à une précision au 1/256ème de jour soit à peu près 5 minutes et 37,5 secondes.

    Sachant que mon programme se sert de la date pour l'afficher et faire un log, c'est un bogue plutôt gênant. D'autre part, après divers constatations de ma part, il semblerait que le type TDateTime défini pourtant en Double dans l'unité System se comporte alors comme un Single. Ainsi même les constantes de SysUtils perdent en précision. Ainsi DateDelta (le nombre de jours séparant le 1 Janvier de l'an 1 et le 30 décembre de l'an 1899) passe de 693594 "exactement" avant DXUTCreateDevice à 693593.993753133 après, soit presque 9 minutes de différence.

    Bref, je ne savais même pas que c'était possible qu'un tel comportement change PENDANT l'exécution et j'aurais grand besoin de votre savoir....

    Merci beaucoup.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 17
    Par défaut
    Bon bah voilà, l'auteur de la traduction des Headers de DirectX 9 pour Delphi (www.clootie.ru) m'a répondu :
    La différence vient du changement de précision (de Double à Single) effectué au niveau du FPU. En rajoutant D3DCREATE_FPU_PRESERVE à DeviceSettings.BehaviorFlags dans ModifyDeviceSettings(), le problème disparait.

    Et donc, ca n'est pas un bogue !!!

    Hi,

    This is actually "by design". MS loong time ago (when vertex processing was done on CPU) decided to automatically reduce FPU precision to single at time of CreateDevice() call. You can avoid this in DXUT based applications creating you own ModifyDeviceSettings() that changes DeviceSettings.BehaviorFlags flag to include D3DCREATE_FPU_PRESERVE flag. This flag is later used while calling pD3D.CreateDevice(pNewDeviceSettings.AdapterOrdinal, pNewDeviceSettings.DeviceType, DXUTGetHWNDFocus, pNewDeviceSettings.BehaviorFlags, @pNewDeviceSettings.pp, pd3dDevice);

    Another (quite often recommended) way - is to separate contol logic and draw login in your app. So you recalculate everything and on subroutine with FPUcontrol set to full precision and exceptions enabled (Delphi default) and later disable exceptions and set FP precision to single before calling Direct3D drawing functions (or any other C/C++ code).

    -Alexey


    PS. Actually just loading DLL can lead to change to FPU control word, so be aware to this too.

    Hi,

    First, I thank you for the DirectX SDK in Delphi. Nice Job !

    As I was building my project, I've seen the following strange bug. After calling DXUTCreateDevice, Delphi function Now return a date rounded to ... 5 minutes 37,5 sec. There is a simple way to see this bug :
    1. Open the Text3D sample in DirectX 9.0 SDK.

    2. In Text3DUnit, line 485 ("Demonstration Part 2"), add the two following lines :
    SetRect(rc, 10, nHeight - 15*8, 0, 0);
    g_pFont2.DrawTextA(g_pTextSprite, PChar(TimeToStr(500 + Time) + ' <=> ' + TimeToStr(Time)), -1, @rc, DT_NOCLIP, D3DXColorToDWord(D3DXColor( 1.0, 1.0, 1.0, 1.0)));

    3. Run the project. Could you explain why the left time value increases by 4 seconds ? If you replace "500 + Time" by "Now", it's worth !

    In fact, TDateTime seems to contains a single value not a double as it's defined in SysUtils unit. More over, values of constants in SysUtils lose precision after DXUTCreateDevice (DateDelta lose approximatively 9 minutes).

    I don't know if you're able to answer or if you have time to. However, i think you could be interested by this bug.

    Bye

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

Discussions similaires

  1. Directx ou opengl
    Par scorpiwolf dans le forum DirectX
    Réponses: 13
    Dernier message: 07/02/2003, 08h29
  2. OpenGL ou DirectX
    Par Nadir dans le forum DirectX
    Réponses: 6
    Dernier message: 02/05/2002, 12h48
  3. Documentation DirectX dans C++Builder 3
    Par srvremi dans le forum DirectX
    Réponses: 1
    Dernier message: 26/04/2002, 09h59

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