Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Performant sortieren

Yves3 / 8 Antworten / Flachansicht Nickles

Hallo

Ich habe ein eindimmensionales WORD-Array.
Immer 6 Werte in diesem Array gehören zusammen und ihnen ist ein Wert aus einem zweidimmensionalen Int-Array zugeordnet.

Dabei geht es um eine TileEngine.. Den 6 Word-Indices ist je eine Textur zugeordnet.

Ich muss jetzt die Indices nach den Texturen sortieren, denen sie zugeordnet sind und je in einem separaten Array der Reihe nach festhalten, (1) um welche Textur es sich handelt und (2) wie viele Indices zu dieser Textur passen.

Am Schluss würde ich dann also 3 Arrays verwenden:
1. Array mit allen Indices sortiert nach dazugehörigen Texturen
2. Array, in dem gespeichert ist, welche Textur jeweils zu den Indices gehört
3. Array das angibt, wieviele Indices jeweils zur gleichen Textur gehören

Ich rufe dann die Zeichenfunktion für jede Textur einmal auf, so nach dem Stil:

int StartIndex=0;
for(int i=0; i {
SetTexture(Textur[Array2[i]])
Draw(Array1, StartIndex, StartIndex+Array3[i]);
StartIndex += Array3[i];
}

Der Witz an dem ganzen ist, dass das Sortieren und das Erstellen der 3 Arrays in jedem Frame gemacht werden musss und es daher schon verdammt schnell sein müsste.
Meine bisherigen Lösungsideen scheinen mir alle ein bisschen umständlich.

Ich hoffe ihr hab verstanden, wie ich das meine und könnt mir eventuel l helfen :)

Danke!





[Diese Nachricht wurde nachträglich bearbeitet.]

bei Antwort benachrichtigen
mr.escape Yves3 „Bisher hatte ich ja auch vor, nur den sichtbaren Teil zu sortieren. Das ist aber...“
Optionen

Du könntest doch die sichtbare liste durchgehen und in ein n-faches array jeweils eine verkettete liste aufbauen.
Das n-fache array hätte für jede textur einen eintrag (den start der jeweiligen verketteten liste), also nur einmal allozieren und die elemente der verketteten liste kämen auch aus einem vorher allozierten array für die "tiles".
Z.b.:
class TileList;
class TileList {
    Tile tile;//oder auch *tile, was immer am besten passt bzw. bedeutet
    TileList *next;
};

class TextList {
    Texture texture;//oder auch *texture, was immer am besten passt bzw. bedeutet
    TileList *first;
    TextList(){first=NULL;}
}

//dann später im code

TileList tilelist[tilecount];//statisch oder dynamisch, jedenfalls ein array
TextList textlist[textcount];//dito

//und in jedem frame
for(int i=0;i<textcount;i++) tlist[i].first=NULL;//verkettete liste leeren
for(int i=0;i<tilecount;i++){//bzw. nur die sichtbaren!
    int acttext=GetTextNum(i);//gibt die texturnummer für tile i zurück
    //könnte auch ein tile[i].textnum sein o.ä.
    tilelist[i].next=textlist[acttext].first;
    textlist[acttext].first=tilelist+i;
}
//und dann beim zeichnen
for(int i=0;i<textcount;i++){
    TileList *acttile=textlist[acttext].first;
    if(acttile) SetTexture(i);
    else continue;//unbenutzte textur
    while(acttile){
        DrawTile(acttile->tile);
        acttile=acttile->next;
    }
}

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen