Effiziente Verwaltung von vielen Instanzen / Klick auf eine Iso Karte



  • Hallo,
    ich hab mich in den letzten Tagen während der Programmierung einer kleinen RTS Demo gefragt, wie eigentlich effizient Instanzen einer Klasse verwaltet werden. Simples Beispiel: 300 Einheiten, die ja alle einzeln angesprochen werden müssen. Läuft das über vector, list, map? Oder was ganz anderes?

    Dann kam mir noch die Frage in den Sinn, wie es abläuft, wenn ich auf eine Isometrische Karte klicke (irgendein Punkt). Meinetwegen steht da ein Gebäude. Wie wird das effizient angesprochen? Ich kann ja nicht jedes Mal die Koordinaten des Feldes mit sämtlichen Instanzen der Objektklasse vergleichen, oder doch? Mir scheint das ziemlich Zeithungrig zu sein.



  • Cloppy schrieb:

    Simples Beispiel: 300 Einheiten, die ja alle einzeln angesprochen werden müssen. Läuft das über vector, list, map? Oder was ganz anderes?

    Nun, das hängt eben genau davon ab wie sie angesprochen werden müssen. So allgemein kann man das nicht sagen, gibt nicht umsonst mehr als nur eine Art von Container...

    Cloppy schrieb:

    Dann kam mir noch die Frage in den Sinn, wie es abläuft, wenn ich auf eine Isometrische Karte klicke (irgendein Punkt). Meinetwegen steht da ein Gebäude. Wie wird das effizient angesprochen? Ich kann ja nicht jedes Mal die Koordinaten des Feldes mit sämtlichen Instanzen der Objektklasse vergleichen, oder doch? Mir scheint das ziemlich Zeithungrig zu sein.

    Wie wärs wenn jedes Feld einfach einen Zeiger auf ein etwaig darauf befindliches Gebäude hält?



  • In den seltensten Fällen sind alle Einheiten und Gebäude gleichzeigit auf dem Bildschirm sichtbar. Stehen die Einheiten also gerade irgendwo rum, da sie keinen Befehl haben und sind auch nicht sichtbar, so brauchen sie nicht berechnet werden.

    Und so ein Punkt in einer Karte lässt sich eigentlich relativ gut berechnen. Bei einer Tilemap braucht man nur die X- bzw. Y-Koordinate durch die X- bzw. Y-Größe eines Tiles teilen, sofern alle Tiles gleichgroß sind.

    Alternativ kann man auch eine Kollisionsabfrage (Maus und Objekt) mit den Objekte durchführen, die überhaupt im Blickfeld liegen.

    Wenn man das möglichst überall beherzigt, dann sollte man damit schon genügend Performance rausholen.


  • Mod

    Cloppy schrieb:

    Hallo,
    ich hab mich in den letzten Tagen während der Programmierung einer kleinen RTS Demo gefragt, wie eigentlich effizient Instanzen einer Klasse verwaltet werden. Simples Beispiel: 300 Einheiten, die ja alle einzeln angesprochen werden müssen. Läuft das über vector, list, map? Oder was ganz anderes?

    Dann kam mir noch die Frage in den Sinn, wie es abläuft, wenn ich auf eine Isometrische Karte klicke (irgendein Punkt). Meinetwegen steht da ein Gebäude. Wie wird das effizient angesprochen? Ich kann ja nicht jedes Mal die Koordinaten des Feldes mit sämtlichen Instanzen der Objektklasse vergleichen, oder doch? Mir scheint das ziemlich Zeithungrig zu sein.

    als programmierer solltest du dich nicht auf religion verlassen, sondern den glauben durch tatsachen ersetzen.

    Bereitet die simpelste implementierung ein problem fuer dich?
    -> ich weiss nicht
      -> wenn es ein generelles performance problem gibt, profile wo
      -> wenn es kein problem gibt, dann musst du es nicht loesen
    -> nein
      -> dann hop hop und sei fleissig statt hypothesen zu generieren, das wird dir weit mehr bringen.
    -> ja
      -> wo, laut deinem profiler. zeig uns den callstack und/oder das code fragment und alles dazu wissenswerte und wir werden dir vorschlaege unterbreiten.
    


  • Danke für die Antworten, das hilft mir schon weiter.

    @rapso
    Das mag stimmen und ist vielleicht auch eine logische Vorgehensweise. Aber ich bin halt TU Student, ich überleg solange bis mir die Lösung als beste erscheint und dann leg ich erst los.
    Auch wenn das vermutlich nicht die beste Art ist 😉


  • Mod

    Cloppy schrieb:

    Danke für die Antworten, das hilft mir schon weiter.

    @rapso
    Das mag stimmen und ist vielleicht auch eine logische Vorgehensweise. Aber ich bin halt TU Student, ich überleg solange bis mir die Lösung als beste erscheint und dann leg ich erst los.
    Auch wenn das vermutlich nicht die beste Art ist 😉

    ach mann, jetzt nimmst du mir sogar das bashen von studenten ab 😛
    Das problem ist aber, die hypothetisch beste loesung ist nicht die real beste loesung. und um die reale zu finden, muss man erstmal eine implementierung haben und dann anhand dieser analysieren, dann die loesung finden, implementieren und wieder analysieren...
    software entwicklung ist eher ein iterativer prozess und kein wasserfall.



  • Von TU Student zu TU Student: Du glaubst gar nicht wie wahr das ist. Überlegen bringt einen maximal soweit dass man einen Ansatz findet der mit Glück in einer weiteren Umgebung einer tatsächlichen Lösung liegt. Gleich eine ebensolche gefunden hab ich durch überlegen jedenfalls noch nie, ganz egal wie lange ich überlegt hab (jetzt mal von Trivialbeispielen abgesehen). Mein erstes Design hat immer Schwachstellen die sich erst offenbaren wenn man das Ding mal tatsächlich Implementiert hat, ganz egal wie perfekt es davor im Kopf ausgesehen haben mag...



  • In diesem Fall würde ich sogar fast sagen, das durchiterieren mit das schnellste ist, was du machen kannst. Zumindest sofern deine Objekte halbwegs sinnvoll definiert sind und hintereinander im Speicher liegen. Die größte Bremse ist nämlich in 99% der Fälle der RAM, und die umgeht man am Besten, indem man die Caches so gut wie möglich ausnutzt. Also: nicht wild im Speicher rum springen.

    Mal davon ab: 300 ist keine Problemgröße. ob du da jetzt Faktor 2 raus holst ist im Vergleich zu einem einzigen Grafikcall so uninteressant...


Anmelden zum Antworten