Godot: 二重リンクリストをスクリプトに公開する

作成日 2016年11月26日  ·  3コメント  ·  ソース: godotengine/godot

godotsソースコード( core / list.h )には二重リンクリストがあります。
二重リンクリストがベクトルベースとしてはるかに優れたパフォーマンスを発揮する場合があるので、それが公開されると便利です。
特に、端以外の任意の位置での要素の挿入/削除に関しては。

私はこれについていくつかの作業を行うことができましたが、ロックと登録を処理する方法がわかりません(ただし、Arrayクラスの動作をミラーリングしようとすることはできます)。
基本的にリストを公開するとリスト::要素は私が推測するトリックを行う必要があります。
iterableとして実装することも、Arrayの場合と同様に機能するはずです。

さらに(要求された場合は、これについて別の問題を開くことができます)、core / ring_buffer.hをキューとして公開することも、キューのニーズに適しています。
「固定」サイズであり、未使用のメモリofcを割り当てる可能性があるという制限がありますが、二重リンクリストを使用するキューとしてのパフォーマンスが向上するはずです(ベクトルベースのリストとしては定義が優れています)。
ただし、まさにこの動作が必要な場合があります。

archived feature proposal core gdscript

最も参考になるコメント

3.1マスター9e7cee2でも再現可能/関連性があります:そのようなデータ構造はまだ公開されていません。

全てのコメント3件

3.1マスター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-proposals )課題追跡

メイン( godotengine / godot )トラッカーはバグレポートとプルリクエスト専用になり、寄稿者はバグ修正作業により集中できるようになりました。 そのため、メインの課題トラッカーで古い機能の提案をすべて終了します。

この機能の提案に興味がある場合は、指定された問題テンプレートに従って、 GIPトラッカーで新しい提案

このページは役に立ちましたか?
0 / 5 - 0 評価