โครงสร้างข้อมูลในเกมที่เก่ากว่า


10

ฉันอยากรู้เกี่ยวกับโครงสร้างข้อมูลที่ใช้ในการเขียนโปรแกรมเกมที่เก่ากว่าเช่น Super Mario Brothers สำหรับ NES และ Super Mario World สำหรับ SNES ความเข้าใจของฉันคือเกมของช่วงเวลานี้ถูกเขียนขึ้นในการชุมนุม โปรแกรมเมอร์กำหนดหรือใช้โครงสร้างข้อมูลใด ๆ หรือไม่?

ตัวอย่างเช่น: เมื่อกลุ่มของเหรียญปรากฏบนหน้าจอวิธีที่พวกเขาเก็บไว้ได้อย่างไร โปรแกรมเมอร์ไม่ได้ใช้อาร์เรย์หรือไม่ หรือบางทีพวกเขามีรายการเชื่อมโยง?

ไชโย!

แก้ไข : ฉันสนใจวิธีการต่าง ๆ ... ไม่จำเป็นต้องเป็นแนวทางสากล

แก้ไข 2 : ในบางเกมของฉันฉันใช้วิธี (อาจไม่ดี) ต่อคอลเล็กชันและฉันต้องการทราบว่าเกมเก่า ๆ เกมใดใช้แนวทางที่คล้ายกันหรือไม่ ฉันชอบที่จะทำต่อไปนี้:

// statically allocated arrays (max number of coins is 4)
int coinsXs[4] = {0, 0, 0, 0};
int coinsYs[4] = {0, 0, 0, 0};

// bitset that keeps track of which coins are active
int coinsActive = 0;

// ...

// update the active coins in an update function
for(int i = 0; i < 4; i++){
    if(coinsActive & (1 << i)){
        // update ith coin
    }
 }

2
ไม่มีคำตอบสากล; มันลงมาถึงวิธีการที่โปรแกรมเมอร์ที่กำหนดใช้การแก้ปัญหาสำหรับปัญหาที่กำหนด
Ed S.

1
ในขณะที่ฉันไม่คิดว่าเกมเหล่านั้นทั้งหมดถูกเขียนขึ้นในชุดประกอบฉันจะบอกว่ามันค่อนข้างธรรมดาสำหรับโปรแกรมเมอร์ผู้ประกอบการในการรวบรวมส่วนประกอบเล็ก ๆ ของพวกเขาสำหรับการคัดลอก / วางกลับมาใช้ใหม่จากโปรแกรมหนึ่งไปอีกโปรแกรมหนึ่ง คุณต้องการเขียนฟังก์ชัน printf () กี่ครั้งหลังจากนั้น? :)
James

จุดดี. ฉันอยากรู้จริงๆเกี่ยวกับคอลเลกชันที่จัดสรรแบบไดนามิกเทียบกับคอลเลกชันที่ได้รับการจัดสรรแบบคงที่
MrDatabase

1
คุณมีปัญหาเฉพาะอะไร ทำไมคุณถึงสนใจเกมเก่า ๆ
Tetrad

2
สิ่งที่คุณได้รับจากการแก้ไขครั้งที่สองคือตัวอย่างของเลย์เอาต์ "โครงสร้างของอาร์เรย์" ซึ่งยังคงพบได้ทั่วไปแม้ในเกมสมัยใหม่เนื่องจากมีประโยชน์สำหรับการทำงานแบบขนานและ SIMD Sony ได้นำเสนอสองสามปีที่ผ่านมาเกี่ยวกับวิธีการจัดโครงสร้างข้อมูล C ++ แบบดั้งเดิมสามารถมีต้นทุนที่ซ่อนเร้นร้ายแรง: research.scee.net/files/presentations/gcapaustralia09/
Crashworks

คำตอบ:


13

แม้แต่ในวันที่ 16 บิตเกมคอนโซลนั้นมีขนาดเล็กคอมพิวเตอร์ฝังตัวที่ใช้ซอฟต์แวร์แบบเรียลไทม์และโครงสร้างข้อมูลที่เราใช้นั้นเป็นแบบเดียวกับที่คุณพบได้ทุกที่ในสาขาวิทยาการคอมพิวเตอร์: อาร์เรย์เมทริกซ์ฮีปต้นไม้ มีรายการที่เชื่อมโยงไม่มากเพราะมันช้า (การค้นหาโดยอ้อมมีเวลาแฝงนาน)

