如何为SFML版C++ Minecraft克隆的嵌套循环添加并行化?
问题:SFML+C++ Minecraft克隆的区块并行渲染优化
我正在基于SFML开发一款C++版Minecraft克隆游戏,尝试用线程池实现区块渲染与修改的并行化。当前核心问题是如何高效实现该功能:负责渲染和修改区块数据(调整Perlin噪声的八度、持续性、频率)的函数采用双层嵌套循环,当区块数量超过100个时运行速度缓慢,希望通过并行化提升噪声修改效率。
现有核心代码
renderChunks函数
void chunkManager::renderChunks(bool update){ for(int i = -Manage::renderDistance; i <= Manage::renderDistance; ++i){ for(int j = -Manage::renderDistance; j <= Manage::renderDistance; ++j){ loadChunk(chunkPosition.x + i, chunkPosition.y + j, update); } } for(auto &pair : chunks){ window.draw(pair.second); } }
loadChunk函数
void chunkManager::loadChunk(int chunkX, int chunkY, bool update){ sf::Vector2i blockCoords(chunkX * Chunks::size, chunkY * Chunks::size); // 从区块坐标转换为游戏内方块坐标 auto chunkIter = chunks.find({chunkX, chunkY}); if (chunkIter == chunks.end() || update) { auto chunk = Chunk(); chunk.setVisibleBlocks(blockCoords, perlin, octaves, persistence, frequency); chunks[{chunkX, chunkY}] = chunk; } }
尝试的并行化方案(效果不佳)
我尝试使用BS::thread_pool类实现并行化,但未能正确适配嵌套循环:将内层循环放入pool.submit_loop中仅渲染玩家周边初始区域,且效率低于原实现。
void chunkManager::renderChunks(bool update){ // 创建玩家的渲染视口,即Manage::renderDistance范围内的可见区块 const BS::multi_future<void> loop_future = pool.submit_loop(-Manage::renderDistance, Manage::renderDistance + 1 , [this, update](const int y) { for(int x = -Manage::renderDistance; x <= Manage::renderDistance; ++x){ this->loadChunk(x,y,update); } }); loop_future.wait(); for(auto &pair : chunks){ window.draw(pair.second); } }
恳请提供更优的并行化实现方案。
内容的提问来源于stack exchange,提问作者stubbie
相关产品推荐
相关产品推荐

