gpt4 book ai didi

c++ - 用线程生成问题世界

转载 作者:行者123 更新时间:2023-11-30 03:16:35 25 4
gpt4 key购买 nike

我正在尝试创建一个世界生成系统。我有一个世界级,其中包含可以在程序期间增加的地形图。当我在主线程中执行时,它工作正常,但当他计算顶点和所有内容时它们几乎没有卡住,所以我尝试使用 Thread。

所以为了生成地形,我这样做了:

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

newThread.detach();

(添加地形方法)

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

但是当我这样做的时候,新的地形被添加到 map 上,但是他看起来是空的(什么都没有画)。

我不确定我使用的方法是否正确,所以如果你能帮助我,那就太好了!

最佳答案

试试这个:

  • 添加互斥到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_);
}
}

关于c++ - 用线程生成问题世界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56220022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com