การเขียนโค้ดหน้าจอแอนิเมชัน "woosh" บน Amiga
(dansalva.to)การเขียนโค้ดหน้าจอแอนิเมชัน "woosh" บน Amiga
- Amiga สร้างความน่าทึ่งด้านกราฟิกและเสียงอย่างมากในช่วงที่เปิดตัวในปี 1985
- การแสดงภาพสีสันหลากหลายบน Amiga ทำได้ไม่ยาก แต่ในบริบทของเอนจินเกมกลับมีความท้าทายอยู่มาก
ความท้าทาย 1: ความต้องการ RAM
- Amiga 500 ทั่วไปมี "chip RAM" 512KB และ RAM ส่วนขยายอีก 512KB
- มีเพียง chip RAM เท่านั้นที่ใช้แสดงกราฟิกและเสียงได้ จึงมีค่ามากกว่า
- กราฟิกตัวละครแบบเต็มหน้าจอ (CG) ใช้บิตแมป 320x240 พร้อม 32 สี และกิน RAM 48KB เมื่อไม่บีบอัด
- เพื่อรองรับการบีบอัดแอสเซ็ต จึงเพิ่มฟอร์แมตบีบอัด ZX0 และเมื่อบีบอัด CG แล้วขนาดลดลงเหลือ 8KB ซึ่งยอมรับได้
- ตอนโหลดแอสเซ็ตของเลเวล CG ที่บีบอัดไว้จะถูกโหลดเข้า RAM ส่วนขยาย แล้วจึงแตกไฟล์ไปยัง chip RAM ทันทีก่อนแสดงผล
- แทนที่จะต้องหา chip RAM ว่าง 48KB ก็ใช้พื้นที่ส่วนอื่นของหน่วยความจำหน้าจอซ้ำแทน
ความท้าทาย 2: เอฟเฟกต์ "แบ่งหน้าจอ"
- ตอนแรกมีการพิจารณาใช้ vertical wipe สำหรับเปลี่ยนฉาก
- แต่ถ้าจะทำให้ดูดี จำเป็นต้องใช้ gradient wipe ที่ปรับจานสีในทุกสแกนไลน์
- เอฟเฟกต์แบ่งหน้าจอทำได้ง่ายกว่า และสำหรับผู้ชมทั่วไปก็ดูเท่กว่าด้วย
- ฟีเจอร์พิเศษสองอย่างของ Amiga ทำงานร่วมกันเพื่อให้เอฟเฟกต์นี้เกิดขึ้นได้:
- คอโปรเซสเซอร์ (copper) ทำงานขนานกับ CPU และสามารถสั่งให้เปลี่ยนฮาร์ดแวร์รีจิสเตอร์ที่บรรทัดใดบรรทัดหนึ่งของหน้าจอได้
- หน่วยความจำหน้าจอสามารถสลับไปยังตำแหน่งใดก็ได้ใน chip RAM โดยตั้งค่าตัวชี้หน้าจอในฮาร์ดแวร์รีจิสเตอร์
ความท้าทาย 3: "เส้นโมชั่น"
- เพื่อให้เอฟเฟกต์แอนิเมชันสมบูรณ์ จึงต้องมีเส้นที่พุ่ง "woosh" อยู่ด้านหลัง
- การใช้สไปรต์ในการวาดเส้นเป็นทางเลือกที่ดี เพราะสามารถวาดและขยับได้โดยไม่ขึ้นกับหน่วยความจำหน้าจอ
- สไปรต์ของ Amiga มีข้อจำกัดมากและค่อนข้างซับซ้อน
สีของสไปรต์
- สไปรต์ใช้ bitplane และจานสีร่วมกัน จึงต้องการใช้สีให้น้อยที่สุดเท่าที่เป็นไปได้
- สไปรต์ใช้เพียง 3 สี ทำให้เหลือ 28 สีสำหรับ CG และ 1 สีสำหรับพื้นหลัง
- สไปรต์แต่ละตัวใช้สีคนละชุดจากในจานสี
การใช้กราฟิกสไปรต์ซ้ำ
- 4 ไบต์แรกของกราฟิกสไปรต์คือ "control bits" ที่ใช้บอกตำแหน่งและความสูงของสไปรต์
- เมื่อต้องการวาดกราฟิกเดิมในหลายตำแหน่ง สิ่งนี้จึงกลายเป็นปัญหา
- ทางแก้คือสร้างสไปรต์ปลอม 8 ตัวที่มีแค่ control bits แล้วตั้งตัวชี้สไปรต์ให้ชี้ไปยังสไปรต์ปลอมเหล่านี้
สไปรต์จะไม่ถูกวาดเมื่อ bitplane ถูกปิด
- ก่อนที่ CG จะมาถึงด้านบนของหน้าจอ จะมีพื้นที่ว่างจำนวนมากระหว่างด้านบนของหน้าจอกับจุดเริ่มของ CG
- หากเปิด bitplane ไว้ในช่วงเวลานี้ ข้อมูลขยะจะถูกวาดขึ้นบนหน้าจอ
- แต่ถ้าปิด bitplane สไปรต์ก็จะไม่ถูกวาดเช่นกัน
- วิธีแก้คือเปิด bitplane ไว้เพียง 1 แผ่น และตั้งตัวชี้หน้าจอให้ชี้ไปยังข้อมูลว่าง
บทสรุป
- ในตอนแรกยังไม่แน่ใจว่าจะใส่ CG ลงในเกมได้หรือไม่ เพราะข้อจำกัดด้าน RAM
- การบีบอัดข้อมูลที่นำมาใช้พิสูจน์แล้วว่ามีโอเวอร์เฮดที่สมเหตุสมผลมาก
- การอาศัยคุณลักษณะเฉพาะของฮาร์ดแวร์ Amiga เป็นสิ่งที่น่าสนใจเป็นพิเศษ
GN⁺ คิดว่า:
- บทความนี้แสดงให้เห็นความสามารถด้านการประมวลผลกราฟิกของคอมพิวเตอร์ Amiga และเทคนิคการปรับหน่วยความจำให้เหมาะสมระหว่างการพัฒนาเกมได้เป็นอย่างดี
- อธิบายวิธีสร้างเอฟเฟกต์ที่น่าประทับใจภายใต้ทรัพยากรอันจำกัด ด้วยการใช้ทั้งการบีบอัดข้อมูลและฟังก์ชันพิเศษของฮาร์ดแวร์
- การทำความเข้าใจและใช้ประโยชน์จากฮาร์ดแวร์ของคอมพิวเตอร์คลาสสิกอย่าง Amiga เป็นหัวข้อที่น่าสนใจมากสำหรับนักพัฒนาเกมย้อนยุคหรือผู้ที่สนใจประวัติศาสตร์คอมพิวเตอร์
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
สรุปความคิดเห็นเกี่ยวกับ "Racing the beam":
สรุปความคิดเห็นเกี่ยวกับโครงสร้างหน่วยความจำของ Amiga 500:
สรุปความคิดเห็นเกี่ยวกับศักยภาพของเกมคอนโซลสไตล์ญี่ปุ่นบน Amiga:
สรุปความคิดเห็นเกี่ยวกับเสน่ห์ของการเขียนโค้ดภายใต้ข้อจำกัด:
สรุปความคิดเห็นเกี่ยวกับประสบการณ์ส่วนตัวกับ Amiga และการแบ่งปันวิธีสร้างแอนิเมชัน: