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 freigeben
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.
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
Hilfreichster Kommentar
Noch reproduzierbar/relevant in 3.1 Master 9e7cee2 : solche Datenstrukturen sind noch nicht exponiert.