Work on paging to files.
This commit is contained in:
parent
b767d9b896
commit
c3c4ead1f3
@ -102,7 +102,7 @@ namespace PolyVox
|
|||||||
template <typename VoxelType>
|
template <typename VoxelType>
|
||||||
LargeVolume<VoxelType>::~LargeVolume()
|
LargeVolume<VoxelType>::~LargeVolume()
|
||||||
{
|
{
|
||||||
//flushAll();
|
flushAll();
|
||||||
|
|
||||||
// Only delete the compressor if it was created by us (in the constructor), not by the user.
|
// Only delete the compressor if it was created by us (in the constructor), not by the user.
|
||||||
if(m_bIsOurCompressor)
|
if(m_bIsOurCompressor)
|
||||||
@ -579,6 +579,9 @@ namespace PolyVox
|
|||||||
|
|
||||||
// Page the data out
|
// Page the data out
|
||||||
m_pPager->pageOut(Region(v3dLower, v3dUpper), pCompressedBlock);
|
m_pPager->pageOut(Region(v3dLower, v3dUpper), pCompressedBlock);
|
||||||
|
|
||||||
|
// The compressed data is no longer modified with respect to the data on disk
|
||||||
|
pCompressedBlock->m_bDataModified = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete itCompressedBlock->second;
|
delete itCompressedBlock->second;
|
||||||
@ -682,20 +685,35 @@ namespace PolyVox
|
|||||||
if(itBlock != m_pBlocks.end())
|
if(itBlock != m_pBlocks.end())
|
||||||
{
|
{
|
||||||
pBlock = itBlock->second;
|
pBlock = itBlock->second;
|
||||||
|
pBlock->m_uBlockLastAccessed = ++m_uTimestamper;
|
||||||
|
return pBlock;
|
||||||
}
|
}
|
||||||
/*else if(check on disk)
|
|
||||||
{
|
|
||||||
}*/
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// The block wasn't found so we create a new one
|
||||||
pBlock = new CompressedBlock<VoxelType>;
|
pBlock = new CompressedBlock<VoxelType>;
|
||||||
|
|
||||||
|
// It's important to set the timestamp before we flush later.
|
||||||
pBlock->m_uBlockLastAccessed = ++m_uTimestamper;
|
pBlock->m_uBlockLastAccessed = ++m_uTimestamper;
|
||||||
|
|
||||||
|
// Pass the block to the Pager to give it a chance to initialise it with any data
|
||||||
|
Vector3DInt32 v3dLower(v3dBlockPos.getX() << m_uBlockSideLengthPower, v3dBlockPos.getY() << m_uBlockSideLengthPower, v3dBlockPos.getZ() << m_uBlockSideLengthPower);
|
||||||
|
Vector3DInt32 v3dUpper = v3dLower + Vector3DInt32(m_uBlockSideLength-1, m_uBlockSideLength-1, m_uBlockSideLength-1);
|
||||||
|
Region reg(v3dLower, v3dUpper);
|
||||||
|
m_pPager->pageIn(reg, pBlock);
|
||||||
|
|
||||||
|
// Add the block to the map
|
||||||
itBlock = m_pBlocks.insert(std::make_pair(v3dBlockPos, pBlock)).first;
|
itBlock = m_pBlocks.insert(std::make_pair(v3dBlockPos, pBlock)).first;
|
||||||
|
|
||||||
|
// Paging in this new block may mean we are now using too much memory. If necessary, flush some old blocks.
|
||||||
|
flushOldestExcessiveBlocks();
|
||||||
|
|
||||||
|
return pBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
pBlock->m_uBlockLastAccessed = ++m_uTimestamper;
|
|
||||||
|
|
||||||
return pBlock;
|
|
||||||
|
|
||||||
/*typename CompressedBlockMap::iterator itBlock = m_pBlocks.find(v3dBlockPos);
|
/*typename CompressedBlockMap::iterator itBlock = m_pBlocks.find(v3dBlockPos);
|
||||||
// check whether the block is already loaded
|
// check whether the block is already loaded
|
||||||
@ -740,10 +758,10 @@ namespace PolyVox
|
|||||||
//the time stamp. If we updated it everytime then that would be every time we touched
|
//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.
|
//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.
|
//This check should also provide a significant speed boost as usually it is true.
|
||||||
/*if((v3dBlockPos == m_v3dLastAccessedBlockPos) && (m_pLastAccessedBlock != 0))
|
if((v3dBlockPos == m_v3dLastAccessedBlockPos) && (m_pLastAccessedBlock != 0))
|
||||||
{
|
{
|
||||||
return m_pLastAccessedBlock;
|
return m_pLastAccessedBlock;
|
||||||
}*/
|
}
|
||||||
|
|
||||||
typename UncompressedBlockMap::iterator itUncompressedBlock = m_pUncompressedBlockCache.find(v3dBlockPos);
|
typename UncompressedBlockMap::iterator itUncompressedBlock = m_pUncompressedBlockCache.find(v3dBlockPos);
|
||||||
// check whether the block is already loaded
|
// check whether the block is already loaded
|
||||||
@ -789,7 +807,7 @@ namespace PolyVox
|
|||||||
POLYVOX_ASSERT(uUncompressedLength == m_uBlockSideLength * m_uBlockSideLength * m_uBlockSideLength * sizeof(VoxelType), "Destination length has changed.");
|
POLYVOX_ASSERT(uUncompressedLength == m_uBlockSideLength * m_uBlockSideLength * m_uBlockSideLength * sizeof(VoxelType), "Destination length has changed.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Addd our new block to the map.
|
// Add our new block to the map.
|
||||||
m_pUncompressedBlockCache.insert(std::make_pair(v3dBlockPos, pUncompressedBlock));
|
m_pUncompressedBlockCache.insert(std::make_pair(v3dBlockPos, pUncompressedBlock));
|
||||||
|
|
||||||
// Our block cache may now have grown too large. Flush some entries if necessary.
|
// Our block cache may now have grown too large. Flush some entries if necessary.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user