ความแตกต่างคือก่อนหน้า STL และด้วยประสิทธิภาพที่สำคัญมากเรามักจะต้องเขียนโครงสร้างและอัลกอริธึมเอง!

เดวิด Braben ได้บรรยายความสนุกที่ GDC 2011 ที่เขาพูดคุยเกี่ยวกับทุกเทคนิคบ้าเขาใช้เพื่อให้พอดีกับยอดบนบีบีซีไมโครในปี 1984 คุณสามารถรับชมได้ฟรีที่ GDC ห้องนิรภัย


เย็น. คุณใช้อาร์เรย์ที่จัดสรรแบบไดนามิกหรือไม่ หรือว่าส่วนใหญ่มีขนาดคงที่? ฉันอยากรู้เกี่ยวกับสถานการณ์ที่พูดห้าเหรียญจะปรากฏบนหน้าจอและยังคงอยู่บนหน้าจอจนกว่าผู้เล่นจะรวบรวมพวกเขา (หรือพวกเขาเลื่อนออกนอกหน้าจอ)
MrDatabase

2
@MrDatabase - การจัดสรรแบบคงที่ทุกที่ที่เป็นไปได้ สำหรับกรณีอย่างที่คุณอธิบายเรามักจะมีอาร์เรย์ที่จัดสรรแบบคงที่เช่นเหรียญ 32 เหรียญที่เป็นไปได้ที่อาจมีอยู่ เมื่อเหรียญเข้ามาในโลกเราจะเติมจุดในอาร์เรย์ เมื่อพวกเขาจากไปเราจะทำให้มันว่างเปล่า การจัดสรรแบบไดนามิกไม่สามารถใช้งานได้เราเพียงหลีกเลี่ยงการใช้เพราะเมื่อคุณมี RAM เพียง 2MB คุณต้องรับประกันว่าโปรแกรมของคุณจะทำงานในหน่วยความจำคงที่!
Crashworks

เย็น. ฉันทำสิ่งที่คล้ายกัน (ดูแก้ไข # 2 สำหรับคำถาม) ในฟังก์ชั่นการอัพเดทของฉันฉันตรวจสอบบิตเซ็ต "coinsActive" if(coinsActive)ก่อนที่จะวนลูปมากกว่า maxNumCoins และอัปเดต วิธีนี้ฉันจะหลีกเลี่ยงการวนซ้ำอย่างสมบูรณ์ถ้าศูนย์มีการใช้งาน
MrDatabase

+1 เนื่องจากลิงก์ GDC Vault คำปราศรัย Popolous Popolous โดย Peter Molyneux ต้องเป็นการพูดคุยเฮฮาที่สุดที่ฉันเคยเห็น
TravisG

MeDataBase - คุณคัดลอกวัตถุที่ใช้งานล่าสุดไปยังช่องที่ถูกครอบครองโดยเหรียญที่ไม่ได้ใช้งาน (เช่นถ้าคุณมี 10 เหรียญเหรียญ 5 กลายเป็นไม่ใช้งานคัดลอกเหรียญ 10 ไปยังช่อง 5 และลดเหรียญที่ไม่ใช้) เพื่อ numCoins และอัปเดตองค์ประกอบเหล่านั้นทั้งหมด คุณไม่ต้องการ 'ถ้า' แน่นอนว่าจะใช้งานได้เฉพาะในกรณีที่เหรียญที่ไม่ใช้งานไม่จำเป็นต้องรักษาสถานะไว้และหากลำดับการอัพเดทไม่สำคัญ (รัฐสามารถรักษาได้หากอาร์เรย์เก็บตัวชี้เป็นเหรียญและไม่ใช่เหรียญจริง แต่จากนั้นคุณจะได้รับพฤติกรรมแคชกระจัดกระจาย น่าจะแย่กว่า 'if')
Kaj

5

นี่คือการสนทนาที่น่าสนใจเกี่ยวกับ GameDev.net สำหรับรหัส Super Mario Bros: รหัสต้นฉบับSuper Mario

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.