Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 08, 2025 23:20

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Viele, viele Objekte
BeitragVerfasst: Mo Dez 18, 2006 11:58 
Offline
DGL Member

Registriert: Fr Dez 15, 2006 12:18
Beiträge: 3
Hallo,

ich beschäftige mich seit kurzem mit Delphi und OpenGL und in diesem Zusammenhang benutze ich auch glscene.

Mein Anliegen:
Ich habe eine Plane der Größe 100x100 und möchte darauf jetzt so ca. 200000 :D Objekte rendern.
Diese Objekte können z.B. einfach nur Sprites sein.
Ich kenne die Position der Objekte und es gibt insgesamt nur 12 Typen (Grafiken) die auftreten können, d.h. es wiederholt sich relativ viel.
Erzeuge ich z.B. Proxyobjects, bricht die Performance relativ schnell ein (ab 10000 wird's richtig langsam).

Sind Imposter dafür am besten geeignet???
Ich habe ein Tutorial zu "Imposter" gefunden bekomme dies aber für mein Problem nicht zum Laufen.

Meine Frage: Gibt es ein gutes Tutorial zu diesen Impostern, oder gibt es überhaupt eine sinnvolle Lösung soviele Objekte darzustellen?

Gruß
CommSter


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 18, 2006 12:12 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jun 20, 2003 13:59
Beiträge: 134
hi,
weis grad nich genau was du eigentlich damit vor hast aber hier erstmal nen paar links:

http://wiki.delphigl.com/index.php/Tutorial_Renderpass
http://wiki.delphigl.com/index.php/Tutorial_Pixelbuffer
http://wiki.delphigl.com/index.php/Tutorial_Frustum_Culling
http://wiki.delphigl.com/index.php/Tutorial_Octree

hoffe das is in etwa was du suchst.

_________________
ghost-site.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 18, 2006 12:18 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Falls immer nur wenige Objekte die Position wechseln, ist es sinnvoll sie alle in einem Vertex Buffer zu speichern und nur die geänderten Positionen zu aktualsieren.

Instancing wäre auch eine Möglichkeit, da es nur wenige verschiedene Typen sind:
http://download.nvidia.com/developer/SD ... ancing.pdf

Imposter nützen hier vermutlich wenig, da es zu viele Objekte sind und die Einsparungen pro Objekt zu wenig sind.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 18, 2006 15:52 
Offline
DGL Member

Registriert: Fr Dez 15, 2006 12:18
Beiträge: 3
Okay, ersteinmal danke für die schnelle Antwort.
Ich versuche jetzt nochmal das Problem ein bischen besser zu beschreiben.

Ich habe bsw. eine Kugel und Würfel. Ich habe jetzt eine große Fläche auf der ich viele "Kopien" dieser beiden Objekte verteilen möchte.

Die Fläche ist aber 100x100 und die Objekte haben dann eine Breite und Höhe von 0.1, so dass theoretisch 1000000 Mio Objekte Platz finden würden,
es werden aber nur ca. 200000 benötigt.

vorher
----------
----------
----------
----------
----------
----------


nachher

w--w--w--
--k--w---
---k---w-
--w---k--
---k--k-k
--w---k--

w = Würfel
k = Kugel

Statt Würfel und Kugel habe ich nun aber 12 Grafiken, welche auf die "Welt" verteilt werden sollen.

Ich hoffe, dass ist ein bischen verständlicher, obwohl ich mir das lieber nicht nochmal durchlese :wink:

Gruß
CommSter

P.S.: Eine Frage könnte auch sein: Warum ist

for i:=0 to 200000 do
begin
glscene.objects.addnewchild(GLSprite);
end;

soooooooooooooooo langsam???

Liegt das an der Baumstruktur, in welcher die Objekte gehalten werden?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 18, 2006 16:00 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
weil die Speicheranforderungen relativ lahm sind. Probier mal FastMM4 aus. Außerdem sind deine Objekte echt 3D oder reichen Billboards? Weil 200k Objekte ist für Echtzeit eigentlich zu viel.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 18, 2006 16:08 
Offline
DGL Member

Registriert: Fr Dez 15, 2006 12:18
Beiträge: 3
es würden auch billborads reichen und hab' das ja auch schon mit imposter, oder impostor versucht, aber das hat nicht wirklich funktioniert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 18, 2006 17:40 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja. Die Schleife ist langsam weil der Delphi SpeicherManager dabei total überfordert ist. Eine Alternative wäre da der erwähnte Speichermanager FastMM4.

Aber ich denke du wirst auch noch ein anderes Problem haben. Und zwar glScene selbst! Ich sage das nicht nur weil ich dagegen wettern möchte sondern auch weil ich zu meiner Anfangszeit auch mit glScene gearbeitet habe und dort habe ich festgestellt, dass die Klassenstruktur dem Ganzen das Genick bricht. Ich liebe Objekt Orientierung aber in diesem Falle ist sie Fatal.

Einfache Erklärung dafür. Jeder Würfel/Kugel/Fläche ist ein Objekt und jedes Objekt hat eine ganze Reihe an Einstellungen. Farbe, Textur, Vorderseite, Rückseite etc. Und wenn ein solches Objekt gezeichnet wird dann werden alle diese Einstellungen in OpenGL gesetzt. Und das ist gar nicht mal wenig. Oder anders. Wenn du "nur" 20000 mal ein und das selbe Objekt zeichnen möchtest genügt es dann nicht nur alle Einstellungen ein mal zu tätigen? Genau das macht glScene aber eben nicht. Ich weiß nicht ob er das mittlerweile besser kann aber ich denke eher nicht.

Aber auch wenn glScene das besser macht sind 200.000 Billboard doch schon ein ganz gehöriges Stück arbeit. Wenn man diese in einer Schleife rendert. Du hast dort viel zu viele OpenGL Aufrufe bzw irgendwelche Sachen die die CPU machen muss. Besser wären bei fixen Strukturen entweder Displaylisten oder bei dynamischen Strukturen Vertex Buffer Objects kurz VBOs. Damit erstellst du dir einen Bereich auf der Grafikkarte und lädst dort die Daten hoch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 19, 2006 00:46 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Raster mit 1000x1000 Objekten
=> wenn du alle gleichzeitig siehst ist jedes Objekt 1 Pixel groß
was wiederum bedeutet, dass eine Textur reichen würde.

Wenn nicht alle gleichzeitg sichtbar sind, dann empfiehlt sich das was PhoenixGL vorgeschlagen hat (namentlich Quadtree/Octree und Frustum Cullng).

Und glscene ist ja ein Scenengraph, oder? Es stellt sich hier zum einen die Frage ob du wirklich jedes Frame den Scenengraphen neu aufbauen musst oder ob sich da nicht eine etwas bessere Lösung finden liese (wiederum lass ich hier mal das Wort Quadtree fallen). Wenn sich mit diesem Scenengraphen keine bessere Lösung finden lässt (was ich bezweifle), dann könnte man ggf. darüber nachdenken ob man nicht einen Scenengraphen speziell für diese Aufgabe selbst macht oder aber einen anderen Scenengraphen verwendet der das kann.

Es wäre also noch interessant zu wissen, wie groß der Bereich ist den du auf einmal siehst bzw. wie ausgeprägt diverse Zoom-Funktionalität sein sollte. Und zum anderen wäre es noch nützlich zu wissen wie dynamisch deine Szene ist. Also verändern sich alle 200.000 Objekte jedes Frame (oder in anderen Intervallen) oder sind die Änderungen nur eher geringfügig (ein paar 100 oder 1000 Objekte je Frame ändern ihre Position).


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.013s | 16 Queries | GZIP : On ]