В исходном коде Godots есть список с двумя ссылками ( core / list.h ).
Было бы неплохо, если бы это было раскрыто, поскольку в некоторых случаях двойной связанный список работает лучше как векторный.
Особенно, когда речь идет о вставке / удалении элементов в любом месте, кроме конца.
Я мог бы поработать над этим, но не уверен, как обрабатывать блокировку и регистрацию (хотя я мог бы попытаться отразить поведение класса Array).
В основном выставляем список
Реализация его как итерируемого должна также работать аналогично тому, как это делает Array.
Кроме того (и если бы я попросил, я мог бы открыть еще одну проблему для этого), выставление core / ring_buffer.h в качестве очереди также было бы полезно для нужд очереди.
Он должен работать лучше как очередь с использованием двусвязного списка (и, по определению, лучше как список на основе векторов) с ограничением, заключающимся в том, что он имеет «фиксированный» размер и потенциально выделяет неиспользуемую память c.
Но есть случаи, когда нужно именно такое поведение.
Все еще воспроизводимый / актуальный в 3.1 master 9e7cee2: такая структура данных еще не раскрыта.
Собирался опубликовать на Reddit вопрос, есть ли подходящая реализация связанного списка, которую я могу использовать.
Мне нужен быстрый список FIFO, а массив не выполняет свою работу.
Просто написал это как замену массива и получил значительное улучшение скорости:
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
Предложения по функциям и улучшениям для Godot Engine сейчас обсуждаются и рассматриваются в специальном Godot Improvement Proposals (GIP) ( godotengine / godot-предложения ). В трекере GIP есть подробный шаблон проблемы, разработанный таким образом, чтобы предложения включали всю необходимую информацию, чтобы начать продуктивное обсуждение и помочь сообществу оценить обоснованность предложения для движка.
Основной трекер ( извлечение , что позволяет участникам лучше сосредоточиться на работе по исправлению ошибок. Поэтому сейчас мы закрываем все старые предложения функций в основной системе отслеживания проблем.
Если вас интересует это предложение функции, пожалуйста, откройте новое предложение в трекере GIP, следуя заданному шаблону проблемы (после проверки того, что его еще нет). Обязательно укажите этот закрытый вопрос, если он включает какое-либо соответствующее обсуждение (которое вам также рекомендуется резюмировать в новом предложении). Заранее спасибо!
Самый полезный комментарий
Все еще воспроизводимый / актуальный в 3.1 master 9e7cee2: такая структура данных еще не раскрыта.