簡體   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