静态函数的意外行为

Unexpected Behavior of a Static Function

本文关键字:意外 静态函数      更新时间:2023-10-16

我正在做一个DX11项目,我遇到了一个静态函数的奇怪行为。我对静态函数有点不了解,所以我可能在某个地方犯了一个错误。

我的函数很简单:

namespace Rendering
{
    static bool PlaceObjectInMatrix(EntityBase* obj, D3DXMATRIX world)
    {
        D3DXMatrixTranslation(&world, obj->GetPosition()->x, obj->GetPosition()->y, obj->GetPosition()->z); 
        return true;
    }
}

并在循环中调用它以呈现所有对象:

for(unsigned int i = 0; i < listSize; i++)
    {
        if(entities[i].taken == false)
            continue; 
        entities[i].entry->Render(deviceContext, shader);
        PlaceObjectInMatrix(entities[i].entry, worldMatrix);
        if(entities[i].entry->GetIndexCount() != 0) 
        {
            shader->Render(deviceContext, entities[i].entry->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, entities[i].entry->GetTexture(), m_debugLight->GetDirection(), m_debugLight->GetDiffuseColor());
            objectsRendered++;
        }
        d3d->GetWorldMatrix(worldMatrix); //reset world matrix
    }

但是,它不起作用。但是,当我用函数本身中的内容替换带有函数调用的行时,它确实有效。就像在函数调用中丢失了某些东西一样。

EntityBase 类

是抽象的,我实际渲染的类称为 EntityModelStatic,它派生自 EntityModel。

PlaceObjectInMatrix(( 函数在 worldMatrix copy 上运行。要更改原始矩阵,您必须像这样声明函数:

static bool PlaceObjectInMatrix(EntityBase* obj, D3DXMATRIX& world);

更传统的方法是使用指针,如下所示:

static bool PlaceObjectInMatrix(const EntityBase& obj, D3DXMATRIX* world);

这样,任何阅读调用代码(如PlaceObjectInMatrix(*entities[i].entry,&worldMatrix(的人都会意识到,该函数将改变worldMatrix对象。

static bool PlaceObjectInMatrix(EntityBase* obj, D3DXMATRIX world)

world 参数按值传递,因此函数获取自己的副本,并且调用方中的变量不会更改。 这可能是您的问题。

使用指针(如D3DXMatrixTranslation(或引用,您的问题可能会消失。