1

我现在正在用 C++ 构建一个函数,当我点击屏幕时,它可以让我在我的 3D 应用程序中创建定向射线。我目前正在计算一些 x 和 y,但问题是我std::cout对 x 和 y 进行了计算,值保持不变。如果我删除static关键字这工作正常,但我想将其保留为静态局部变量,因为我将多次使用此函数,那么究竟是什么问题或我到底做错了什么,使它打印相同的值一直在外面?

继承人的功能:

void Mouse::GetClickDirection(D3DXMATRIX projMatrix)
{
    static POINT mousePoint;
    GetCursorPos(&mousePoint);

    ScreenToClient(hwnd, &mousePoint);

    static float width = (float)backBufferWidth;
    static float height = (float)backBufferHeight;

    static float x = (2.0f * mousePoint.x / width - 1.0f) / projMatrix(0, 0);
    static float y = (-2.0f * mousePoint.y / height + 1.0f) / projMatrix(1,1);

    D3DXVECTOR3 origin(0.0f, 0.0f, 0.0f);
    D3DXVECTOR3 dir(x, y, 1.0f);

    system("CLS");
    std::cout << "X: " << x << std::endl;
    std::cout << "Y: " << y << std::endl;

}
4

4 回答 4

2

这正是static关键字的含义,变量只被初始化一次。从您的代码中,您的变量值仅在初始化程序中更改,每次程序执行仅执行一次。由于它们依赖于参数,因此它们不能是静态的。如果要保留依赖于参数的值,则需要维护某种形式的缓存,但是,与使用每个函数调用初始化变量相比,开销可能更大。

于 2013-10-23T14:46:44.610 回答
2

这里没有理由使用静态变量。

初始化本地静态变量后,除非您明确为其分配新值,否则它不会更新。
你正在做的是初始化,而不是赋值。

如果您担心效率,则使用本地静态变量很可能效率较低——它们至少需要一次初始化检查(在每个函数调用上),并且可能需要一两次缓存未命中来获取值。

于 2013-10-23T14:54:04.543 回答
1

我的猜测是你必须分开变量定义和赋值:

static float x;
static float y;
x = (2.0f * mousePoint.x / width - 1.0f) / projMatrix(0, 0);
y = (-2.0f * mousePoint.y / height + 1.0f) / projMatrix(1,1);

因为初始化只进行一次。

于 2013-10-23T14:56:01.953 回答
0

不要让他们staticstatic局部变量最多初始化一次,当函数第一次被调用时(正式地,当执行第一次通过初始化程序时,但在这段代码中没有相关的区别),所以在后续调用xy保留它们的旧值。这些没有理由是静态的。

于 2013-10-23T14:50:45.480 回答