cooldiman1
Lt. Junior Grade
- Registriert
- Dez. 2011
- Beiträge
- 299
Performance: Suche Algorithmus/Methode um ein Ziel zu ermittel (RTS Game Android)
Hallo liebe CB-Experten,
ich arbeite an einem RTS Spiel für Android und im Moment benötige ich eine bessere Performance.
Infos:
- Ich nutze LIBGDX
- BOX2D
- Java
- Ich habe im Moment noch 3 Threads (Render, Box2D, Rest) (Zukünftig kommt sicherlich noch ein Pathfinder oder so dazu)
Mein Problem:
Ich habe testweise 10.000 Objekte. Diese können schießen, sich bewegen, etc. und sich ein Ziel suchen. Da die Logik für das Suchen eines Ziel sich in jedem Objekt befindet habe ich 10000*10000 Schleifendurchläufe und jedesmal werden alle Einheiten durchgegangen und deren Entfernung zueinander errechnet. Das ist sehr unperformant. Ganze 4-5 Durchläufe schafft mein Thread nur noch bei dieser Objektanzahl pro Sekunde.
Ich benötige eine Lösung. Best Practice.
Code Snippets (Beispielcode von meinen Versuchen):
Diese Funktion befindet sich in der Manager Class die alle units(Objekte) enthält.
Diese Funktion befindet sich in der Unit Class die bei jedem Update einer Unit aufgerufen wird.
Unwichtigen Code habe ich zur Übersicht entfernt.
Gedanken:
- Das Zielsuchen in einen seperaten Thread auslagern. Was aber nur minimal helfen würde, aber trotzdem sinnvoll denke ich.
- Postionen aller Units vor den einzelnen Units update() sortieren?
-
Danke schonmal für eure Hilfe
Gruß,
cooldi
Hallo liebe CB-Experten,
ich arbeite an einem RTS Spiel für Android und im Moment benötige ich eine bessere Performance.
Infos:
- Ich nutze LIBGDX
- BOX2D
- Java
- Ich habe im Moment noch 3 Threads (Render, Box2D, Rest) (Zukünftig kommt sicherlich noch ein Pathfinder oder so dazu)
Mein Problem:
Ich habe testweise 10.000 Objekte. Diese können schießen, sich bewegen, etc. und sich ein Ziel suchen. Da die Logik für das Suchen eines Ziel sich in jedem Objekt befindet habe ich 10000*10000 Schleifendurchläufe und jedesmal werden alle Einheiten durchgegangen und deren Entfernung zueinander errechnet. Das ist sehr unperformant. Ganze 4-5 Durchläufe schafft mein Thread nur noch bei dieser Objektanzahl pro Sekunde.
Ich benötige eine Lösung. Best Practice.
Code Snippets (Beispielcode von meinen Versuchen):
Diese Funktion befindet sich in der Manager Class die alle units(Objekte) enthält.
Code:
public static ArrayList<Vector2> getUnitsPositions()
{
ArrayList<Vector2> p = new ArrayList<Vector2>();
for(BaseObject o: units) // Diese Schleife kostet die gesamte Performance
{
}
return p;
}
Diese Funktion befindet sich in der Unit Class die bei jedem Update einer Unit aufgerufen wird.
Code:
private void searchTarget()
{
if(!this.hasRotationTarget)
{
ArrayList<Vector2> unitsPositions = Manager.getUnitsPositions();
float nearest = this.shootRange;
int count = 0;
for (Vector2 o : units)
{
if(Utility.distance(this.getBodyPosition(), o) <= this.shootRange)
{
float range = Utility.distance(this.getBodyPosition(), o);
if(range < nearest)
{
nearest = range;
baseObjectIndex = count;
}
}
count++;
}
}
}
Unwichtigen Code habe ich zur Übersicht entfernt.
Gedanken:
- Das Zielsuchen in einen seperaten Thread auslagern. Was aber nur minimal helfen würde, aber trotzdem sinnvoll denke ich.
- Postionen aller Units vor den einzelnen Units update() sortieren?
-
Danke schonmal für eure Hilfe
Gruß,
cooldi
Zuletzt bearbeitet: