D3DCREATE_FPU_PRESERVE

地质模型控件在加入到c++写的油藏平面图软件之后出现了几个问题:

1.第一次打开图成功,再次打开报运行时错误并且整个系统崩溃

2.关闭三维窗口后软件其他功能也打不开了而且第一次打开的数据显示也不正常 

解决办法:

查到类似资料如下:

在FPU中,却存在着三种运算精度:single precision(24bits),double precision(53bits)(一般应用程序启动时的精度),double extended precision(64bits,很少用)。FPU的默认精度是53bits的double precision。D3D的CreateDevice函数调用后会将FPU的运算精度改成24bits。除非指定了D3DCREATE_FPU_PRESERVE参数,否则不能你的应用程序浮点精度也会降低。
  悲剧的是你不能确认dx或者其他3d程序是否给你切换回来,特别调试时候经常非正常退出,感觉有些dx版本或者显卡硬件可能也有bug,即使设置D3DCREATE_FPU_PRESERVE也不能保证切换回来。这时我们需要手动切换
    unsigned int uiFloat;
    _controlfp_s(&uiFloat, 0, 0);
    _controlfp_s(0, _PC_53, MCW_PC);  //切换到double精度

    .......
    _controlfp_s(0, uiFloat, MCW_PC);  //切换到原来的精度

crt 运行库默认是double精度的

 

对应的c#代码则是在创建device的时候

            CreateFlags flags;
            flags = CreateFlags.HardwareVertexProcessing ;

            Device device = new Device(0, DeviceType.Hardware, this.Handle, flags, presentParameters);
CreateFlags修改为:

            CreateFlags flags;
            flags = CreateFlags.HardwareVertexProcessing | CreateFlags.FpuPreserve;

及解决了此问题。

posted on 2011-08-22 18:01  芸芸  阅读(416)  评论(1)    收藏  举报

导航