Godot: Expor lista duplamente vinculada ao script

Criado em 26 nov. 2016  ·  3Comentários  ·  Fonte: godotengine/godot

Há uma lista dupla vinculada no código-fonte do Godots ( core / list.h ).
Seria bom se isso fosse exposto, pois há alguns casos em que uma lista duplamente vinculada tem um desempenho muito melhor como um vetor baseado.
Especialmente quando se trata de inserir / remover elementos em qualquer posição, exceto no final.

Eu poderia fazer algum trabalho sobre isso, mas não tenho certeza de como lidar com o bloqueio e registrá-lo (embora eu pudesse tentar espelhar o comportamento da classe Array).
Basicamente expondo a listae lista:: O elemento deve fazer o truque, eu acho.?
Implementá-lo como iterável também deve funcionar de forma semelhante ao Array.

Além disso (e se solicitado, eu poderia abrir outro problema para isso) expor o core / ring_buffer.h como fila também seria bom para as necessidades da fila.
Ela deve funcionar melhor como uma fila usando uma lista duplamente vinculada (e, por definição, melhor como uma lista baseada em vetor), com a limitação de que tem um tamanho "fixo" e aloca potenciais de memória não utilizada ofc.
Mas há casos em que exatamente esse comportamento é necessário.

archived feature proposal core gdscript

Comentários muito úteis

Ainda reproduzível / relevante no 3.1 mestre 9e7cee2: tal estrutura de dados ainda não foi exposta.

Todos 3 comentários

Ainda reproduzível / relevante no 3.1 mestre 9e7cee2: tal estrutura de dados ainda não foi exposta.

Estava prestes a postar no reddit perguntando se há uma implementação de lista vinculada adequada que eu possa usar.

Preciso de uma lista FIFO rápida e o array não está funcionando.

Apenas escrevi isso como uma substituição de array e obteve melhorias significativas de velocidade:

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

As propostas de recursos e melhorias para o Godot Engine estão agora sendo discutidas e analisadas em um rastreador de problemas dedicado às Propostas de Melhoria Godot (GIP) ( godotengine / godot-propostas ). O rastreador GIP tem um modelo de problema detalhado projetado para que as propostas incluam todas as informações relevantes para iniciar uma discussão produtiva e ajudar a comunidade a avaliar a validade da proposta para o mecanismo.

O rastreador principal ( godotengine / godot ) agora é exclusivamente dedicado a relatórios de bugs e solicitações de pull, permitindo que os contribuidores tenham um melhor foco no trabalho de correção de bugs. Portanto, agora estamos fechando todas as propostas de recursos mais antigas no rastreador de problemas principais.

Se você estiver interessado nesta proposta de recurso, abra uma nova proposta no rastreador GIP seguindo o modelo de problema fornecido (depois de verificar se ele ainda não existe). Certifique-se de fazer referência a este problema encerrado se incluir qualquer discussão relevante (que você também é incentivado a resumir na nova proposta). Desde já, obrigado!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

nunodonato picture nunodonato  ·  3Comentários

Zylann picture Zylann  ·  3Comentários

gonzo191 picture gonzo191  ·  3Comentários

Spooner picture Spooner  ·  3Comentários

mefihl picture mefihl  ·  3Comentários