Godot: Предоставить скрипту двусвязный список

Созданный на 26 нояб. 2016  ·  3Комментарии  ·  Источник: godotengine/godot

В исходном коде Godots есть список с двумя ссылками ( core / list.h ).
Было бы неплохо, если бы это было раскрыто, поскольку в некоторых случаях двойной связанный список работает лучше как векторный.
Особенно, когда речь идет о вставке / удалении элементов в любом месте, кроме конца.

Я мог бы поработать над этим, но не уверен, как обрабатывать блокировку и регистрацию (хотя я мог бы попытаться отразить поведение класса Array).
В основном выставляем списоки список:: Элемент должен сделать свое дело, я думаю.?
Реализация его как итерируемого должна также работать аналогично тому, как это делает Array.

Кроме того (и если бы я попросил, я мог бы открыть еще одну проблему для этого), выставление core / ring_buffer.h в качестве очереди также было бы полезно для нужд очереди.
Он должен работать лучше как очередь с использованием двусвязного списка (и, по определению, лучше как список на основе векторов) с ограничением, заключающимся в том, что он имеет «фиксированный» размер и потенциально выделяет неиспользуемую память c.
Но есть случаи, когда нужно именно такое поведение.

archived feature proposal core gdscript

Самый полезный комментарий

Все еще воспроизводимый / актуальный в 3.1 master 9e7cee2: такая структура данных еще не раскрыта.

Все 3 Комментарий

Все еще воспроизводимый / актуальный в 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, следуя заданному шаблону проблемы (после проверки того, что его еще нет). Обязательно укажите этот закрытый вопрос, если он включает какое-либо соответствующее обсуждение (которое вам также рекомендуется резюмировать в новом предложении). Заранее спасибо!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги