1 คะแนน โดย GN⁺ 2024-02-26 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

การเขียนโค้ดหน้าจอแอนิเมชัน "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 ทำงานร่วมกันเพื่อให้เอฟเฟกต์นี้เกิดขึ้นได้:
    1. คอโปรเซสเซอร์ (copper) ทำงานขนานกับ CPU และสามารถสั่งให้เปลี่ยนฮาร์ดแวร์รีจิสเตอร์ที่บรรทัดใดบรรทัดหนึ่งของหน้าจอได้
    2. หน่วยความจำหน้าจอสามารถสลับไปยังตำแหน่งใดก็ได้ใน 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 ความคิดเห็น

 
GN⁺ 2024-02-26
ความคิดเห็นบน Hacker News
  • สรุปความคิดเห็นเกี่ยวกับ "Racing the beam":

    • ผู้ใช้คนหนึ่งเล่าว่าตนรู้จักเทคนิค 'beam racing' เป็นอย่างดี และจำได้ว่าเคยใช้เทคนิคนี้คำนวณเวลา CPU ต่อหนึ่งเฟรม
    • เขาใช้แอดเดรส $dff180 เพื่อตั้งค่าสีที่ขอบหน้าจอ และบอกว่าเรียนรู้เทคนิคนี้จากการบอกต่อกัน ไม่ใช่จากอินเทอร์เน็ต
    • เขาสงสัยว่าปัจจุบันยังมีคนที่พยายามรีดประสิทธิภาพจากชิปเซ็ตนี้ให้ได้มากที่สุดอยู่หรือไม่ และตั้งคำถามถึงโปรไฟล์ของคนที่พัฒนาเกมให้กับคอมพิวเตอร์ Amiga
    • เขาขอบคุณที่มีการแบ่งปันเรื่องราวเกี่ยวกับ Amiga
  • สรุปความคิดเห็นเกี่ยวกับโครงสร้างหน่วยความจำของ Amiga 500:

    • ผู้ใช้คนหนึ่งชี้ว่า Amiga 500 มี chip RAM 512kB มาเป็นมาตรฐาน และผู้ใช้จำนวนมากก็ขยาย fast RAM เพิ่มอีก 512kB
    • เขาอธิบายว่า RAM ที่ขยายเพิ่มนี้ไม่สามารถให้ฮาร์ดแวร์กราฟิกเข้าถึงได้โดยตรง และมีความเร็วช้ากว่า fast RAM จริง
  • สรุปความคิดเห็นเกี่ยวกับศักยภาพของเกมคอนโซลสไตล์ญี่ปุ่นบน Amiga:

    • ผู้ใช้คนหนึ่งสงสัยว่าเกมคอนโซลสไตล์ญี่ปุ่นบน Amiga จะมีหน้าตาออกมาเป็นอย่างไร และตั้งคำถามว่า Amiga ขาดประสิทธิภาพจริงหรือไม่ หรือเป็นเพียงเพราะไม่ชอบดีไซน์ของเกมส่วนใหญ่
    • เขายกตัวอย่างเกม Bonk เวอร์ชันพอร์ตโดย Factor 5 และชื่นชมว่าพวกเขาเป็นนักพัฒนาระดับพ่อมด
  • สรุปความคิดเห็นเกี่ยวกับเสน่ห์ของการเขียนโค้ดภายใต้ข้อจำกัด:

    • ผู้ใช้คนหนึ่งบอกว่าการเขียนโค้ดภายใต้ข้อจำกัดนั้นมีเสน่ห์อย่างมาก
  • สรุปความคิดเห็นเกี่ยวกับประสบการณ์ส่วนตัวกับ Amiga และการแบ่งปันวิธีสร้างแอนิเมชัน:

    • ผู้ใช้คนหนึ่งบอกว่า Amiga ที่ตนเคยใช้ให้ความรู้สึกต่างจากที่คนอื่นเล่ากัน และเมื่อเทียบกับ Nintendo NES ก็ไม่ได้รู้สึกโหยหาอดีตมากนัก
    • ถึงอย่างนั้น เขาก็ยอมรับว่าการได้เห็นวิธีสร้างแอนิเมชันเหล่านี้เป็นเรื่องที่เจ๋งมาก