Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建DirectX设备后秒表返回整数_C#_.net_Directx_Floating Point_Slimdx - Fatal编程技术网

C# 创建DirectX设备后秒表返回整数

C# 创建DirectX设备后秒表返回整数,c#,.net,directx,floating-point,slimdx,C#,.net,Directx,Floating Point,Slimdx,这个问题相当“简单”。 我有一个引擎,可以与DirectX9和DirectX10一起使用C#中的SlimDX。 我使用秒表类来计时游戏,并测试一些例行程序的速度。 奇怪的是,在创建DirectX9之后,秒表的浮点变得疯狂,GetTimeStamp()/Frequency除法只返回整数值(带.000000的单数值)。为什么会这样? 请注意,对于DirectX10,此问题不存在。(如果我在DirectX9中打开设备之前进行检查,它可以工作,但在不工作之后进行检查。) 这是我用于两个版本(Direct

这个问题相当“简单”。 我有一个引擎,可以与DirectX9和DirectX10一起使用C#中的SlimDX。 我使用秒表类来计时游戏,并测试一些例行程序的速度。 奇怪的是,在创建DirectX9之后,秒表的浮点变得疯狂,GetTimeStamp()/Frequency除法只返回整数值(带.000000的单数值)。为什么会这样? 请注意,对于DirectX10,此问题不存在。(如果我在DirectX9中打开设备之前进行检查,它可以工作,但在不工作之后进行检查。)

这是我用于两个版本(DirectX10和DirectX9)的代码

有什么线索吗

编辑:我使用QueryPerformanceCounter进行了测试,但结果是一样的。在创建DirectX9设备之前进行完美计算,之后仅进行整数运算

EDIT2:经过一些测试,我设法让它显示一些浮点值,但它们在精度上与DirectX10有很大不同

下面是一些例子:

DirectX10

表单创建:110.09241
满载内容:738.64486
LoadContent内容管理器:593.57572

DirectX9

表单创建:112.45000
满载内容:489.50000
LoadContent内容管理器:355.50000


EDIT3:在另一台机器上测试,结果相同…在创建设备之前,一切正常,仅在整数之后…

默认情况下,Direct3D 9将浮点精度降低到32位。您可以使用
D3DCREATE\u FPU\u PRESERVE
标志防止这种情况。在SlimDX中,您在创建设备时会使用
SlimDX.Direct3D9.CreateFlags.FpuPreserve
标志。

抱歉,但我怀疑这是问题所在。因为如果我使用StopWatch类(实例化)和Start()和Stop()方法,一切都正常。除非我使用时间戳,否则一切都会出错。无论如何,这里不是关于精度的讨论(32位精度将是很棒的XD),它返回整数或.50000。为什么不试试看呢?由于时间戳的值非常大,32位精度很可能是原因。是的,就是这样。StopWatch类工作起来非常奇怪,因为它应该在内部使用相同的QueryPerformanceCounter。。。
(Double)Stopwatch.GetTimestamp() * 1000d / (Double)Stopwatch.Frequency