Godot: كشف قائمة مزدوجة مرتبطة بالنص

تم إنشاؤها على ٢٦ نوفمبر ٢٠١٦  ·  3تعليقات  ·  مصدر: godotengine/godot

توجد قائمة مرتبطة مزدوجة في كود مصدر godots ( core / list.h ).
سيكون من الجيد أن يتم الكشف عن ذلك لأن هناك بعض الحالات التي تؤدي فيها القائمة المرتبطة المزدوجة أداءً أفضل كمتجه.
خاصة عندما يتعلق الأمر بإدخال / إزالة العناصر في أي موضع باستثناء النهاية.

يمكنني القيام ببعض الأعمال في هذا الصدد ، لكنني لست متأكدًا من كيفية التعامل مع قفله وتسجيله (على الرغم من أنني قد أحاول عكس سلوك فئة Array).
فضح القائمة أساساوالقائمة:: يجب أن يقوم العنصر بالخدعة على ما أعتقد.؟
يجب أن يعمل تطبيقه على أنه قابل للتكرار أيضًا بشكل مشابه لكيفية قيام 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- مقترحات ). يحتوي متتبع GIP على نموذج مشكلة مفصل مصمم بحيث تتضمن المقترحات جميع المعلومات ذات الصلة لبدء مناقشة مثمرة ومساعدة المجتمع على تقييم صحة الاقتراح الخاص بالمحرك.

المتتبع الرئيسي (

إذا كنت مهتمًا بمقترح الميزة هذا ، فيرجى فتح اقتراح جديد على متتبع GIP باتباع نموذج المشكلة المحدد (بعد التحقق من عدم وجوده بالفعل). تأكد من الإشارة إلى هذه المشكلة المغلقة إذا كانت تتضمن أي مناقشة ذات صلة (والتي نشجعك أيضًا على تلخيصها في الاقتراح الجديد). شكرا لك مقدما!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات