getUncompressedBlock() now checks if it's getting the same block as last time.
This commit is contained in:
parent
ff12264744
commit
b5f60b28a2
@ -194,6 +194,7 @@ namespace PolyVox
|
|||||||
mutable std::vector<uint32_t> m_pUncompressedTimestamps;
|
mutable std::vector<uint32_t> m_pUncompressedTimestamps;
|
||||||
mutable uint32_t m_uTimestamper;
|
mutable uint32_t m_uTimestamper;
|
||||||
mutable Vector3DInt32 m_v3dLastAccessedBlockPos;
|
mutable Vector3DInt32 m_v3dLastAccessedBlockPos;
|
||||||
|
mutable Block<VoxelType>* m_pLastAccessedBlock;
|
||||||
mutable Vector3DInt32 m_v3dLoadBlockPos;
|
mutable Vector3DInt32 m_v3dLoadBlockPos;
|
||||||
uint32_t m_uMaxUncompressedBlockCacheSize;
|
uint32_t m_uMaxUncompressedBlockCacheSize;
|
||||||
uint32_t m_uMaxBlocksLoaded;
|
uint32_t m_uMaxBlocksLoaded;
|
||||||
|
@ -363,6 +363,7 @@ namespace PolyVox
|
|||||||
m_pUncompressedBorderData = 0;
|
m_pUncompressedBorderData = 0;
|
||||||
m_uMaxBlocksLoaded = 4096;
|
m_uMaxBlocksLoaded = 4096;
|
||||||
m_v3dLastAccessedBlockPos = Vector3DInt32((std::numeric_limits<int32_t>::max)(), (std::numeric_limits<int32_t>::max)(), (std::numeric_limits<int32_t>::max)()); //An invalid index
|
m_v3dLastAccessedBlockPos = Vector3DInt32((std::numeric_limits<int32_t>::max)(), (std::numeric_limits<int32_t>::max)(), (std::numeric_limits<int32_t>::max)()); //An invalid index
|
||||||
|
m_pLastAccessedBlock = 0;
|
||||||
|
|
||||||
m_regValidRegion = regValidRegion;
|
m_regValidRegion = regValidRegion;
|
||||||
|
|
||||||
@ -438,16 +439,29 @@ namespace PolyVox
|
|||||||
Block<VoxelType>* Volume<VoxelType>::getUncompressedBlock(int32_t uBlockX, int32_t uBlockY, int32_t uBlockZ) const
|
Block<VoxelType>* Volume<VoxelType>::getUncompressedBlock(int32_t uBlockX, int32_t uBlockY, int32_t uBlockZ) const
|
||||||
{
|
{
|
||||||
Vector3DInt32 v3dBlockPos(uBlockX, uBlockY, uBlockZ);
|
Vector3DInt32 v3dBlockPos(uBlockX, uBlockY, uBlockZ);
|
||||||
|
|
||||||
|
//Check if we have the same block as last time, if so there's no need to even update
|
||||||
|
//the time stamp. If we updated it everytime then that would be every time we touched
|
||||||
|
//a voxel, which would overflow a uint32_t and require us to use a uint64_t instead.
|
||||||
|
//This check should also provide a significant speed boost as usually it is true.
|
||||||
|
if((v3dBlockPos == m_v3dLastAccessedBlockPos) && (m_pLastAccessedBlock != 0))
|
||||||
|
{
|
||||||
|
return m_pLastAccessedBlock;
|
||||||
|
}
|
||||||
|
|
||||||
typename std::map<Vector3DInt32, Block<VoxelType> >::iterator itBlock = m_pBlocks.find(v3dBlockPos);
|
typename std::map<Vector3DInt32, Block<VoxelType> >::iterator itBlock = m_pBlocks.find(v3dBlockPos);
|
||||||
// check whether the block is already loaded
|
// check whether the block is already loaded
|
||||||
if(itBlock == m_pBlocks.end()) {
|
if(itBlock == m_pBlocks.end())
|
||||||
|
{
|
||||||
// it is not loaded
|
// it is not loaded
|
||||||
// check wether another block needs to be unloaded before this one can be loaded
|
// check wether another block needs to be unloaded before this one can be loaded
|
||||||
if(m_pBlocks.size() == m_uMaxBlocksLoaded) {
|
if(m_pBlocks.size() == m_uMaxBlocksLoaded)
|
||||||
|
{
|
||||||
// find the least recently used block
|
// find the least recently used block
|
||||||
typename std::map<Vector3DInt32, Block<VoxelType> >::iterator i;
|
typename std::map<Vector3DInt32, Block<VoxelType> >::iterator i;
|
||||||
typename std::map<Vector3DInt32, Block<VoxelType> >::iterator itUnloadBlock = m_pBlocks.begin();
|
typename std::map<Vector3DInt32, Block<VoxelType> >::iterator itUnloadBlock = m_pBlocks.begin();
|
||||||
for(i = m_pBlocks.begin(); i != m_pBlocks.end(); i++) {
|
for(i = m_pBlocks.begin(); i != m_pBlocks.end(); i++)
|
||||||
|
{
|
||||||
if(i->second.m_uTimestamp < itUnloadBlock->second.m_uTimestamp) {
|
if(i->second.m_uTimestamp < itUnloadBlock->second.m_uTimestamp) {
|
||||||
itUnloadBlock = i;
|
itUnloadBlock = i;
|
||||||
}
|
}
|
||||||
@ -458,8 +472,9 @@ namespace PolyVox
|
|||||||
Vector3DInt32 v3dUpper = v3dLower + Vector3DInt32(m_uBlockSideLength-1, m_uBlockSideLength-1, m_uBlockSideLength-1);
|
Vector3DInt32 v3dUpper = v3dLower + Vector3DInt32(m_uBlockSideLength-1, m_uBlockSideLength-1, m_uBlockSideLength-1);
|
||||||
Region reg(v3dLower, v3dUpper);
|
Region reg(v3dLower, v3dUpper);
|
||||||
// create the new block
|
// create the new block
|
||||||
m_pBlocks[v3dBlockPos] = Block<VoxelType>(m_uBlockSideLength);
|
Block<VoxelType> newBlock(m_uBlockSideLength);
|
||||||
itBlock = m_pBlocks.find(v3dBlockPos);
|
itBlock = m_pBlocks.insert(std::make_pair(v3dBlockPos, newBlock)).first;
|
||||||
|
|
||||||
// fill it with data (well currently fill it with nothingness)
|
// fill it with data (well currently fill it with nothingness)
|
||||||
// "load" will actually call setVoxel, which will in turn call this function again but the block will be found
|
// "load" will actually call setVoxel, which will in turn call this function again but the block will be found
|
||||||
// so this if(itBlock == m_pBlocks.end()) never is entered
|
// so this if(itBlock == m_pBlocks.end()) never is entered
|
||||||
@ -471,24 +486,18 @@ namespace PolyVox
|
|||||||
m_v3dLoadBlockPos = Vector3DInt32((std::numeric_limits<int32_t>::max)(), (std::numeric_limits<int32_t>::max)(), (std::numeric_limits<int32_t>::max)());
|
m_v3dLoadBlockPos = Vector3DInt32((std::numeric_limits<int32_t>::max)(), (std::numeric_limits<int32_t>::max)(), (std::numeric_limits<int32_t>::max)());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_v3dLastAccessedBlockPos = v3dBlockPos;
|
||||||
|
|
||||||
//Get the block
|
//Get the block
|
||||||
Block<VoxelType>* block = &(itBlock->second);
|
Block<VoxelType>* block = &(itBlock->second);
|
||||||
|
|
||||||
//Check if we have the same block as last time, if so there's no need to even update
|
|
||||||
//the time stamp. If we updated it everytime then that would be every time we touched
|
|
||||||
//a voxel, which would overflow a uint32_t and require us to use a uint64_t instead.
|
|
||||||
if(v3dBlockPos == m_v3dLastAccessedBlockPos)
|
|
||||||
{
|
|
||||||
return block;
|
|
||||||
}
|
|
||||||
m_v3dLastAccessedBlockPos = v3dBlockPos;
|
|
||||||
|
|
||||||
m_uTimestamper++;
|
m_uTimestamper++;
|
||||||
block->m_uTimestamp = m_uTimestamper;
|
block->m_uTimestamp = m_uTimestamper;
|
||||||
|
|
||||||
if(block->m_bIsCompressed == false)
|
if(block->m_bIsCompressed == false)
|
||||||
{
|
{
|
||||||
m_pUncompressedTimestamps[block->m_uUncompressedIndex] = m_uTimestamper;
|
m_pUncompressedTimestamps[block->m_uUncompressedIndex] = m_uTimestamper;
|
||||||
|
m_pLastAccessedBlock = block;
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -526,6 +535,7 @@ namespace PolyVox
|
|||||||
block->m_uUncompressedIndex = uUncompressedBlockIndex;
|
block->m_uUncompressedIndex = uUncompressedBlockIndex;
|
||||||
block->uncompress(m_vecUncompressedBlockCache[uUncompressedBlockIndex].data);
|
block->uncompress(m_vecUncompressedBlockCache[uUncompressedBlockIndex].data);
|
||||||
|
|
||||||
|
m_pLastAccessedBlock = block;
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user