GameObjectPool fixes

This commit is contained in:
2024-09-14 21:28:18 +05:00
parent 3df4361779
commit 47574e9b30
6 changed files with 80 additions and 27 deletions

View File

@@ -9,7 +9,7 @@ GameObjectPool::GameObjectPool(u32 size)
first_unused_index = 0;
buffer = new char[size*sizeof(GameObject)];
used_indices = new u64[size/64];
std::memset(buffer, 0, size*sizeof(GameObject));
// std::memset(buffer, 0, size*sizeof(GameObject));
std::memset(used_indices, 0, size/8);
}
@@ -26,7 +26,7 @@ GameObjectPool::~GameObjectPool()
bool GameObjectPool::isIndexUsed(u32 index)
{
return ( used_indices[index/64] & (1<<(index%64)) ) != 0;
return ( used_indices[index/64] & (u64(1)<<(index%64)) ) != 0;
}
u32 GameObjectPool::getNearestUnusedIndex(u32 startIndex)
@@ -38,7 +38,7 @@ u32 GameObjectPool::getNearestUnusedIndex(u32 startIndex)
u32 i = startIndex/64;
// mark previous bits as used
u64 u = used_indices[i] | ( (1<<startIndex%64) -1 );
u64 u = used_indices[i] | ( (u64(1)<<startIndex%64) -1 );
while(u == u64(-1)){
i++;
if(i == size/64)
@@ -61,7 +61,7 @@ u32 GameObjectPool::getNearestUsedIndex(u32 startIndex)
u32 i = startIndex/64;
// mark previous bits as unused
u64 u = used_indices[i] & !( (1<<startIndex%64) -1 );
u64 u = used_indices[i] & !( (u64(1)<<startIndex%64) -1 );
while(u == 0){
i++;
if(i == size/64)
@@ -84,25 +84,25 @@ GameObject& GameObjectPool::get(u32 index)
return ((GameObject*)buffer)[index];
}
std::pair<u32, GameObject&> GameObjectPool::put_new(GameObject&& new_obj)
std::pair<u32, GameObject&> GameObjectPool::emplace(GameObject&& new_obj)
{
u32 i = first_unused_index;
if(i == (u32)-1)
if(i == u32(-1))
throw UsefulException("can't put new GameObject to GameObjectPool because it's full");
GameObject& r = ( ((GameObject*)buffer)[i] = std::move(new_obj) );
used_indices[i] |= 1<<(i%64); // mark index bit as used
used_indices[i/64] |= u64(1)<<(i%64); // mark index bit as used
first_unused_index = getNearestUnusedIndex(i+1);
return std::pair<u32, GameObject&>(i, r);
}
void GameObjectPool::remove(u32 index)
void GameObjectPool::erase(u32 index)
{
if(index >= size)
throw UsefulException(format("index %i is out of size %i", index, size));
if(!isIndexUsed(index))
throw UsefulException(format("there is no object at index %i", index));
((GameObject*)buffer)[index].~GameObject();
used_indices[index/64] ^= ~(1<<(index%64)); // mark index bit as unused
used_indices[index/64] &= ~(u64(1)<<(index%64)); // mark index bit as unused
if(index < first_unused_index)
first_unused_index = index;
}