forked from mirrors/0ad
Avoid slightly-expensive QueryInterface() calls
Add CEntityHandle which wraps an entity_id_t and also has a pointer to a per-entity array of IComponents. QueryInterface/CmpPtr on a handle just involve a couple of pointer dereferences instead of a map lookup. This requires sizeof(void*) per registered interface type per entity, which is currently ~0.5KB per entity, which shouldn't be a problem. This was SVN commit r13825.
This commit is contained in:
@@ -97,19 +97,22 @@ public:
|
||||
CParamNode noParam;
|
||||
CComponentManager::ComponentTypeId cid;
|
||||
|
||||
// Add native system components:
|
||||
componentManager.AddComponent(SYSTEM_ENTITY, CID_TemplateManager, noParam);
|
||||
componentManager.InitSystemEntity();
|
||||
CEntityHandle systemEntity = componentManager.GetSystemEntity();
|
||||
|
||||
componentManager.AddComponent(SYSTEM_ENTITY, CID_CommandQueue, noParam);
|
||||
componentManager.AddComponent(SYSTEM_ENTITY, CID_ObstructionManager, noParam);
|
||||
componentManager.AddComponent(SYSTEM_ENTITY, CID_ParticleManager, noParam);
|
||||
componentManager.AddComponent(SYSTEM_ENTITY, CID_Pathfinder, noParam);
|
||||
componentManager.AddComponent(SYSTEM_ENTITY, CID_ProjectileManager, noParam);
|
||||
componentManager.AddComponent(SYSTEM_ENTITY, CID_RangeManager, noParam);
|
||||
componentManager.AddComponent(SYSTEM_ENTITY, CID_SoundManager, noParam);
|
||||
componentManager.AddComponent(SYSTEM_ENTITY, CID_Terrain, noParam);
|
||||
componentManager.AddComponent(SYSTEM_ENTITY, CID_TerritoryManager, noParam);
|
||||
componentManager.AddComponent(SYSTEM_ENTITY, CID_WaterManager, noParam);
|
||||
// Add native system components:
|
||||
componentManager.AddComponent(systemEntity, CID_TemplateManager, noParam);
|
||||
|
||||
componentManager.AddComponent(systemEntity, CID_CommandQueue, noParam);
|
||||
componentManager.AddComponent(systemEntity, CID_ObstructionManager, noParam);
|
||||
componentManager.AddComponent(systemEntity, CID_ParticleManager, noParam);
|
||||
componentManager.AddComponent(systemEntity, CID_Pathfinder, noParam);
|
||||
componentManager.AddComponent(systemEntity, CID_ProjectileManager, noParam);
|
||||
componentManager.AddComponent(systemEntity, CID_RangeManager, noParam);
|
||||
componentManager.AddComponent(systemEntity, CID_SoundManager, noParam);
|
||||
componentManager.AddComponent(systemEntity, CID_Terrain, noParam);
|
||||
componentManager.AddComponent(systemEntity, CID_TerritoryManager, noParam);
|
||||
componentManager.AddComponent(systemEntity, CID_WaterManager, noParam);
|
||||
|
||||
// Add scripted system components:
|
||||
if (!skipScriptedComponents)
|
||||
@@ -120,7 +123,7 @@ public:
|
||||
cid = componentManager.LookupCID(name); \
|
||||
if (cid == CID__Invalid) \
|
||||
LOGERROR(L"Can't find component type " L##name); \
|
||||
componentManager.AddComponent(SYSTEM_ENTITY, cid, noParam)
|
||||
componentManager.AddComponent(systemEntity, cid, noParam)
|
||||
|
||||
LOAD_SCRIPTED_COMPONENT("AIInterface");
|
||||
LOAD_SCRIPTED_COMPONENT("Barter");
|
||||
@@ -134,7 +137,7 @@ public:
|
||||
|
||||
if (!skipAI)
|
||||
{
|
||||
componentManager.AddComponent(SYSTEM_ENTITY, CID_AIManager, noParam);
|
||||
componentManager.AddComponent(systemEntity, CID_AIManager, noParam);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user