MCPcopy Create free account
hub / github.com/OGRECave/ogre-next / defragment

Method defragment

OgreMain/src/Math/Array/OgreArrayMemoryManager.cpp:258–307  ·  view source on GitHub ↗

-----------------------------------------------------------------------------------

Source from the content-addressed store, hash-verified

256 }
257 //-----------------------------------------------------------------------------------
258 void ArrayMemoryManager::defragment()
259 {
260 // Sort, last values first. This may improve performance in some
261 // scenarios by reducing the amount of data to be shifted
262 std::sort( mAvailableSlots.begin(), mAvailableSlots.end(), std::greater<size_t>() );
263 SlotsVec::const_iterator itor = mAvailableSlots.begin();
264 SlotsVec::const_iterator endt = mAvailableSlots.end();
265
266 while( itor != endt )
267 {
268 // First see if we have a continuous range of unused slots
269 size_t lastRange = 1;
270 SlotsVec::const_iterator it = itor + 1;
271 while( it != endt && ( *itor - lastRange ) == *it )
272 {
273 ++lastRange;
274 ++it;
275 }
276
277 size_t i = 0;
278 const size_t newEnd = *itor + 1;
279 MemoryPoolVec::iterator itPools = mMemoryPools.begin();
280 MemoryPoolVec::iterator enPools = mMemoryPools.end();
281
282 // Shift everything N slots (N = lastRange)
283 while( itPools != enPools )
284 {
285 char *dstPtr = *itPools + ( newEnd - lastRange ) * mElementsMemSizes[i];
286 size_t indexDst = ( newEnd - lastRange ) % ARRAY_PACKED_REALS;
287 char *srcPtr = *itPools + newEnd * mElementsMemSizes[i];
288 size_t indexSrc = newEnd % ARRAY_PACKED_REALS;
289 size_t numSlots = ( mUsedMemory - newEnd );
290 size_t numFreeSlots = lastRange;
291 mCleanupRoutines[i]( dstPtr, indexDst, srcPtr, indexSrc, numSlots, numFreeSlots,
292 mElementsMemSizes[i] );
293 ++i;
294 ++itPools;
295 }
296
297 mUsedMemory -= lastRange;
298 initializeEmptySlots( mUsedMemory );
299
300 mRebaseListener->performCleanup( mLevel, mMemoryPools, mElementsMemSizes,
301 ( newEnd - lastRange ), lastRange );
302
303 itor += static_cast<ptrdiff_t>( lastRange );
304 }
305
306 mAvailableSlots.clear();
307 }
308 //-----------------------------------------------------------------------------------
309 void ArrayMemoryManager::shrinkToFit()
310 {

Callers

nothing calls this directly

Calls 5

initializeEmptySlotsFunction · 0.85
beginMethod · 0.45
endMethod · 0.45
performCleanupMethod · 0.45
clearMethod · 0.45

Tested by

no test coverage detected