2009-12-27 2 views
1

La question est plutôt "simple". J'ai un moteur qui peut fonctionner avec DirectX9 et DirectX10 avec SlimDX en C#. J'utilise la classe Stopwatch pour chronométrer le jeu et tester la vitesse d'une routine. Bizarrement, juste après la création du DirectX9, le point flottant du StopWatch devient fou et la division GetTimeStamp()/Frequency renvoie uniquement des valeurs entières (simples avec .000000). Pourquoi ça? Veuillez noter qu'avec DirectX10, ce problème n'est pas présent. (Si je fais le contrôle juste avant d'ouvrir l'appareil en DirectX9 il fonctionne, juste après ne pas.)StopWatch renvoie Entier après la création du périphérique DirectX

Ce code utilise i pour les deux versions (DirectX10 et DirectX9)

(Double)Stopwatch.GetTimestamp() * 1000d/(Double)Stopwatch.Frequency 

Tous les indices ?

EDIT: J'ai testé en utilisant QueryPerformanceCounter, mais le résultat est le même. Calcul parfait avant de créer l'appareil DirectX9, seul l'entier après.

EDIT2: Après quelques tests j'ai réussi à lui montrer des valeurs à virgule flottante mais elles sont assez différentes de celles du DirectX10 en précision.

est Voici quelques exemples:

DirectX10

création de formulaire: 110,09241
LoadContent complète: 738,64486
LoadContent ContentManager: 593,57572

DirectX9

création de formulaire: 112,45000
LoadContent Plein : 489,50000
LoadContent ContentManager: 355,50000

EDIT3: Testée sur une autre machine et le résultat est le même ... avant la création de l'appareil tout ok, après seulement ... entier

Répondre

2

Par défaut, Direct3D 9 réduit la précision du flottant à 32 bits. Vous pouvez empêcher cela en utilisant le drapeau D3DCREATE_FPU_PRESERVE. Dans SlimDX, vous utiliseriez l'indicateur SlimDX.Direct3D9.CreateFlags.FpuPreserve lors de la création de l'appareil.

+0

Désolé, mais je doute que ce soit le problème. Car si j'utilise la classe StopWatch (instanciée) avec les méthodes Start() et Stop(), tout fonctionne correctement. Seulement si j'utilise TimeStamps tout va mal. De toute façon, voici son pas la question de la précision (précision de 32 bits serait fantastique XD), il renvoie des plaines entiers ou 0,50000. – feal87

+0

Pourquoi ne pas l'essayer et voir? Étant donné que les horodatages ont de très grandes valeurs, une précision de 32 bits pourrait très bien en être la cause. – interjay

+0

Je vais l'essayer juste savoir :) – feal87

Questions connexes