Проблема генерации мира с резьбой - PullRequest
1 голос
/ 20 мая 2019

Я пытаюсь создать систему мирового поколения. У меня есть мировой класс, который содержит карту местности, которую можно увеличить во время программы. Когда я делаю это в основном потоке, он работает нормально, но они немного замирают, когда он вычисляет вершину и все, поэтому я попытался использовать поток.

Итак, чтобы создать ландшафт, я делаю это:

        std::thread newThread(&World::addTerrain, this, xIndex, zIndex, 64, 64);

        newThread.detach();

(метод addTerrain)

void World::addTerrain(int x, int z, size_t len, size_t col) {
    //allTerrain_[x].emplace(std::make_pair(z, Terrain(x*size_, z*size_, size_ / 2.0f, len, col, &shader_, &heightGenerator_)));
    allTerrain_[x].emplace(std::make_pair(z, Terrain(x*size_, z*size_, size_/2.0f, len, col, &shader_, &waterShader_, &heightGenerator_)));
}

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

Я не уверен, что использую правильный подход, поэтому, если вы можете мне помочь, это будет здорово!

1 Ответ

2 голосов
/ 20 мая 2019

Попробуйте это:

  • Добавить мьютекс к World (terrain_mutex_)
  • Используйте std::lock_guard<std::mutex> при чтении из / записи в allTerrain_. Ваш код рисования тоже должен использовать этот мьютекс.
  • В addTerrain:
 void World::addTerrain(int x, int z, size_t len, size_t col) {
    { // lock while copying the terrain
        std::lock_guard<std::mutex> guard(terrain_mutex_);
        auto terrain_copy = allTerrain_;
    }

    // add more terrain to the copy
    terrain_copy[x].emplace(z, Terrain(x*size_, z*size_, size_/2.0f, len, col,
                            &shader_, &waterShader_, &heightGenerator_));

    { // lock when swapping in the copy
        std::lock_guard<std::mutex> guard(terrain_mutex_);
        std::swap(terrain_copy, allTerrain_);
    }
 }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...