-added SimpleVector (vector with only ubyte data)

-components adding and removing now use SimpleVector (optimalization)
This commit is contained in:
Mergul 2019-06-18 20:12:18 +02:00
parent b04ab77e0c
commit 01ff3962b5
2 changed files with 70 additions and 2 deletions

View file

@ -20,6 +20,7 @@ import ecs.hash_map;
import ecs.id_manager; import ecs.id_manager;
import ecs.system; import ecs.system;
import ecs.vector; import ecs.vector;
import ecs.simple_vector;
import ecs.events; import ecs.events;
import ecs.traits; import ecs.traits;
@ -1387,7 +1388,7 @@ export class EntityManager
data.change_entities_list.add(0); data.change_entities_list.add(0);
data.change_entities_list.add((cast(ubyte*)&entity_id)[0 .. EntityID.sizeof]); data.change_entities_list.add((cast(ubyte*)&entity_id)[0 .. EntityID.sizeof]);
data.change_entities_list.add((cast(ubyte*)&num)[0 .. uint.sizeof]); data.change_entities_list.add((cast(ubyte*)&num)[0 .. uint.sizeof]);
data.change_entities_list.add(cast(ubyte[]) del_ids); data.change_entities_list.add((cast(ubyte*)del_ids.ptr)[0 .. num * 2]);
} }
private void __removeComponents(EntityID entity_id, ushort[] del_ids) private void __removeComponents(EntityID entity_id, ushort[] del_ids)
@ -2685,7 +2686,8 @@ export class EntityManager
struct ThreadData struct ThreadData
{ {
Vector!EntityID entities_to_remove; Vector!EntityID entities_to_remove;
Vector!ubyte change_entities_list; //Vector!ubyte change_entities_list;
SimpleVector change_entities_list;
Vector!(EntitiesBlock*) blocks_to_update; Vector!(EntitiesBlock*) blocks_to_update;
} }

View file

@ -0,0 +1,66 @@
module ecs.simple_vector;
import std.experimental.allocator;
import std.experimental.allocator.mallocator;
import core.stdc.string;
struct SimpleVector
{
@disable this(this);
void add(ubyte el) nothrow @nogc
{
while(used >= data.length)
{
if(data is null)data = Mallocator.instance.makeArray!ubyte(1024);
else Mallocator.instance.expandArray(data,data.length);
}
data[used++] = el;
}
void add(ubyte[] el) nothrow @nogc
{
while(used + el.length >= data.length)
{
if(data is null)data = Mallocator.instance.makeArray!ubyte(1024);
else Mallocator.instance.expandArray(data,data.length);
}
memcpy(data.ptr + used, el.ptr, el.length);
used += el.length;
}
size_t length() nothrow @nogc
{
return used;
}
export ref ubyte opIndex(size_t pos) nothrow @nogc
{
return data[pos];
}
export ubyte[] opSlice() nothrow @nogc
{
return data[0 .. used];
}
export ubyte[] opSlice(size_t x, size_t y) nothrow @nogc
{
return data[x .. y];
}
export size_t opDollar() nothrow @nogc
{
return used;
}
void clear() nothrow @nogc
{
used = 0;
}
ubyte[] data = null;
size_t used = 0;
}