Godot: 将双链表暴露给脚本

创建于 2016-11-26  ·  3评论  ·  资料来源: godotengine/godot

Godots 源代码中有一个双链表( core/list.h )。
如果这能被公开,那就太好了,因为在某些情况下,双链表作为基于向量的表现更好。
特别是在除末尾之外的任何位置插入/删除元素时。

我可以在这方面做一些工作,但不确定如何处理锁定和注册它(尽管我可以尝试反映 Array 类的行为)。
基本上公开名单并列出我猜 ::Element 应该可以解决问题。?
将它实现为可迭代的也应该类似于 Array 的工作方式。

此外(如果有要求,我可以为此打开另一个问题)将 core/ring_buffer.h 公开为队列也很适合队列需求。
它应该作为使用双链表的队列(并且作为基于向量的列表更好)表现得更好,其限制是它具有“固定”大小并且可能分配未使用的内存 ofc。
但在某些情况下,正是需要这种行为。

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 引擎的功能和改进建议现在正在专门的Godot 改进建议 (GIP) ( godotengine/godot-proposals ) 问题跟踪器中进行讨论和审查。 GIP 跟踪器有一个详细的问题模板,旨在使提案包含所有相关信息,以开始富有成效的讨论并帮助社区评估引擎提案的有效性。

主要( godotengine/godot )跟踪器现在专门用于错误报告和拉取请求,使贡献者能够更好地专注于错误修复工作。 因此,我们现在正在关闭主问题跟踪器上的所有旧功能提案。

如果您对此功能提案感兴趣,请按照给定的问题模板在 GIP 跟踪器上打开一个新提案(在检查它不存在之后)。 如果包含任何相关讨论(也鼓励您在新提案中进行总结),请务必引用此已关闭问题。 提前致谢!

此页面是否有帮助?
0 / 5 - 0 等级