In meiner ECS-Implementierung verwende ich bitweise Operationen (wie in diesem Thread beschrieben und dargestellt ), um einer Entität mitzuteilen, aus welcher Art von Komponenten sie derzeit besteht. Meine Entity
Klasse hat also folgendes Mitglied:
unsigned long m_CompMask;
Die verschiedenen Komponententypen werden dann als definiert enum
, deren Elementwerte alle Zweierpotenzen sind:
enum ComponentType
{
COMP_TYPE_UNKNOWN = 0,
COMP_TYPE_PERSON = 1,
COMP_TYPE_RENDERABLE = 2,
COMP_TYPE_MOVEABLE = 4,
[...]
};
Jedes Mal, wenn eine neue Komponente zu meiner Entitätsinstanz hinzugefügt wird, führe ich die folgende Bitoperation aus, um die Maske zu aktualisieren (wobei newType Mitglied der enum
oben genannten ist):
m_CompMask |= newType;
Mit diesem Ansatz kann ich effizient prüfen, ob eine bestimmte Entitätsinstanz eine bestimmte Komponente enthält (und daher für ein bestimmtes System relevant sein kann), z.
return (m_CompMask & type);
Der begrenzende Faktor bei diesem Ansatz ist jedoch die m_CompMask
Variable, da sie nicht mehr als 64 Komponententypen verarbeiten kann (wenn ich sie auf erhöhe unsigned long long
).
Ich erwarte nicht, dass ich in meinem aktuellen Projekt mehr als das brauche, aber ich würde trotzdem gerne einige Ideen zu Alternativen hören, die mehr als 64 Typen zulassen (wie es große Spiele sicherlich müssen) und gleichzeitig die Leichtigkeit und Effizienz von beibehalten diese bitweisen Operationen so viel wie möglich? Irgendwelche Ideen, wie dies in "richtigen großen" Projekten gehandhabt wird ?