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)
|
void BioGenSource::getChunkBiomes(int a_ChunkX, int a_ChunkZ, Chunk & a_DestChunk)
|
||||||
{
|
{
|
||||||
cChunkDef::BiomeMap biomes;
|
cChunkDef::BiomeMap biomes;
|
||||||
{
|
int tag;
|
||||||
QMutexLocker lock(&m_Mtx);
|
cBiomeGenPtr biomeGen = getBiomeGen(tag);
|
||||||
m_BiomeGen->GenBiomes(a_ChunkX, a_ChunkZ, biomes);
|
biomeGen->GenBiomes(a_ChunkX, a_ChunkZ, biomes);
|
||||||
}
|
releaseBiomeGen(std::move(biomeGen), tag);
|
||||||
a_DestChunk.setBiomes(biomes);
|
a_DestChunk.setBiomes(biomes);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,10 +40,53 @@ void BioGenSource::getChunkBiomes(int a_ChunkX, int a_ChunkZ, Chunk & a_DestChun
|
|||||||
|
|
||||||
void BioGenSource::reload()
|
void BioGenSource::reload()
|
||||||
{
|
{
|
||||||
int seed = m_IniFile->GetValueSetI("Seed", "Seed", 0);
|
|
||||||
bool unused = false;
|
|
||||||
QMutexLocker lock(&m_Mtx);
|
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;
|
cIniFilePtr m_IniFile;
|
||||||
|
|
||||||
/** The generator used for generating biomes. */
|
/** 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;
|
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