สมมติว่าสไปรต์ของคุณครอบครองชุดไพ่ที่เป็นรูปสี่เหลี่ยมผืนผ้า (ถ้าพวกเขาครอบครองชุดโดยพลการแล้วคุณไม่สามารถวาดได้อย่างถูกต้องในกรณีทั่วไป) ปัญหาคือว่าไม่มีความสัมพันธ์ลำดับรวมระหว่างองค์ประกอบดังนั้นคุณจึงไม่สามารถเรียงลำดับได้ พวกเขาใช้การเรียงลำดับที่จะส่งผลในการเปรียบเทียบ O (nlogn)
โปรดทราบว่าสำหรับวัตถุ A และ B ใด ๆ ทั้ง A ควรวาดก่อน B (A <- B), B ควรวาดก่อน A (B <- A) หรือสามารถวาดในลำดับใดก็ได้ พวกเขาเรียงลำดับบางส่วน หากคุณวาดตัวอย่างสองสามตัวอย่างด้วยวัตถุที่ทับซ้อนกัน 3 คุณอาจสังเกตเห็นว่าแม้ว่าวัตถุที่ 1 และ 3 อาจไม่ทับซ้อนกันดังนั้นจึงไม่มีการพึ่งพาโดยตรงลำดับการวาดขึ้นอยู่กับวัตถุที่ 2 ที่อยู่ระหว่างพวกเขา คุณวางไว้คุณจะได้รับคำสั่งวาดต่างกัน Bottomline - การเรียงลำดับแบบดั้งเดิมไม่ทำงานที่นี่
ทางออกหนึ่งคือการใช้การเปรียบเทียบ (กล่าวถึงโดย Dani) และเปรียบเทียบแต่ละวัตถุกับวัตถุอื่น ๆ เพื่อกำหนดการอ้างอิงของพวกเขาและสร้างกราฟการพึ่งพา (ซึ่งจะเป็น DAG) จากนั้นจัดเรียงทอพอโลยีบนกราฟเพื่อกำหนดลำดับการวาด หากมีวัตถุไม่มากเกินไปสิ่งนี้อาจเร็วพอ (มันO(n^2)
)
อีกวิธีหนึ่งคือการใช้ต้นไม้รูปสี่เหลี่ยม(สำหรับสมดุล - หลอก ) และเก็บสี่เหลี่ยมของวัตถุทั้งหมดไว้ในนั้น
จากนั้นวนซ้ำวัตถุทั้งหมด X และใช้ต้นไม้รูปสี่เหลี่ยมเพื่อตรวจสอบว่ามีวัตถุใด ๆ Y ในแถบด้านบนวัตถุ X ซึ่งเริ่มต้นด้วยซ้ายสุดและสิ้นสุดด้วยมุมขวาสุดของวัตถุ X - สำหรับ Y, Y <ทั้งหมด - X. เช่นนี้คุณจะต้องสร้างกราฟและจัดเรียงทอพอโลยี
แต่คุณสามารถหลีกเลี่ยงได้ คุณใช้รายการของวัตถุ Q และตารางของวัตถุ T คุณวนซ้ำช่องที่มองเห็นได้ทั้งหมดจากค่าที่น้อยลงไปจนถึงค่าที่ใหญ่กว่าบนแกน x (หนึ่งแถว) ไปทีละแถวบนแกน y หากมีมุมด้านล่างของวัตถุที่ช่องนั้นให้ทำตามขั้นตอนด้านบนเพื่อพิจารณาการขึ้นต่อกัน หากวัตถุ X ขึ้นอยู่กับวัตถุอื่น ๆ Y ที่อยู่เหนือส่วนหนึ่ง (Y <- X) และ Y ดังกล่าวทั้งหมดอยู่ใน Q แล้วให้เพิ่ม X เป็น Q หากมีบาง Y ที่ไม่ได้อยู่ใน Q เพิ่ม X ไป T และแสดงว่า Y <- X ทุกครั้งที่คุณเพิ่มวัตถุใน Q คุณจะลบการอ้างอิงของวัตถุที่ค้างอยู่ใน T หากการอ้างอิงทั้งหมดถูกลบออกวัตถุจาก T จะถูกย้ายไปยัง Q
เรากำลังสมมติว่าวัตถุสไปรต์ไม่ได้มองออกจากช่องด้านล่างซ้ายหรือขวา (เฉพาะที่ด้านบนเช่นต้นไม้ในภาพของคุณ) สิ่งนี้ควรปรับปรุงประสิทธิภาพสำหรับวัตถุจำนวนมาก วิธีการนี้จะเป็นอีกครั้งO(n^2)
แต่ในกรณีที่เลวร้ายที่สุดซึ่งรวมถึงวัตถุขนาดแปลกและ / หรือการกำหนดค่าแปลก ๆ ของวัตถุ O(n * logn * sqrt(n))
ในกรณีส่วนใหญ่มันเป็น การทราบความสูงของสไปรท์สามารถกำจัดได้sqrt(n)
เพราะคุณไม่ต้องตรวจสอบแถบทั้งหมดด้านบน ขึ้นอยู่กับจำนวนวัตถุบนหน้าจอคุณอาจลองแทนที่ต้นไม้รูปสี่เหลี่ยมด้วยอาร์เรย์ที่ระบุว่าจะใช้สล็อตใด (ดูสมเหตุสมผลถ้ามีวัตถุจำนวนมาก)
ในที่สุดอย่าลังเลที่จะตรวจสอบซอร์สโค้ดนี้สำหรับแนวคิดบางอย่าง: https://github.com/axel22/sages/blob/master/src/gui/scala/name/brijest/sages/gui/Canvas.scala