C ++ - (DirectX11)如何在类

时间:2015-12-09 00:42:03

标签: c++ multithreading directx

我目前有一个使用DirectX11的项目,它根据Hill算法生成随机地形。我有一个设置,您可以在其中更改地形上的输入(种子,山丘数量等),然后重新初始化并观察山坡上生成的地形。这个问题是(正如你所料)会有很大的FPS损失,但是当试图移动它时,相机之类的东西也会断断续续。基本上,我想要做的是为地形山步创建一个线程,这样生成不会干扰帧时间,从而干扰相机(因此相机仍然可以无缝移动)。我查看了一些资源,但我仍然没有正确理解线程。

在更新方法期间检查何时重新初始化地形:

void CThrive::Update(float frameTime)
{
    CKeyboardState kb = CKeyboardState::GetKeyboardState(mWindow->GetHWND());

    mCamera->Update(kb, frameTime);

    if (mGui->Reint())
    {
        SafeDelete(mTerrain);
        mTerrain = new CTerrain(mGui->GetTerrSize(), mGui->GetTerrMin(), mGui->GetTerrMax(), mGui->GetTerrNumHills(), mGui->GetTerrSeed());

        mNewTerrain = true;
        mGui->SetReint(false);
    }

在渲染方法期间调用方法生成新的山丘:

void CThrive::Render()
{
    if (mNewTerrain)
    {
        reintTerrain();
    }

    MainPass();
}

用于添加到地形的方法:

void CThrive::reintTerrain()
{
    if (!mTerrain->GenerationComplete())
    {
        mTerrain->GenerateStep(mGraphicsDevice->GetDevice());
    }
    else
    {
        mNewTerrain = false;
    }
}

我假设我为reintTerrain创建了一个帖子,但我并不完全确定如何在课堂上正确地完成这项工作,因为我要求它在完成后停止添加山峰。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

使用std::thread创建线程。将指向线程的入口点的指针作为成员函数指针的lambda传递给它的构造函数。 std::thread的实例可能位于您班级的私有部分。对多个线程使用的共享对象的字段的访问应受到围栏(std::atomic<>std::atomic_thread_fence)的保护,以避免缓存一致性问题。