使用框架特定类型时要记住哪些因素?

时间:2011-11-24 17:49:07

标签: c++ directx

例如,使用D3DXVECTOR3(一个directX三重浮点数)而不是在函数调用中使用三个浮点数的专家和概念是什么。

所以

Scale(D3DXVECTOR3(1, 1, 1));

而不是

Scale(1, 1, 1);

当您需要使用特定于库的数学函数时,使用第二个并且仅转换为D3DXVECTOR3是否更好?

我还注意到很多库都有自己的浮点数和双打类型等等。想法?

1 个答案:

答案 0 :(得分:1)

让API接受浮动结构而不是浮动本身的一个重要原因是可读性。在任何使用3D图形的应用程序中,您肯定需要使用大量矢量。这更具可读性和可维护性:

D3DXVECTOR Scale(D3DXVECTOR a, double scale)
{
    return D3DXVECTOR(a.x * scale, a.y * scale, a.z * scale);
}

class MyClass
{
public:
    void DoSomething()
    {
        a = Scale(b, 2.0);
        ::D3DXVec3Cross(&out, &a, &b);
    }

private:
    D3DXVECTOR3 out;
    D3DXVECTOR3 a;
    D3DXVECTOR3 b;
};

比这个:

class MyClass
{
public:
    void DoSomething()
    {
        float scale = 2.0;
        a1 = Scale(b1, scale);
        a2 = Scale(b2, scale);
        a3 = Scale(b3, scale);
        // Hypothetical D3DX function accepting floats directly
        ::D3DXVec3Cross(&out1, &out2, &out3, a1, a2, a3, b1, b2, b3);
    }

private:
    float out1;
    float out2;
    float out3;
    float a1;
    float a2;
    float a3;
    float b1;
    float b2;
    float b3;
};

换句话说,它允许自我记录代码。更不用说在需要声明向量时输入的时间更少(一个D3DXVECTOR而不是三个单独的float)。

话虽这么说,通常3D图形库/框架会定义自己的矢量类型和浮点类型,以便跨不同平台和配置实现可移植性。可以简单地定义这些类型如下:

namespace My3DLib
{

    typedef MyFloat float;

    struct MyVector
    {
        MyFloat x;
        MyFloat y;
        MyFloat z;
    };

    MyVector Scale(MyVector a, MyFloat b);
    MyFloat DotProduct(MyVector a, MyVector b);
    MyVector CrossProduct(MyVector a, MyVector b);
   // ...
}