Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

07.03.2011, 22:37

Spiele Objekte managen

Hallo,

ich werden (versuche) demnächst ein Spiel zu programmieren, baue gerade ein System mit SFML auf (wo schon das GUI usw. existiert und man Gui-Elemente oder Spiel-Objekte erstellen und einfach hinzufügen kann).

Jetzt überlege ich mir wie man Objekte managen kann. Als Beispiel nehme ich mal ein Strategiespiel wie Age of Empires, Emire Earth oder Star Craft (die müssten ja bekannt sein :)). Das Spiel (2D) hat jetzt ganz viele Objekte die man zeichnen oder auf Kollision prüfen kann/soll. Bei einer Spiel-Fläche von einem Screen (Bildschirm) zeichnet man halt alle, aber wenn man eine Größe von 10x10 Screens hat, dann muss man ja alle Objekte mit if() durch gehen und prüfen ob das Objekt sich im Screen befindet, dann zeichnen. Bei ca. 100 Objekte geht das vielleicht noch aber bei 20.000 dauert das schon länger.

Ich hab mir überlegt ein 2D Matrix zu erstellen, so'ne Art Schachbrett, und da alle Objekte positionieren. So kann man mit die Position des Screens über die Matrix auf die Objekte zugreifen (hoffe ist verständlich). Auch bei Kollision fragt das Objekt ab ob in Matrix[45][89] ein Objekt ist oder nicht.

Bei der ersten Variante mit if() und 20.000 Objekten hätte der Rechner ja 20.000^19.000 Berechnungen und bei der zweite Varainte 20.000^(3 - 5).

Ist das der richtige Ansatz oder gibt es eine andere Lösung!?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

07.03.2011, 22:47

Prinzipiell ist das der Weg, aber wenn du es ein wenig dynamischer haben willst, dann kannst du das mit einem Quadtree machen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

07.03.2011, 22:50

Der Ansatz mit dem Grid ist schon ganz gut so, würd ich einem Quadtree vermutlich sogar vorziehen, gerade weil ich es dynamisch haben will (Bäume habens nicht unbedingt so gern dynamisch ;) ).

buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

4

08.03.2011, 08:54

Also wenn Du dir ernsthaft Sorgen über die Performance machst, dann ist die Frage eher zweitrangig. Da Du oft das Wort Objekt verwendest, fürchte ich, dass Du damit Klassen meinst. Eventuell sogar noch eine gewisse Hierarchie von Klassen. Das tötet Deine Performance. Nicht das Thema Array oder Quadtree.
Denk nicht an Objekte oder Klasse. Sondern mach Dir Gedanken, wie Du die Daten im Speicher anlegst, so dass Du schnell über gewisse Ding iterieren kannst. Fasse Daten nicht nach Ihrer logischen Struktur sondern nach Zugriffsmustern zusammen. Wenn der Prozessor Daten zusammenhängend aus dem Speicher lesen kann, dass ist das viel effizienter als eine aufgeblähte Klassenstruktur.
Hier mal ein Link, der kurz und knapp Dir einen Denkanstoss geben sollte:
http://altdevblogaday.org/2011/03/04/par…emory-patterns/

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

08.03.2011, 09:17

Fasse Daten nicht nach Ihrer logischen Struktur sondern nach Zugriffsmustern zusammen.

Also das halte ich für großen Quatsch und macht bei GameObjects meiner Meinung nach keinen Sinn. Das mag ja für Partikel schön und gut sein, aber für komplexe logische Objekte ist es das ganz und gar nicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

6

08.03.2011, 09:23

Meinst Du also? Erscheint es Dir denn nicht logisch? Wenn man sich mal ein bisschen damit beschäftigt, wie ein Computer funktioniert, dann erscheint das doch nicht so abwegig, oder? Du mußt es ja nicht machen. Aber dann wunder Dich nicht, warum Du ein ganz tolles OOP Design hast, aber die Performance in den Keller geht sobald mal ein paar Objekte sich in Deinem Game tummeln.
Ich habe ihm ja nur einen Tip gegeben, wie andere so etwas machen und z.B. in professionellen Engines das gemacht wird.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

08.03.2011, 09:27

Quatsch. Nicht die Art des Zugriffs ist entscheidend, sondern die Komplexitätsklasse. Und das hat mit OOP auch nichts zu tun. Du kannst OOP programmieren und einen Algo in O(n) nutzen oder ohne OOP einen von O(n²). Welcher davon bei mehr Objekten schneller arbeitet, das sollte offensichtlich sein.

Alle Spiel-Objekte zu zersplittern und nach Zugriffsmustern aufzuspalten ist nicht die Methode, die gängige Engines wählen. Wäre auch ziemlich grauenhaft, wenn man statt einem soliden und gekapselten Objekt plötzlich dutzende Arrays/Maps oder Listen von einzelnen Attributen hätte.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (08.03.2011, 09:33)


buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

8

08.03.2011, 09:47

Naja, ich lasse das mal so im Raum stehen. Habe keine Lust mich hier mit Dir über so offensichtliche Ding zu streiten.
Aber schau doch mal http://www.bitsquid.se/index.html an. Das sind 2 Jungs, die wirklich Ahnung haben und an einer professionellen Engine arbeiten.
Dort findest Du sehr viel zum Thema effiziente Datenhaltung.
Es mag ja sein, dass es nicht in Dein Weltbild passt, aber die Welt da draussen ist nun mal leider so.
Selbst in DirectX findet man viele passende Anleihen. Warum steht denn überall, dass man Render Calls zum Beispiel als Batch ausführen soll.
Weil es viel effektiver ist, wenn man eine große Menge Daten auf einmal verarbeitet statt in kleinen Teilen. Das ist das gleiche Prinzip.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

08.03.2011, 10:08

Und was bitte haben Render-Calls mit Game-Objekten zu tun? Du wirfst hier ein paar Dinge ganz schön durcheinander.
Es ging in diesem Topic auch nie um Draw-Call-Efficiency.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

10

08.03.2011, 10:17

Du willst es nicht verstehen. Das sollte ja auch nur ein weiteres Beispiel sein.
Es ist doch nicht schlimm, wenn Du es nicht begreifst. Ich wette, Du hast Dir das noch nicht einmal angeschaut,
weil Du stur an Deiner Auffassung festhälst. Das ist ja auch in Ordnung. Aber vielleicht liest ja auch jemand anders
das hier, der etwas offener ist und das versteht.
Ich weiß ja auch, dass es ein ziemliches Umdenken beinhaltet und das schafft nicht jeder.

Werbeanzeige