Beste Verwaltung von 3D-Objekten?
Übersicht

PacManiBetreff: Beste Verwaltung von 3D-Objekten? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo zusammen,
ich habe mittlerweile ein fast abgeschlossenes Blitz3D-ähnliches XNA-Framework erstellt, welches auch die Klasse Mesh besitzt, die alle *Mesh*- bzw. *Entity*-Funktionen von B3D besitzt (ich unterscheide nicht mehr zwischen diesen beiden Dingen). Allerdings war ich nie ganz zufrieden mit der Verwaltung von Meshes von B3D. Diese sieht ja so aus, das alle Meshes gezeichnet werden, die geladen sind, außer man versteckt sie mit HideEntity. Das wär zwischen Levelwechsel etc. immer etwas nervig, da man sich merken musste, welche Meshes auszublenden sind etc.. Bei einem eigenen Framework bieten sich natürlich folgende Verwaltungszenarien an, die alle gleich einfach zu programmieren wären: - Wie in B3D: Alle Meshes zeichnen, außer, sie werden mit HideEntity versteckt oder mit ShowEntity wieder angezeigt - Wie in B3D, aber mit "Worlds": Alle Meshes der übergebenen "Welt" werden gezeichnet. Eine Welt ist eine Teilsammlung aller Meshes. Je nachdem, welche "Welt" man gerade benötigt, werden nur die Meshes dieser einen gezeichnet, und die anderen bleiben unsichtbar (außer, man zeichnet zwei Welten hintereinander). - Wie in XNA bzw. bei Blitz-Bildern: Soll ein Mesh sichtbar sein, wird es in der Hauptschleife ausdrücklich mit Draw() gezeichnet. Wird der Draw-Code übersprungen, bleibt das Mesh für den einen Frame unsichtbar. Welche Verwaltungsart würdet ihr für sinnvoll halten? Ich kann mich nicht entscheiden und mir wäre jede Verwaltung gefallen. Gruß, Pac-Man |
||
![]() |
tft |
![]() Antworten mit Zitat ![]() |
---|---|---|
ob sich eine Aussage dazu überhaupt pauschal lohnt? es ist halt auch stark davon abhängig von welchen mengen wir sprechen. Bei 100 Mesh pro Welt ist eine solche einfache aussage und Handhabung machbar. Aber bei 1.000.000 sieht das schon anders aus. Ebenfalls wichtig ist ob es sich um statische oder bewegliche Objekte handelt wie gross der sicht Radius ist und ob es ein Multi Player oder singel Player Game wird. Es kann sinnfoll sein die Welt in Quadranten aufzuteilen und nur die sichtbaren zu zeichnen. Es kann sein das es sinfoll ist einen statischen teil einmal zu rendern und dann mehrmals als Hintergrund zu benutzen und den beweglichen teil drüber zu rendern. Und überhaupt ..... wiso XNA ? Wenn du einen einfach switch in Blitz3D benötigst benutze ein Pivot und hänge alle daran. Dann kannste mit einem einfache EntityHide() alle child Mesh mit abschalten. | ||
TFT
https://www.sourcemagic.ch Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!! |
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Alternative: Du hast als Basis die Variante 1 (treu B3D) und erstellst einen Type namens EntityCollection, der im Grunde genommen nur eine gewrappte TList von Entities ist, aber alle Funktionen der Entity-API unterstützt und einfach auf jedes Entity einzeln anwendet.
Das würde viel Verwaltungsaufwand sparen, da man z.B. nur world1.HideEntity; world2.ShowEntity ausführen muss, um das Problem zu lösen. Als Nebenprodukt kann man mit einem Funktionsaufruf eine bestimmte Ansammlung von Entities färben (oder gar mit einem Brush bearbeiten) oder bestimmte Entities um 1 auf der lokalen Z-Achse verschieben (also vorwärts bewegen). ZEVS P.S: ttf war schneller, im Grunde genommen war das die Pivot-Variante. |
||
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, natürlich wären z.B. Worlds für gerade mal 20 Meshes völlig überzogen. Ich möchte das Framework allgemein verwendbar machen, und von daher würde mich interessieren, was ihr für den "Goldenen Schnitt" halten würdet.
Die Pivot-Variante ist auch eine gute Idee. XNA, weil ich auf DirectX 9 setze und meine C++-basierte Engine noch nicht fertig ist. Zu oft hat mich mittlerweile enttäuscht, weswegen meine B3D-Spiele nicht mehr auf Intels verramschten Onboardchips oder nVidia-Karten laufen (selbst AMD hat ja mittlerweile mistige Treiber für DX7 rausgegeben). XNA ist mit .NET 4 auf neuen Rechnern auch nicht langsamer als Blitz3D, obwohl es mehr moderne (durch DX9 natürlich mitgebrachte) Features besitzt. Und B3D mit nem DX9-Wrapper wird ja noch etwas langsamer, wenn es überhaupt vollständige, vernünftige Wrapper gibt. Außerdem kann ich dann noch lange nicht mit Leckerbissen wie Objektorientierung arbeiten, geschweige einer IDE mit integriertem SVN (--> Visual Studio & TFS). Dennoch gefällt mir Blitz3Ds einleuchtende Art, Audio, Bilder, Kamera und Modelle zu verwenden, weswegen ich mir ein B3D-ähnliches (aber natürlich objektorientiertes) XNA-Framework aufgebaut habe. |
||
![]() |
tft |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann solltest du folgende Einteilung vornehmen.
Alle mesh in einer verketteten liste. eine liste mit zeigern für Mesh in Welt eine für Statisch in Welt eine für Move in Welt eine für sichtbar in Welt ( Camera oder Quadrant ) der erhöte Daten Aufwand wird durch schnellen Zugriff wider aufgehoben. Ohne solche listen must du ja immer alle objecte prüfen. Ist natürlich etwas kompliziert aber es lohnt sich. Habe mal mit Blitz Basic3D auf diese art 500.000 Mesh mit 50 FPS berechnet. Dazu gehören natürlich rutinen die bei bewegung prüfen auf quadrant wechsel und objecte die weit weg sind nur alle 5 Frames berechnen. Aber wenns einfach sein soll..... eine liste mit mesh Zeigern pro Welt und beim rendern auf Welt und Sichtbarkeit prüfen. |
||
TFT
https://www.sourcemagic.ch Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!! |
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, das wäre doch etwas zu viel des Guten. Die technische Umsetzung der B3D-Mit-Welten-Variante wäre ja am besten zu lösen, indem ich einfach eine World-Eigenschaft der Mesh-Klasse hinzufüge. Die gesetzte Welt fügt dann dieses Mesh in ihre interne Meshliste hinzu. | ||
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
Rechtmachen kannst Du es sowieso nicht allen ![]() Ich beobachte zumindest in meinen eigenen Codes, dass nach LoadXYZ() oft HideXYZ() kommt. Ist vielleicht auch gar nicht so unsinnig, immerhin lädt man ja zuerst die Resourcen, und fängt dann an, sie in der Welt zu verteilen, und wie wir ja alle wissen, ist nur selten alles gleichzeitig sichtbar. |
||
Starfare: Worklog, Website (download) |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
An sich brauchst du ja nicht mal eine neue Klasse, um Welten zu beinhalten - wenn du Parenting drin hast, kannst du ja einfach standardmässig beim Programmstart einen Pivot o.ä. erstellen, der automatisch Parent wird von allen Meshes, die danach erstellt werden. Besagter Pivot lässt sich dann mit entsprechenden Befehlen austauschen, damit die darauffolgend erstellten Meshes dann vom neu eingesetzten Pivot Child werden.
Vorteil ist, dass alles einheitlich ist - den Pivot kannst du ja zeigen/verstecken wie ein normales Entity und somit gleich die ganze "Welt" ausblenden. Und auch wenn man es vermutlich selten braucht, du könntest damit sogar mehrere Welten gleichzeitig anzeigen, Welten verschieben usw. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich sehe schon, ihr tendiert alle einstimmig in Richtung Punkt 2 ![]() Dann werde ich das demnächst so umsetzen, denke ich mal. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group