ZOrder - Wie ordnet man seine Bilder richtig?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Fetze

Betreff: ZOrder - Wie ordnet man seine Bilder richtig?

BeitragSo, März 12, 2006 13:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Ich brauche für mein ST-Bmax-Recoding ein möglichst schnelles System, eine Reihenfolge in meine gemalten Bildchen zu bringen. Die Sache ist die:

Ich habe Raumschiffe, Geschütztürme, Raumstationen, umherfliegende Handelswaren und umherfliegende Projektile von einer Basisklasse "GameObjects" abgeleitet. Später wird es auch noch "Effects" und Ableitungen davon geben (Partikel,...). Das Problem ist nun, dass ich beim Rendern einfach alle GameObjects durchgehe und sie der Reihe nach, wie sie in der Liste stehe, zeichnen lasse, was zur Folge hat, dass das zuletzt erstellte immer zu oberst gezeichnet wird. Stattdessen benötige ich eine viel komplexere Reihenfolge:

Stationen
umherfliegende Handelswaren
Schiff X - Projektile Ebene 0
Schiff X - Schiff selbst
Schiff X - Projektile Ebene 1
Schiff X - Geschütztürme
Schiff X - Projektile Ebene 2

Und hier habe ich die Effekte noch weggelassen. Mit partikelemittern wirds dann richtig lustig, die haben nochmal ein paar Ebenen.

Nun könnte ich natürlich erst alle Stationen zeichnen lassen, dann alle Waren, dann alle Schiffe und im Zeichenvorgang eines Schiffs die zugehörigen projektile und Geschütztürme. Klar. Könnte ich. Aber wenn ich jedem Schiff Daten darüber geben muss, welche Objekte dazu gehören und in welcher Reihenfolge und ob drunter oder drüber und wasweisichnochalles, dann hab ich schnell ein totales Chaos inklusive Geister-Objekten und Speicherverlust.

Was mir viel lieber wäre, wäre ein System, bei dem ich jedem Objekt eine Zahl zuordne und automatisch in der richtigen Reihenfolge gezeichnet wird.
Leider ist das quasi nicht praktikabel bei teilweise rund 500 Objekten, da ich dann Nummernbereich mal Objektzahl Listendurchläufe habe, was bei 500 Objekten eine Zahl von Rund 250.000 Listendurchläufen pro Frame pro Kamera (Jede rendert für sich auf einen bestimmten Bildschirmteil) ergibt. Das ist aus naheliegenden Gründen einfach nicht möglich.

Was habe ich für Alternativen? Könnte man den ZBuffer der 3D-Karte irgendwie dazu verwenden? Wenn ja, wie und wie plattformunabhängig?

Suco-X

Betreff: ........

BeitragSo, März 12, 2006 14:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe mal ein wenig rumgetestet. Mit List.Sort() scheint es wirklich etwas zu langsam. Aber wenn man die Liste zu nem Array schiebt, sortiert und wieder zurück zur Liste, gehts schneller.

Code: [AUSKLAPPEN]

Strict


Type TSprite
   Field Z:Int
   
   Method Compare(Other:Object)
      Local Obj:TSprite = TSprite(Other)
      
      If Not Obj
         Return 1
      EndIf
      
      Return Z-Obj.Z
   End Method
End Type


Const Count:Int = 2000

Local List:TList = New TList


For Local i:Int = 0 Until Count
   Local Sprite:TSprite = New TSprite
   Sprite.Z = Rand(0,3244)
   List.AddLast(Sprite)
Next


Function VersionNormal(List:TList)
   List.Sort()
End Function


Function VersionArray(List:TLIst Var)
   Local Arr:Object[] = List.ToArray()
   Arr.Sort()
   List = List.FromArray(arr)
End Function




Local Time:Int = MilliSecs()

VersionNormal(List)
'VersionArray(List)

Print "TIME: "+(MilliSecs()-Time)



Oder habe ich was übersehen?
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Fetze

BeitragSo, März 12, 2006 14:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, genau das, was ich gebraucht hab Smile

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group