Godot: Doppelte verknüpfte Liste dem Skript zugänglich machen

Erstellt am 26. Nov. 2016  ·  3Kommentare  ·  Quelle: godotengine/godot

Es gibt eine doppelt verlinkte Liste im Godots-Quellcode ( core/list.h ).
Es wäre schön, wenn dies aufgedeckt würde, da es einige Fälle gibt, in denen eine doppelt verkettete Liste als vektorbasiert viel besser abschneidet.
Vor allem, wenn es darum geht, Elemente an jeder beliebigen Position außer am Ende einzusetzen/zu entfernen.

Ich könnte etwas daran arbeiten, bin mir aber nicht sicher, wie ich mit dem Sperren und Registrieren umgehen soll (obwohl ich versuchen könnte, das Verhalten der Array-Klasse zu spiegeln).
Grundsätzlich die Liste freigebenund Liste::Element sollte den Trick machen, denke ich.?
Die Implementierung als iterierbar sollte auch ähnlich wie bei Array funktionieren.

Zusätzlich (und wenn gewünscht könnte ich ein anderes Problem dafür öffnen) wäre es auch schön, die core/ring_buffer.h als Warteschlange freizugeben.
Sie sollte als Warteschlange unter Verwendung einer doppelt verketteten Liste (und def. besser als eine vektorbasierte Liste) besser funktionieren, mit der Einschränkung, dass sie eine "feste" Größe hat und möglicherweise ungenutzten Speicher von c zuweist.
Aber es gibt Fälle, in denen genau dieses Verhalten erforderlich ist.

archived feature proposal core gdscript

Hilfreichster Kommentar

Noch reproduzierbar/relevant in 3.1 Master 9e7cee2 : solche Datenstrukturen sind noch nicht exponiert.

Alle 3 Kommentare

Noch reproduzierbar/relevant in 3.1 Master 9e7cee2 : solche Datenstrukturen sind noch nicht exponiert.

Wollte gerade auf reddit posten und fragen, ob es eine richtige Linked-List-Implementierung gibt, die ich verwenden kann.

Ich brauche eine schnelle FIFO-Liste, und das Array funktioniert nicht.

Habe dies gerade als Array-Ersatz geschrieben und erhebliche Geschwindigkeitsverbesserungen erhalten:

extends Node

var front_space = 0
var array_len = 0
var array_data = []

func push_back(val):
    if array_data.size() < front_space+array_len+1:
        enlarge()
    array_len += 1
    array_data[front_space+array_len-1] = val

func pop_back():
    if array_data.size() > array_len*8:
        reseat()
    array_len -= 1
    return array_data[front_space+array_len]

func back():
    return array_data[front_space+array_len-1]

func pop_front():
    if front_space > array_len:
        reseat()
    if array_data.size() > array_len*8:
        reseat()
    front_space += 1
    array_len -= 1
    return array_data[front_space-1]

func front():
    return array_data[front_space]

func size():
    return array_len

func enlarge():
    array_data.resize(front_space+array_len*2+1)

func reseat():
    var new_array = []
    new_array.resize(array_len*2)
    for i in range(array_len):
        new_array[i] = array_data[i+front_space]
    front_space = 0
    array_data = new_array

func print_debug():
    print("front: ", front_space,", len: ",arr

Funktions- und Verbesserungsvorschläge für die Godot Engine werden jetzt in einem speziellen Godot Improvement Proposals (GIP) ( godotengine/godot-proposals ) Issue Tracker diskutiert und überprüft. Der GIP-Tracker verfügt über eine detaillierte Problemvorlage, die so gestaltet ist, dass Vorschläge alle relevanten Informationen enthalten, um eine produktive Diskussion zu beginnen und der Community zu helfen, die Gültigkeit des Vorschlags für die Engine zu bewerten.

Der Haupttracker ( godotengine/godot ) ist jetzt ausschließlich

Wenn Sie an diesem Feature-Vorschlag interessiert sind, öffnen Sie bitte

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen