eliminate more dictionaries
							parent
							
								
									d2b8e68b08
								
							
						
					
					
						commit
						c58a5a24b8
					
				|  | @ -15,11 +15,11 @@ public class Snapshot : IDisposable | |||
| 
 | ||||
| 	private List<RelationSnapshot> RelationSnapshots = new List<RelationSnapshot>(); | ||||
| 
 | ||||
| 	private Dictionary<Entity, IndexableSet<TypeId>> EntityRelationIndex = | ||||
| 		new Dictionary<Entity, IndexableSet<TypeId>>(); | ||||
| 	private List<IndexableSet<TypeId>> EntityRelationIndex = | ||||
| 		new List<IndexableSet<TypeId>>(); | ||||
| 
 | ||||
| 	private Dictionary<Entity, IndexableSet<TypeId>> EntityComponentIndex = | ||||
| 		new Dictionary<Entity, IndexableSet<TypeId>>(); | ||||
| 	private List<IndexableSet<TypeId>> EntityComponentIndex = | ||||
| 		new List<IndexableSet<TypeId>>(); | ||||
| 
 | ||||
| 	private List<string> EntityTags = new List<string>(); | ||||
| 
 | ||||
|  | @ -76,32 +76,36 @@ public class Snapshot : IDisposable | |||
| 		// restore entity relation index state | ||||
| 		// FIXME: arghhhh this is so slow | ||||
| 
 | ||||
| 		foreach (var (id, relationTypeSet) in world.EntityRelationIndex) | ||||
| 		foreach (var relationTypeSet in world.EntityRelationIndex) | ||||
| 		{ | ||||
| 			relationTypeSet.Clear(); | ||||
| 		} | ||||
| 
 | ||||
| 		foreach (var (id, relationTypeSet) in EntityRelationIndex) | ||||
| 		for (var i = 0; i < EntityRelationIndex.Count; i += 1) | ||||
| 		{ | ||||
| 			var relationTypeSet = EntityRelationIndex[i]; | ||||
| 
 | ||||
| 			foreach (var typeId in relationTypeSet) | ||||
| 			{ | ||||
| 				world.EntityRelationIndex[id].Add(typeId); | ||||
| 				world.EntityRelationIndex[i].Add(typeId); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		// restore entity component index state | ||||
| 		// FIXME: arrghghhh this is so slow | ||||
| 
 | ||||
| 		foreach (var (id, componentTypeSet) in world.EntityComponentIndex) | ||||
| 		foreach (var componentTypeSet in world.EntityComponentIndex) | ||||
| 		{ | ||||
| 			componentTypeSet.Clear(); | ||||
| 		} | ||||
| 
 | ||||
| 		foreach (var (id, componentTypeSet) in EntityComponentIndex) | ||||
| 		for (var i = 0; i < EntityComponentIndex.Count; i += 1) | ||||
| 		{ | ||||
| 			var componentTypeSet = EntityComponentIndex[i]; | ||||
| 
 | ||||
| 			foreach (var typeId in componentTypeSet) | ||||
| 			{ | ||||
| 				world.EntityComponentIndex[id].Add(typeId); | ||||
| 				world.EntityComponentIndex[i].Add(typeId); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
|  | @ -145,37 +149,39 @@ public class Snapshot : IDisposable | |||
| 			RelationSnapshots[i].Take(world.RelationIndex[i]); | ||||
| 		} | ||||
| 
 | ||||
| 		// copy entity relation index | ||||
| 		// FIXME: arghhhh this is so slow | ||||
| 		foreach (var (id, relationTypeSet) in world.EntityRelationIndex) | ||||
| 		// fill in missing index structures | ||||
| 
 | ||||
| 		for (var i = EntityComponentIndex.Count; i < world.EntityComponentIndex.Count; i += 1) | ||||
| 		{ | ||||
| 			if (!EntityRelationIndex.ContainsKey(id)) | ||||
| 			{ | ||||
| 				EntityRelationIndex.Add(id, new IndexableSet<TypeId>()); | ||||
| 			EntityComponentIndex.Add(new IndexableSet<TypeId>()); | ||||
| 		} | ||||
| 
 | ||||
| 			EntityRelationIndex[id].Clear(); | ||||
| 
 | ||||
| 			foreach (var typeId in relationTypeSet) | ||||
| 		for (var i = EntityRelationIndex.Count; i < world.EntityRelationIndex.Count; i += 1) | ||||
| 		{ | ||||
| 				EntityRelationIndex[id].Add(typeId); | ||||
| 			EntityRelationIndex.Add(new IndexableSet<TypeId>()); | ||||
| 		} | ||||
| 
 | ||||
| 		// copy entity relation index | ||||
| 		// FIXME: arghhhh this is so slow | ||||
| 		for (var i = 0; i < world.EntityRelationIndex.Count; i += 1) | ||||
| 		{ | ||||
| 			EntityRelationIndex[i].Clear(); | ||||
| 
 | ||||
| 			foreach (var typeId in world.EntityRelationIndex[i]) | ||||
| 			{ | ||||
| 				EntityRelationIndex[i].Add(typeId); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		// copy entity component index | ||||
| 		// FIXME: arghhhh this is so slow | ||||
| 		foreach (var (id, componentTypeSet) in world.EntityComponentIndex) | ||||
| 		for (var i = 0; i < world.EntityComponentIndex.Count; i += 1) | ||||
| 		{ | ||||
| 			if (!EntityComponentIndex.ContainsKey(id)) | ||||
| 			{ | ||||
| 				EntityComponentIndex.Add(id, new IndexableSet<TypeId>()); | ||||
| 			} | ||||
| 			EntityComponentIndex[i].Clear(); | ||||
| 
 | ||||
| 			EntityComponentIndex[id].Clear(); | ||||
| 
 | ||||
| 			foreach (var typeId in componentTypeSet) | ||||
| 			foreach (var typeId in world.EntityComponentIndex[i]) | ||||
| 			{ | ||||
| 				EntityComponentIndex[id].Add(typeId); | ||||
| 				EntityComponentIndex[i].Add(typeId); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
|  | @ -346,12 +352,12 @@ public class Snapshot : IDisposable | |||
| 					relationSnapshot.Dispose(); | ||||
| 				} | ||||
| 
 | ||||
| 				foreach (var componentSet in EntityComponentIndex.Values) | ||||
| 				foreach (var componentSet in EntityComponentIndex) | ||||
| 				{ | ||||
| 					componentSet.Dispose(); | ||||
| 				} | ||||
| 
 | ||||
| 				foreach (var relationSet in EntityRelationIndex.Values) | ||||
| 				foreach (var relationSet in EntityRelationIndex) | ||||
| 				{ | ||||
| 					relationSet.Dispose(); | ||||
| 				} | ||||
|  |  | |||
							
								
								
									
										41
									
								
								src/World.cs
								
								
								
								
							
							
						
						
									
										41
									
								
								src/World.cs
								
								
								
								
							|  | @ -26,7 +26,7 @@ public class World : IDisposable | |||
| 
 | ||||
| 	// Relation Storages | ||||
| 	internal List<RelationStorage> RelationIndex = new List<RelationStorage>(); | ||||
| 	internal Dictionary<Entity, IndexableSet<TypeId>> EntityRelationIndex = new Dictionary<Entity, IndexableSet<TypeId>>(); | ||||
| 	internal List<IndexableSet<TypeId>> EntityRelationIndex = new List<IndexableSet<TypeId>>(); | ||||
| 
 | ||||
| 	// Message Storages | ||||
| 	private List<MessageStorage> MessageIndex = new List<MessageStorage>(); | ||||
|  | @ -34,7 +34,7 @@ public class World : IDisposable | |||
| 	public FilterBuilder FilterBuilder => new FilterBuilder(this); | ||||
| 
 | ||||
| 	internal readonly List<ComponentStorage> ComponentIndex = new List<ComponentStorage>(); | ||||
| 	internal Dictionary<Entity, IndexableSet<TypeId>> EntityComponentIndex = new Dictionary<Entity, IndexableSet<TypeId>>(); | ||||
| 	internal List<IndexableSet<TypeId>> EntityComponentIndex = new List<IndexableSet<TypeId>>(); | ||||
| 
 | ||||
| 	internal IdAssigner EntityIdAssigner = new IdAssigner(); | ||||
| 
 | ||||
|  | @ -97,10 +97,10 @@ public class World : IDisposable | |||
| 	{ | ||||
| 		var entity = new Entity(EntityIdAssigner.Assign()); | ||||
| 
 | ||||
| 		if (!EntityComponentIndex.ContainsKey(entity)) | ||||
| 		if (entity.ID == EntityComponentIndex.Count) | ||||
| 		{ | ||||
| 			EntityRelationIndex.Add(entity, new IndexableSet<TypeId>()); | ||||
| 			EntityComponentIndex.Add(entity, new IndexableSet<TypeId>()); | ||||
| 			EntityRelationIndex.Add(new IndexableSet<TypeId>()); | ||||
| 			EntityComponentIndex.Add(new IndexableSet<TypeId>()); | ||||
| 			EntityTags.Add(tag); | ||||
| 		} | ||||
| 
 | ||||
|  | @ -119,8 +119,11 @@ public class World : IDisposable | |||
| 
 | ||||
| 	public void Destroy(in Entity entity) | ||||
| 	{ | ||||
| 		var componentSet = EntityComponentIndex[(int) entity.ID]; | ||||
| 		var relationSet = EntityRelationIndex[(int) entity.ID]; | ||||
| 
 | ||||
| 		// remove all components from storages | ||||
| 		foreach (var componentTypeIndex in EntityComponentIndex[entity]) | ||||
| 		foreach (var componentTypeIndex in componentSet) | ||||
| 		{ | ||||
| 			var componentStorage = ComponentIndex[componentTypeIndex]; | ||||
| 			componentStorage.Remove(entity); | ||||
|  | @ -132,14 +135,14 @@ public class World : IDisposable | |||
| 		} | ||||
| 
 | ||||
| 		// remove all relations from storage | ||||
| 		foreach (var relationTypeIndex in EntityRelationIndex[entity]) | ||||
| 		foreach (var relationTypeIndex in relationSet) | ||||
| 		{ | ||||
| 			var relationStorage = RelationIndex[relationTypeIndex]; | ||||
| 			relationStorage.RemoveEntity(entity); | ||||
| 		} | ||||
| 
 | ||||
| 		EntityComponentIndex[entity].Clear(); | ||||
| 		EntityRelationIndex[entity].Clear(); | ||||
| 		componentSet.Clear(); | ||||
| 		relationSet.Clear(); | ||||
| 
 | ||||
| 		// recycle ID | ||||
| 		EntityIdAssigner.Unassign(entity.ID); | ||||
|  | @ -155,7 +158,7 @@ public class World : IDisposable | |||
| 
 | ||||
| 	internal bool Has(in Entity entity, in TypeId typeId) | ||||
| 	{ | ||||
| 		return EntityComponentIndex[entity].Contains(typeId); | ||||
| 		return EntityComponentIndex[(int) entity.ID].Contains(typeId); | ||||
| 	} | ||||
| 
 | ||||
| 	public bool Some<T>() where T : unmanaged | ||||
|  | @ -188,7 +191,7 @@ public class World : IDisposable | |||
| 
 | ||||
| 		if (!componentStorage.Set(entity, component)) | ||||
| 		{ | ||||
| 			EntityComponentIndex[entity].Add(componentStorage.TypeId); | ||||
| 			EntityComponentIndex[(int) entity.ID].Add(componentStorage.TypeId); | ||||
| 
 | ||||
| 			foreach (var filter in ComponentTypeToFilter[componentStorage.TypeId]) | ||||
| 			{ | ||||
|  | @ -203,7 +206,7 @@ public class World : IDisposable | |||
| 
 | ||||
| 		if (componentStorage.Remove(entity)) | ||||
| 		{ | ||||
| 			EntityComponentIndex[entity].Remove(componentStorage.TypeId); | ||||
| 			EntityComponentIndex[(int) entity.ID].Remove(componentStorage.TypeId); | ||||
| 
 | ||||
| 			foreach (var filter in ComponentTypeToFilter[componentStorage.TypeId]) | ||||
| 			{ | ||||
|  | @ -235,8 +238,8 @@ public class World : IDisposable | |||
| 	{ | ||||
| 		var relationStorage = GetRelationStorage<T>(); | ||||
| 		relationStorage.Set(entityA, entityB, relation); | ||||
| 		EntityRelationIndex[entityA].Add(new TypeId(RelationTypeIdAssigner<T>.Id)); | ||||
| 		EntityRelationIndex[entityB].Add(new TypeId(RelationTypeIdAssigner<T>.Id)); | ||||
| 		EntityRelationIndex[(int) entityA.ID].Add(new TypeId(RelationTypeIdAssigner<T>.Id)); | ||||
| 		EntityRelationIndex[(int) entityB.ID].Add(new TypeId(RelationTypeIdAssigner<T>.Id)); | ||||
| 	} | ||||
| 
 | ||||
| 	public void Unrelate<T>(in Entity entityA, in Entity entityB) where T : unmanaged | ||||
|  | @ -388,7 +391,7 @@ public class World : IDisposable | |||
| #if DEBUG | ||||
| 	public ComponentTypeEnumerator Debug_GetAllComponentTypes(Entity entity) | ||||
| 	{ | ||||
| 		return new ComponentTypeEnumerator(this, EntityComponentIndex[entity]); | ||||
| 		return new ComponentTypeEnumerator(this, EntityComponentIndex[(int) entity.ID]); | ||||
| 	} | ||||
| 
 | ||||
| 	public IEnumerable<Entity> Debug_GetEntities(Type componentType) | ||||
|  | @ -457,14 +460,14 @@ public class World : IDisposable | |||
| 					messageStorage.Dispose(); | ||||
| 				} | ||||
| 
 | ||||
| 				foreach (var typeSet in EntityComponentIndex.Values) | ||||
| 				foreach (var componentSet in EntityComponentIndex) | ||||
| 				{ | ||||
| 					typeSet.Dispose(); | ||||
| 					componentSet.Dispose(); | ||||
| 				} | ||||
| 
 | ||||
| 				foreach (var typeSet in EntityRelationIndex.Values) | ||||
| 				foreach (var relationSet in EntityRelationIndex) | ||||
| 				{ | ||||
| 					typeSet.Dispose(); | ||||
| 					relationSet.Dispose(); | ||||
| 				} | ||||
| 
 | ||||
| 				foreach (var filter in FilterIndex.Values) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue