ZOrder - Wie ordnet man seine Bilder richtig?
Übersicht

![]() |
FetzeBetreff: ZOrder - Wie ordnet man seine Bilder richtig? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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-XBetreff: ........ |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke, genau das, was ich gebraucht hab ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group