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

21

30.10.2012, 14:46

Kleine Ergänzungsfrage (wollte nicht exta ein Topic öffnen)

Welche Vorgehensweise würdet Ihr für ein RTS Game im Stil von C&C Red Alert wählen ?

Ich denke mal Quadtree scheidet aus ?

Sorry falls ich damit den Thread sprenge :S

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

22

30.10.2012, 14:51

Hängt davon ab für was. Es ist jetzt ja nich so, dass man in so einem Projekt nur eine einzige Datenstruktur für alles verwendet...

23

30.10.2012, 14:56

Zitat

uhu, *hüpf*, hallo!? Eventuell kannst Du ja mal auf meine Fragen eingehen?



Beide Konstruktionen hatten etwa 4096 einzelne Quads bzw. genau 4096 Sektoren
In Jeden Quad Passten maximal 16, in jeden Grid Sektot 24.
Simulationsraum 1024^2.
Partikelanzahl 32000
Die Partikel sind bisher nur Vektoren ihre Größe soll in der Physik 1 betragen.




Zitat

Verwend ein einfaches, regelmäßiges Grid. Dann kannst du immer direkt auf jede Zelle zugreifen, genau das ist doch der Punkt!?
Die Partikel werden ja aber nicht gleich verteilt sein. Ich gehe dann große bereiche leerer Sektoren durch.

Ich bin bald so weit dann kann ich Nachbarquads finden. Ich mache jetzt den Speedtest. XD
Bilder zu meinem Projekt: ParSim

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

24

30.10.2012, 14:59

Zitat

Verwend ein einfaches, regelmäßiges Grid. Dann kannst du immer direkt auf jede Zelle zugreifen, genau das ist doch der Punkt!?
Die Partikel werden ja aber nicht gleich verteilt sein. Ich gehe dann große bereiche leerer Sektoren durch.

Dann machst du was falsch. Wie gesagt: Lauft doch nicht das ganze Grid ab, sondern merkt dir, in welche Zelle jedes Partikel fällt und lauft nur die Partikel durch!? Dein Grid speicherst du in einem ganz normalen, flachen Array, du kannst dir also jederzeit die Nachbarn einfach ausrechnen...

25

30.10.2012, 15:09

Sieht gut aus:

Alle Quads neu anlegen und durchlaufen dauert: 15ms

Alle Quads neu anlegen und durchlaufen, sowie alle Nachbarn auflistzen dauert: 31ms

Ein vergleichbares Grid neu anlegen und durchlaufen dauert: 7ms

(wieder 32K Partikel)



Schön einfach der Code :D

if (IntRect.Intersect(new IntRect(Node.StartPos, new IntVector2(Node.Size, Node.Size)), Rect))

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
if (Node.Full)
{
MarkNodes(Node.LT_Child, Rect);
MarkNodes(Node.RT_Child, Rect);
MarkNodes(Node.LB_Child, Rect);
MarkNodes(Node.RB_Child, Rect);
}
else
{
//magic code goes here
}

}

Ist bestimmt noch Verbesserungswürdig!



LG
Bilder zu meinem Projekt: ParSim

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Horus« (30.10.2012, 15:14)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

26

30.10.2012, 15:12

Ich versteh diesen Vergleich nicht ganz. Wieso das Grid neu anlegen und durchlaufen? Das geht völlig am Sinn eines Grid vorbei...

27

30.10.2012, 15:15

Dot, Die Partikel werden sich aber ungleichmäßig verteilen. Ist ein Raster dann immernoch schneller?

Aber natürlich hast du recht, so herum also mit Zeiger aufs Raster in den Partikeln, das klingt vernünftig!
Ich dachte immer daran das ganze Raster in einer Schleife zu durchlaufen :D
Sorry irgendwie ein ziemlicher Denkfehler :D
Bilder zu meinem Projekt: ParSim

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

28

30.10.2012, 15:19

Dot, Die Partikel werden sich aber ungleichmäßig verteilen. Ist ein Raster dann immernoch schneller?

Wie gesagt, das hängt davon ab. Aber wenn der Speicherverbrauch des Grid akzeptabel ist und niemals zu viele Partikel in die selbe Zelle fallen können, was bei dir wohl der Fall sein dürfte, dann sehr wahrscheinlich ja...

Aber natürlich hast du recht, so herum also mit Zeiger aufs Raster in den Partikeln, das klingt vernünftig!
Ich dachte immer daran das ganze Raster in einer Schleife zu durchlaufen :D
Sorry irgendwie ein ziemlicher Denkfehler :D

Jo, das ganze Grid durchlaufen geht komplett am Sinn vorbei. Die Tatsache, dass das trotzdem noch doppelt so schnell ist wie der Quadtree, demonstriert schön, wie wichtig Cache Utilization heutzutage ist, die beim Quadtree natürlich völlig im Eimer ist...

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

29

30.10.2012, 15:37

Die Tatsache, dass das trotzdem noch doppelt so schnell ist wie der Quadtree, demonstriert schön, wie wichtig Cache Utilization heutzutage ist, die beim Quadtree natürlich völlig im Eimer ist...

Das musst du jetzt aber mal erklären, warum bei einem Grid der Cache besser genutzt werden können soll.
Ich könnte das nachvollziehen, wenn man das Grid Zelle für Zelle durchlaufen würde, aber das ist ja wie schon gesagt Schwachsinn.
Also durchläuft man Partikel für Partikel. Partikel N kann räumlich total weit weg von Partikel N+1 liegen, wo bringt mir da der Cache etwas?
Selbst die Partikel, die in der selben Zelle sind, befinden sich im Speicher "verstreut" - schließlich speichert ja jeder Partikel nur einen Zeiger auf seine Zelle, und nicht die Zelle "enthält" die Partikel.

Beachte außerdem, dass er die Nachbarschafts-Suche noch gar nicht eingebaut hat.
(wenn er das hätte, dann gäbe es dort sicherlich einen Vorteil beim Grid, eben wegen des Caches)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

30

30.10.2012, 15:52

Die Aussage bezog sich auch auf das Durchlaufen des ganzen Grid... ;)

Werbeanzeige