Convert.ToDecimal在加载DirectX / Direct3D时给出不同的结果

时间:2012-04-10 21:11:19

标签: c# mysql direct3d

我正在将数据从MySQL数据库加载到C#.NET应用程序中。数据作为DBType.Double保存在数据库中,但是为了在我的应用程序中使用,我使用Convert.ToDecimal()强制转换为Decimal。数据是测量中使用的位置数据,可用于在Direct3D窗口中显示3D模型。

当未加载Direct3D窗口,因此未加载Direct3D dll时,转换工作正常,因此数据库中保存的值如1769301.6485186936,5880300.8152837148将加载为1769301.64851869,5880300.81528371。但是,如果我已加载Direct3D模块,则转换结果将转换为相同的值,转换为1769301.7112576,5880300.79401984。

基本代码如下,其中顶点是3个十进制值X,Y和Z的类/结构。

List<vertex> positions = new List<vertex>();

using (MySqlCommand cmd = new MySqlCommand("SELECT x, y, z FROM positionTable;", conn))
{

  MySqlDataReader dr = cmd.ExecuteReader();
  try
  {
    while (dr.Read())
    {
      vertex position = new vertex();
      position.X = Convert.ToDecimal(dr[0]);
      position.Y = Convert.ToDecimal(dr[1]);
      position.Z = Convert.ToDecimal(dr[2]);

      positions.Add(position);
    }
  }
}

1 个答案:

答案 0 :(得分:5)

创建Direct3D设备时,您需要指定D3DCREATE_FPU_PRESERVE in D3DCREATE。如果没有这个,DirectX(9)将切换线程以使用单精度浮点运算,即使在托管代码中也会对数值计算产生影响。