2009-12-27 42 views
1

這個問題很「簡單」。 我有一個引擎,可以與C#中的SlimDX一起使用DirectX9和DirectX10。 我使用Stopwatch類來計時遊戲和測試一些例程的速度。 奇怪的是,在創建DirectX9之後,StopWatch的浮點變得瘋狂,GetTimeStamp()/頻率分割只返回整數值(單個爲.000000)。爲什麼這個? 請注意,使用DirectX10時,此問題不存在。 (如果我做了檢查只是在DirectX9的它的工作原理打開設備前,只是做後不。)StopWatch在創建DirectX設備後返回整數

這是我使用兩個版本的代碼(的DirectX10和DirectX9的)

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

任何線索?

編輯:我使用QueryPerformanceCounter測試,但結果是一樣的。在創建DirectX9設備之前完美計算,之後只有整數。編輯2:經過一些測試,我設法讓它顯示一些浮點值,但它們與精度上的DirectX10非常不同。

下面是一些例子:

的DirectX10

表單創建:110.09241
LoadContent全:738.64486
LoadContent ContentManager:593.57572

DirectX9的

表單創建:112.45000
LoadContent充分:489.50000
LoadContent ContentManager:355.50000

EDIT3:測試另一臺機器上,其結果是一樣的... ...設備的創建之前,一切ok,僅後...整數

回答

2

默認情況下, Direct3D 9將浮點精度降低到32位。您可以使用D3DCREATE_FPU_PRESERVE標誌來防止這種情況。在SlimDX中,創建設備時您將使用SlimDX.Direct3D9.CreateFlags.FpuPreserve標誌。

+0

對不起,但我懷疑這是問題所在。因爲如果我用Start()和Stop()方法使用StopWatch類(instanced),一切正常。只有當我使用TimeStamps時,一切都會出錯。 無論如何,這不是關於精度的討論(32位精度將是奇妙的XD),它返回平原整數或.50000。 – feal87 2009-12-28 14:20:01

+0

你爲什麼不嘗試看看?由於時間戳具有非常大的值,32位精度很可能是原因。 – interjay 2009-12-28 14:42:08

+0

我會試試吧知道:) – feal87 2009-12-28 14:43:46

相關問題