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 daftar
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.
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!
Komentar yang paling membantu
Masih dapat direproduksi/relevan di 3.1 master 9e7cee2 : struktur data seperti itu belum terungkap.