Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-(DirectX11)如何在类中使用线程_C++_Multithreading_Directx - Fatal编程技术网

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

C++ C++;-(DirectX11)如何在类中使用线程,c++,multithreading,directx,C++,Multithreading,Directx,我目前有一个使用DirectX11的项目,该项目基于Hill算法生成随机地形。我有一个设置,您可以在其中更改地形的输入(种子、山丘数量等),然后重新初始化并观察逐山丘生成的地形。问题是(正如您所预料的)会有很大的FPS损失,但相机在试图移动时也会结巴。基本上,我想做的是为地形丘陵步骤创建一个线程,这样生成不会干扰帧时间,也不会干扰相机(这样相机仍然可以无缝移动)。我已经查看了一些参考资料,但仍然没有正确理解线程 在更新方法期间,检查何时重新初始化地形: void CThrive::Update(

我目前有一个使用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;
    }
}
我假设我会为ReinterRain创建一个线程,但我不完全确定如何在类中正确地实现这一点,因为我要求它在完成后停止添加Hill


感谢您的帮助

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

您到底有什么问题?您是否尝试过
std::thread(&reinterrain).detach()