Alternativ könntest du z.B. auch einfach mit Unit* bzw Unit& arbeiten und den Typ Unit nach außen hin inkomplett lassen, d.h. auf der anderen Seite deiner Schnittstelle gibts nur das:
|
C-/C++-Quelltext
|
1
|
class Unit;
|
Das könnte er natürlich. Aber dann stellt sich wieder die Frage, wer kümmert sich um das Life-Cycle Management, oder einfach gesagt, wer kümmert sich um das "delete". Wenn es nur eine Factory ist, dann ist das klar. Die Factory erstellt ja nur Instanzen und nichts weiter.
Aber der Punkt mit dem Handle hat noch einen anderen Aspekt. Man könnte nämlich alle Methoden der Unit Klasse in den Controller überführen.
Also statt
|
C-/C++-Quelltext
|
1
2
3
4
5
6
|
class Unit {
void setPosition(const Vec3& pos);
void setState(const bool& active);
private:
Vec3 pos;
bool active;
|
im Controller ein Array haben mit diesen Vec3 als Position und für active:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
class UnitController {
void setPosition(const UnitHandle& handle,const Vec3& pos);
void setState(const UnitHandle& handle,const bool& state);
private:
bool* m_Active;
Vec3* m_Positions;
}
|
Dann könnte eine Update Methode im Controller für alle Units so aussehen:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
|
void update() {
bool* active = m_Active;
Vec3* pos = m_Positions;
for ( int i = 0; i < m_Counter; ++i ) {
if ( *active ) {
*pos += m_Velcoity;
}
}
++pos;
++active;
}
|
Das hat den Vorteil, dass die Daten koherent im Cache liegen und somit die Performance erheblich verbessert werden kann.
Das ist zwar für den ein oder anderen kein "schönes" OO-Design mehr, bringt aber extrem viel Performance.
Gerade bei der Spieleprogrammierung geht es ja um Performance und nicht um den Schönheitspreis für das beste Design.