Godots 源代码中有一个双链表( core/list.h )。
如果这能被公开,那就太好了,因为在某些情况下,双链表作为基于向量的表现更好。
特别是在除末尾之外的任何位置插入/删除元素时。
我可以在这方面做一些工作,但不确定如何处理锁定和注册它(尽管我可以尝试反映 Array 类的行为)。
基本上公开名单
将它实现为可迭代的也应该类似于 Array 的工作方式。
此外(如果有要求,我可以为此打开另一个问题)将 core/ring_buffer.h 公开为队列也很适合队列需求。
它应该作为使用双链表的队列(并且作为基于向量的列表更好)表现得更好,其限制是它具有“固定”大小并且可能分配未使用的内存 ofc。
但在某些情况下,正是需要这种行为。
在 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 跟踪器上打开一个新提案(在检查它不存在之后)。 如果包含任何相关讨论(也鼓励您在新提案中进行总结),请务必引用此已关闭问题。 提前致谢!
最有用的评论
在 3.1 master 9e7cee2 中仍然可重现/相关:此类数据结构尚未公开。