繁体   English   中英

C ++-(DirectX11)如何在类中使用线程

[英]C++ - (DirectX11) How to use a thread within a class

我目前有一个使用DirectX11的项目,该项目基于Hill算法生成随机地形。 我有一个设置,您可以在其中更改地形(种子,山丘数量等)的输入,然后重新初始化并观看地形逐山生成。 这样的问题是(如您所料)FPS损失很大,但是在尝试移动照相机时,照相机也会结结巴巴。 本质上,我想做的是为terrain hill step创建一个线程,以使生成不会干扰帧时间,从而不会干扰相机(因此相机仍可以无缝移动)。 我看了一些资源,但我仍然无法正确理解线程。

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

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);
    }

在render方法期间,调用方法以生成新的山丘:

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

    MainPass();
}

用于添加到地形的方法:

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

我以为为reintTerrain创建了一个线程,但是我不完全确定如何在类中正常进行此工作,因为我要求它在完成后停止添加山丘。

谢谢您的帮助

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM