-added multiple new function to allocate template and add entity -updated README.md (complete initial version) -empty components now don't take memory -fixedd small bug with TestRunner -added many new tests (HashMap, Vector, EntityMeta, ...) -added default hashing function to HashMap -fixed critical bug with adding entities -fixed small bug with adding entity with remplacement components -added asserts into code to better bug detection -small performance improvement for events -added ComponentRef structure which contain data pointer and componentID -remove EntityID from Event structure -now events are handled before removing entiteis -fixed GDC compilation -fixed rendering of rotated sprites -added weapons as separate entities to space ship and others -added Tower enemy to SpaceInvaders demo -added Boss to SpaceInvaders demo (boss has four tower attached to it) -Boss towers shoot multiple bullets upon death -fixed critical bug with demos switching -fixed critical bug related to adding/removing entities form inside onAdd/onRemove entity callback -added animation support -added particles sypport and particles for firing and explostions, and more -multithreaded rendering now has same rendering order as singlethreaded -application automaticallu detect host CPU threads count -added upgrades to SPaceInvaders demo -fixed texture memory freeing -improved documentation -improved multithreaded performance -improve shader code -fixed registration issue -some additional performance improvements -added depth and colors to rendering parameters -jobs now has names corresponding to their systems -change execute() -> willExecute() -added EntityMeta structure to speedup getting fetching components form entity -improved multithreading rendering -added possibility tio change number of threads runtime -added bullets collision detection in SpaceInvaders demo -some CI changes -added VBO batch rendering (current default, no render mode switch yet) -fixed camera positioning calculation -fixed buffer issue with WebGL -added viewport scalling (at least 300 pixels height). Pixels are scalled if screen is bigger. -center demos gameplay area -added fullpage html template for Emscripten build -added many new sprites to atlas -fixed critical bug with CPU usage in multithreaded mode -snake render tile coresponding to body part -snake is destroyed after collision and emit some particles -added some functionality to vectors -fixed documentation issue in Manager.d -more minor code changes and cleanup
99 lines
3.3 KiB
D
99 lines
3.3 KiB
D
/************************************************************************************************************************
|
|
It's internal code.
|
|
|
|
Module contain memory allocator.
|
|
|
|
Copyright: Copyright © 2018-2019, Dawid Masiukiewicz, Michał Masiukiewicz
|
|
License: BSD 3-clause, see LICENSE file in project root folder.
|
|
*/
|
|
module bubel.ecs.block_allocator;
|
|
|
|
import bubel.ecs.manager;
|
|
import bubel.ecs.std;
|
|
|
|
/************************************************************************************************************************
|
|
Allocator allocate large blocks and return smaller blocks. When there is no more blocks then next large block is allocated.
|
|
By default freeing memory only returns it to allocator. To free large memory chunks freeMemory function is used.
|
|
freeMemory function return to system memory even if chunk blocks wasn't freed.
|
|
*/
|
|
struct BlockAllocator
|
|
{
|
|
/************************************************************************************************************************
|
|
Get new block. Allocator automatically allocate next memory chunk if needed.
|
|
*/
|
|
void* getBlock() nothrow @nogc
|
|
{
|
|
if (next_block is null)
|
|
allocBlock();
|
|
void* ret = next_block;
|
|
next_block = *cast(void**) next_block;
|
|
return ret;
|
|
}
|
|
|
|
/************************************************************************************************************************
|
|
Return block to allocator for further use.
|
|
*/
|
|
void freeBlock(void* block) nothrow @nogc
|
|
{
|
|
*cast(void**) block = next_block;
|
|
next_block = block;
|
|
}
|
|
|
|
/************************************************************************************************************************
|
|
Free whole used memory. This function return to system all memory chunks even if not every black was freed.
|
|
*/
|
|
void freeMemory() nothrow @nogc
|
|
{
|
|
while (pointers)
|
|
{
|
|
foreach (i; 0 .. pointers.numberof)
|
|
{
|
|
Mallocator.alignDispose(pointers.blocks[i]);
|
|
}
|
|
BlockPointers* next_pointers = pointers.next_pointers;
|
|
Mallocator.dispose(pointers);
|
|
pointers = next_pointers;
|
|
}
|
|
}
|
|
|
|
private:
|
|
|
|
void allocBlock() nothrow @nogc
|
|
{
|
|
next_block = cast(void*) Mallocator.alignAlloc(block_size * blocks_in_allocation,
|
|
block_size);
|
|
if (next_block is null)
|
|
assert(0);
|
|
|
|
if (pointers is null)
|
|
pointers = Mallocator.make!BlockPointers;
|
|
if (pointers.numberof >= 32)
|
|
{
|
|
BlockPointers* new_pointers = Mallocator.make!BlockPointers;
|
|
new_pointers.next_pointers = pointers;
|
|
pointers = new_pointers;
|
|
}
|
|
pointers.blocks[pointers.numberof++] = next_block;
|
|
|
|
foreach (i; 0 .. blocks_in_allocation - 1)
|
|
{
|
|
void** pointer = cast(void**)(next_block + i * block_size);
|
|
*pointer = next_block + (i + 1) * block_size;
|
|
}
|
|
void** pointer = cast(void**)(next_block + (blocks_in_allocation - 1) * block_size);
|
|
*pointer = null;
|
|
}
|
|
|
|
struct BlockPointers
|
|
{
|
|
void*[32] blocks;
|
|
uint numberof = 0;
|
|
BlockPointers* next_pointers = null;
|
|
}
|
|
|
|
uint block_size;
|
|
uint blocks_in_allocation;
|
|
|
|
void* next_block = null;
|
|
BlockPointers* pointers = null;
|
|
}
|