[英]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.