Godot: Exponer la lista de enlaces dobles a la secuencia de comandos

Creado en 26 nov. 2016  ·  3Comentarios  ·  Fuente: godotengine/godot

Hay una lista de enlaces dobles en el código fuente de godots ( core / list.h ).
Sería bueno si eso fuera expuesto, ya que hay algunos casos en los que una lista de doble enlace funciona mucho mejor como basada en vectores.
Especialmente cuando se trata de insertar / quitar elementos en cualquier posición excepto en el extremo.

Podría trabajar un poco en esto, pero no estoy seguro de cómo manejar el bloqueo y el registro (aunque podría intentar reflejar el comportamiento de la clase Array).
Básicamente exponiendo la listay lista:: El elemento debería hacer el truco, supongo.
Implementarlo como iterable también debería funcionar de manera similar a cómo lo hace Array.

Además (y si se solicita, podría abrir otro problema para esto) exponer el núcleo / ring_buffer.h como cola también sería bueno para las necesidades de la cola.
Debería funcionar mejor como una cola usando una lista de doble enlace (y def. Mejor como una lista basada en vectores) con la limitación de que tiene un tamaño "fijo" y que el potencial asigna memoria no utilizada de c.
Pero hay casos en los que se necesita exactamente este comportamiento.

archived feature proposal core gdscript

Comentario más útil

Aún reproducible / relevante en 3.1 master 9e7cee2: dicha estructura de datos aún no está expuesta.

Todos 3 comentarios

Aún reproducible / relevante en 3.1 master 9e7cee2: dicha estructura de datos aún no está expuesta.

Estaba a punto de publicar en reddit preguntando si hay una implementación de lista vinculada adecuada que pueda usar.

Necesito una lista FIFO rápida y la matriz no está haciendo el trabajo.

Acabo de escribir esto como un reemplazo de la matriz y obtuve mejoras de velocidad significativas:

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

Las propuestas de funciones y mejoras para Godot Engine ahora se están discutiendo y revisando en un rastreador de problemas de Godot Improvement Proposals (GIP) ( godotengine / godot-proposits ). El rastreador GIP tiene una plantilla detallada de problemas diseñada para que las propuestas incluyan toda la información relevante para iniciar una discusión productiva y ayudar a la comunidad a evaluar la validez de la propuesta para el motor.

El rastreador principal ( extracción , lo que permite a los colaboradores tener un mejor enfoque en el trabajo de corrección de errores. Por lo tanto, ahora cerramos todas las propuestas de funciones más antiguas en el rastreador de problemas principal.

Si está interesado en esta propuesta de función, abra una nueva propuesta en el rastreador de GIP siguiendo la plantilla de problema dada (después de verificar que aún no existe). Asegúrese de hacer referencia a este tema cerrado si incluye alguna discusión relevante (que también se le anima a resumir en la nueva propuesta). ¡Gracias por adelantado!

¿Fue útil esta página
0 / 5 - 0 calificaciones