Merge pull request #1576 from mc-server/QtBiomeVisualiserThreadedGen
QtBiomeVisualiser: Generator uses all machine threads.
This commit is contained in:
commit
30db6d9852
@ -27,10 +27,10 @@ BioGenSource::BioGenSource(cIniFilePtr a_IniFile) :
|
||||
void BioGenSource::getChunkBiomes(int a_ChunkX, int a_ChunkZ, Chunk & a_DestChunk)
|
||||
{
|
||||
cChunkDef::BiomeMap biomes;
|
||||
{
|
||||
QMutexLocker lock(&m_Mtx);
|
||||
m_BiomeGen->GenBiomes(a_ChunkX, a_ChunkZ, biomes);
|
||||
}
|
||||
int tag;
|
||||
cBiomeGenPtr biomeGen = getBiomeGen(tag);
|
||||
biomeGen->GenBiomes(a_ChunkX, a_ChunkZ, biomes);
|
||||
releaseBiomeGen(std::move(biomeGen), tag);
|
||||
a_DestChunk.setBiomes(biomes);
|
||||
}
|
||||
|
||||
@ -40,10 +40,53 @@ void BioGenSource::getChunkBiomes(int a_ChunkX, int a_ChunkZ, Chunk & a_DestChun
|
||||
|
||||
void BioGenSource::reload()
|
||||
{
|
||||
int seed = m_IniFile->GetValueSetI("Seed", "Seed", 0);
|
||||
bool unused = false;
|
||||
QMutexLocker lock(&m_Mtx);
|
||||
m_BiomeGen = cBiomeGen::CreateBiomeGen(*m_IniFile, seed, unused);
|
||||
m_CurrentTag += 1;
|
||||
m_BiomeGens.clear();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
cBiomeGenPtr BioGenSource::getBiomeGen(int & a_Tag)
|
||||
{
|
||||
QMutexLocker lock(&m_Mtx);
|
||||
a_Tag = m_CurrentTag;
|
||||
if (m_BiomeGens.empty())
|
||||
{
|
||||
// Create a new biogen:
|
||||
lock.unlock();
|
||||
int seed = m_IniFile->GetValueSetI("Seed", "Seed", 0);
|
||||
bool unused;
|
||||
cBiomeGenPtr res = cBiomeGen::CreateBiomeGen(*m_IniFile, seed, unused);
|
||||
return res;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Return an existing biogen:
|
||||
cBiomeGenPtr res = m_BiomeGens.back();
|
||||
m_BiomeGens.pop_back();
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void BioGenSource::releaseBiomeGen(cBiomeGenPtr && a_BiomeGen, int a_Tag)
|
||||
{
|
||||
QMutexLocker lock(&m_Mtx);
|
||||
|
||||
// If the tag differs, the source has been reloaded and this biogen is old, dispose:
|
||||
if (a_Tag != m_CurrentTag)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// The tag is the same, put the biogen back to list:
|
||||
m_BiomeGens.push_back(std::move(a_BiomeGen));
|
||||
}
|
||||
|
||||
|
||||
|
@ -53,10 +53,30 @@ protected:
|
||||
cIniFilePtr m_IniFile;
|
||||
|
||||
/** The generator used for generating biomes. */
|
||||
cBiomeGenPtr m_BiomeGen;
|
||||
std::vector<cBiomeGenPtr> m_BiomeGens;
|
||||
|
||||
/** Guards m_BiomeGen against multithreaded access. */
|
||||
/** Guards m_BiomeGens against multithreaded access. */
|
||||
QMutex m_Mtx;
|
||||
|
||||
/** Keeps track of the current settings of the biomegens.
|
||||
Incremented by one each time reload() is called. Provides the means of releasing old biomegens that were
|
||||
in use while reload() was being processed and thus couldn't be changed back then. releaseBiomeGen() does
|
||||
the job of filtering the biogens before reusing them. */
|
||||
int m_CurrentTag;
|
||||
|
||||
|
||||
/** Retrieves one cBiomeGenPtr from m_BiomeGens.
|
||||
If there's no biogen available there, creates a new one based on the ini file.
|
||||
When done with it, the caller should call releaseBiomeGen() to put the biogen back to m_BiomeGens.
|
||||
a_Tag receives the value of m_CurrentTag from when the lock was held; it should be passed to
|
||||
releaseBiomeGen() together with the biogen. */
|
||||
cBiomeGenPtr getBiomeGen(int & a_Tag);
|
||||
|
||||
/** Marks the specified biogen as available for reuse (puts it back into m_BiomeGens).
|
||||
a_Tag is the value of m_CurrentTag from the time when the biogen was retrieved; if it is different from
|
||||
current m_CurrentTagValue, the biogen will be disposed of (because reload() has been called in the
|
||||
meantime). */
|
||||
void releaseBiomeGen(cBiomeGenPtr && a_BiomeGen, int a_Tag);
|
||||
};
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user