2015-12-09 2 views
0

В настоящее время у меня есть проект с использованием DirectX11, который генерирует случайный ландшафт на основе алгоритма Хилла. У меня есть настройка, по которой вы можете изменять входы на местности (семена, количество холмов и т. Д.), А затем повторно инициализировать и наблюдать за рельефом, созданным холмом на холме. Проблема заключается в том, что (как и следовало ожидать) есть большая потеря FPS, но и такие вещи, как камера, будут заикаться при попытке ее переместить. По существу, то, что я хочу сделать, это создать поток для шага холма местности, чтобы поколение не мешало времени кадра и для камеры (поэтому камера все равно может перемещаться без проблем). Я просмотрел несколько ресурсов, но я до сих пор не понимаю нити правильно.C++ - (DirectX11) Как использовать поток внутри класса

Проверка при переинициализировать местности, во время выполнения метода обновления:

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

метод Calling генерировать новые холмы, во время метода визуализации:

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

    MainPass(); 
} 

Метод используется для добавления к местности:

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

Я предполагаю, что создаю поток для reintTerrain, но я не полностью как правильно сделать эту работу внутри класса, так как я требую, чтобы он прекратил добавлять холмы, когда он закончен.

Спасибо за вашу помощь

+0

В чем ваша проблема? Вы пробовали 'std :: thread (& reintTerrain) .detach()'? –

ответ

0

std::thread Используйте для создания потока. Переместите указатель на точку входа потока на свой конструктор в виде лямбда указателя функции-члена. Экземпляры std::thread могут находиться в частной секции вашего класса. Доступ к полям общего объекта, используемым несколькими потоками, должен быть защищен ограждениями (std::atomic<>, std::atomic_thread_fence), чтобы избежать проблем когерентности кеша.

Смежные вопросы