Godot: Buka daftar tertaut ganda ke skrip

Dibuat pada 26 Nov 2016  ·  3Komentar  ·  Sumber: godotengine/godot

Ada daftar tertaut ganda dalam kode sumber godots ( core/list.h ).
Akan lebih baik jika itu akan diekspos karena ada beberapa kasus di mana daftar tertaut ganda berkinerja jauh lebih baik sebagai berbasis vektor.
Terutama ketika harus memasukkan/menghapus elemen pada posisi apa pun kecuali ujungnya.

Saya dapat melakukan beberapa pekerjaan dalam hal ini, tetapi saya tidak yakin bagaimana menangani penguncian dan mendaftarkannya (Meskipun saya dapat mencoba untuk mencerminkan perilaku kelas Array).
Pada dasarnya mengekspos daftardan daftar:: Elemen harus melakukan trik saya kira.?
Menerapkannya sebagai iterable juga harus bekerja mirip dengan bagaimana Array melakukannya.

Selain itu (dan jika diminta saya bisa membuka masalah lain untuk ini) mengekspos inti/ring_buffer.h sebagai antrian juga akan bagus untuk kebutuhan antrian.
Itu harus berkinerja lebih baik sebagai antrian menggunakan daftar tertaut ganda (dan def. lebih baik sebagai daftar berbasis vektor) dengan batasan bahwa ia memiliki ukuran "tetap" dan potensi mengalokasikan memori yang tidak terpakai ofc.
Tetapi ada kasus di mana perilaku ini diperlukan.

archived feature proposal core gdscript

Komentar yang paling membantu

Masih dapat direproduksi/relevan di 3.1 master 9e7cee2 : struktur data seperti itu belum terungkap.

Semua 3 komentar

Masih dapat direproduksi/relevan di 3.1 master 9e7cee2 : struktur data seperti itu belum terungkap.

Akan memposting di reddit menanyakan apakah ada implementasi daftar tertaut yang tepat yang dapat saya gunakan.

Saya memerlukan daftar FIFO yang cepat, dan array tidak berfungsi.

Baru saja menulis ini sebagai pengganti array, dan mendapat peningkatan kecepatan yang signifikan:

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

Proposal fitur dan peningkatan untuk Godot Engine sekarang sedang dibahas dan ditinjau dalam pelacak masalah Godot Improvement Proposals (GIP) ( godotengine/godot-proposals ) khusus. Pelacak GIP memiliki templat masalah terperinci yang dirancang agar proposal mencakup semua informasi yang relevan untuk memulai diskusi yang produktif dan membantu komunitas menilai validitas proposal untuk mesin tersebut.

Pelacak utama (

Jika Anda tertarik dengan proposal fitur ini, silakan buka proposal baru di pelacak GIP dengan mengikuti template masalah yang diberikan (setelah memeriksa bahwa itu belum ada). Pastikan untuk merujuk masalah tertutup ini jika mencakup diskusi yang relevan (yang juga disarankan untuk Anda rangkum dalam proposal baru). Terima kasih sebelumnya!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat