9 คะแนน โดย GN⁺ 2025-11-22 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • AthenaEnv คือสภาพแวดล้อมโอเพนซอร์สที่ทำให้ สามารถรันโค้ด JavaScript บน PlayStation 2 ได้
  • สภาพแวดล้อมนี้ ฝังเอนจิน QuickJS เพื่อแปลความ JavaScript และมี API สำหรับพัฒนาเกม เช่น การเรนเดอร์ การรับอินพุต เสียง และการจัดการไฟล์
  • นักพัฒนาสามารถเขียนเกมได้ด้วยโครงสร้างไฟล์พื้นฐานอย่าง main.js, athena.ini, athena.elf และสามารถรันบน อีมูเลเตอร์ PCSX2 ได้
  • โปรเจ็กต์ที่เสร็จแล้วสามารถ แพ็กเป็นไฟล์ .iso เพื่อแจกจ่ายในรูปแบบไฟล์เดียวได้ โดยมีการอธิบายขั้นตอนแปลง zip → iso ไว้
  • เป็นตัวอย่างที่แสดงให้เห็นถึง การผสานการพัฒนาสำหรับเครื่องเกมย้อนยุคเข้ากับเทคโนโลยีเว็บ และชี้ให้เห็นถึงศักยภาพการขยายตัวของการพัฒนาเกมด้วย JavaScript

ภาพรวมโปรเจ็กต์ AthenaEnv

  • AthenaEnv คือ สภาพแวดล้อมรัน JavaScript สำหรับ PS2 ที่ให้ สภาพแวดล้อมการพัฒนาแบบเน้น API แทนที่จะเป็นเกมเอนจินแบบดั้งเดิม
    • ภายในมีการปรับแต่งและฝัง QuickJS เพื่อแปลความโค้ด JavaScript
    • ถูกออกแบบให้โปรแกรมเนทีฟบน PS2 (เขียนด้วย C) เป็นผู้เรียกใช้โค้ด JavaScript
  • API ที่มีให้ครอบคลุม การเรนเดอร์ การโหลดแอสเซ็ต การจัดการอินพุต การอ่านเขียนไฟล์ และการเล่นเสียง
    • มีระดับการนามธรรมใกล้เคียงกับ p5.js หรือ Raylib โดยฟีเจอร์อย่างการตรวจจับการชนหรือการจัดการซีนยังต้องเขียนเอง

ขั้นตอนการรันเกม JavaScript บน PS2

  • การรันใช้ อีมูเลเตอร์ PCSX2 และต้องเปิดใช้งานตัวเลือก “Enable host filesystem” ในการตั้งค่า
  • ในโฟลเดอร์โปรเจ็กต์จะมีไฟล์ดังต่อไปนี้
    • athena.elf: ไฟล์รันของ Athena
    • athena.ini: ไฟล์ตั้งค่า เช่น entry point (main.js) และการตั้งค่า boot logo
    • main.js, src/, assets/: โค้ดเกมและทรัพยากร
  • เมื่อรัน athena.elf ในอีมูเลเตอร์ เกมจะเริ่มทำงาน และ สามารถแก้โค้ด JavaScript แล้วรีเซ็ตเพื่อให้มีผลทันที

ขั้นตอนการสร้างไฟล์ .iso

  • มีการอธิบายวิธีรวมโปรเจ็กต์เป็น อิมเมจ ISO เดียว เพื่อใช้ในการแจกจ่าย
    • ไฟล์ที่จำเป็น: athena.elf, athena.ini, main.js, src/, ATHA_000.01, SYSTEM.CNF
    • เลือกทุกไฟล์แล้วบีบอัดเป็น zip จากนั้นใช้เว็บไซต์ mconverter.eu เพื่อแปลงเป็น iso
    • หลังจากแปลงแล้วจะสามารถรันได้โดยไม่ต้องเปิดการตั้งค่า “Enable host filesystem”
  • เพื่อทำให้กระบวนการแปลงเป็นอัตโนมัติ มีการแนะนำ เครื่องมือ CLI ชื่อ GENISO ที่พัฒนาด้วย Python (https://github.com/scottvr/GENISO)
    • สามารถแปลง zip เป็น iso ได้โดยไม่ต้องพึ่งพา dependency ภายนอก

ตัวอย่าง Hello World

  • ในตัวอย่างพื้นฐาน มีการสาธิต การโหลดฟอนต์และรูปภาพ การจัดโครงสร้าง game loop สปรाइटแอนิเมชัน การจัดการอินพุต และ การเรนเดอร์ข้อความ
    • ใช้โมดูลในตัวของ Athena เช่น Screen, Font, Image, Pads
    • รันลูปแบบเฟรมต่อเฟรมด้วยเมธอด Screen.display()
    • ตรวจจับอินพุตคอนโทรลเลอร์ด้วย Pads.get(0)
    • ควบคุมแอนิเมชันแบบเฟรมต่อเฟรมด้วยพร็อพเพอร์ตีของสปรाइटอย่าง startx, endx
    • แสดง FPS หรือข้อความด้วย font.print()
  • การกลับด้านสปรाइटทำได้ด้วยการ กำหนดค่า width เป็นค่าติดลบ และต้องคำนวณออฟเซ็ตเพื่อชดเชยตำแหน่ง

การรองรับ 3D และการพัฒนาต่อในอนาคต

  • Athena รองรับทั้ง 2D และ 3D แต่ขณะนี้กำลังพัฒนา เวอร์ชัน v4 ที่เน้น 3D เป็นหลัก
  • ปัจจุบันตัวอย่างส่วนใหญ่ยังคงเน้น 2D และมีเดโม 3D อยู่บางส่วน
  • มีการให้โค้ดและเอกสารสนับสนุนผ่าน GitHub อย่างเป็นทางการและชุมชน Discord

บทสรุป

  • AthenaEnv คือ สภาพแวดล้อมล้ำสมัยที่ทำให้สามารถสร้างเกม PS2 ได้ด้วย JavaScript เพียงอย่างเดียว
  • มันช่วยให้นักพัฒนาเว็บสามารถเข้าถึง การพัฒนาเกมสำหรับเครื่องเกมย้อนยุค ได้ และ
    ยังเป็นตัวอย่างที่แสดงให้เห็นถึง ความยืดหยุ่นและความเข้ากันได้ของระบบนิเวศ JavaScript

1 ความคิดเห็น

 
GN⁺ 2025-11-22
ความคิดเห็นใน Hacker News
  • โปรเจกต์ที่ Fabrice Bellard สร้างดูเหมือนจะมีอิทธิพลกว้างขวางมากจริง ๆ
    น่าทึ่งที่ด้วย QuickJS ทำให้การคืนชีพโฮมบรูบนระบบเก่าอย่าง PS2 เป็นไปได้ผ่าน AthenaEnv

    • อยากใส่ข้อความในมีม xkcd 2347 ว่า “สิ่งที่ Fabrice Bellard ลงมือทำเพื่อพิสูจน์อะไรบางอย่างทั้งที่ยังง่วง ๆ” แต่ทำไม่ได้เพราะแทบไม่มีทักษะ Photoshop
      ที่ไหนสักแห่งในสายโซ่ dependency ของโปรเจกต์ FOSSจำนวนมากก็มีโค้ดของเขาอยู่
  • พอเห็นผู้เขียนพูดถึงความยุ่งยากของการใช้เว็บไซต์ที่แปลง ZIP เป็น ISO ก็เลยทำสคริปต์ Python ข้ามแพลตฟอร์มที่ไม่มี dependency ภายนอกขึ้นมาเอง
    ดูได้ที่ ZIP2ISO.py
    น่าประทับใจที่ “vibe-coded” มันด้วย Gemini3 Pro โดยไม่ได้อ่านสเปก ISO9660

    • คิดว่าน่าจะทำแบบเดียวกันได้ด้วย mkisofs
  • AthenaEnv น่าสนใจ ใช้ QuickJS เป็นตัวแปลภาษา JS และดูเหมือนมีโครงสร้างที่ครอบไลบรารีระบบแบบเนทีฟของ PS2
    เลยสงสัยว่าบนคอนโซลยุคใหม่อย่าง Switch/2, PS5, Xbox จะมีโปรเจกต์คล้ายกันที่ปล่อยเกม JS Canvas(WebGPU/WebGL) ได้หรือไม่
    SDK ของคอนโซลติด NDA เลยแทบไม่มีข้อมูลสาธารณะ และเกมส่วนใหญ่ก็ใช้ Unreal หรือ Unity
    ส่วนบน PC หรือมือถือค่อนข้างง่ายกว่า เพราะรันผ่าน Electron หรือ WebView ได้สะดวก

    • มีกรณีของเกม Cross Code ที่ทำด้วย JS แล้วพอร์ตลงคอนโซล รายละเอียดอยู่ในโพสต์บล็อกนี้
    • จำได้ว่า SDK ของ Nintendo 3DS และ Wii U เคยมีเฟรมเวิร์กคล้าย Electronที่อิงเทคโนโลยีเว็บ แต่บน Switch เหมือนจะยุติไปแล้ว
      แอปเล็ตเบราว์เซอร์ WebKit ของ Switch ปิดการใช้ JIT เอาไว้ จึงใช้ได้แค่กับงานจำกัดอย่าง e-manual
  • สงสัยว่าถ้าจะรันบนคอนโซลจริง ๆ จำเป็นต้องไรต์ ISO ลงแผ่นหรือเปล่า

    • ถ้าจับคู่กับ FreeDVDBoot ก็น่าจะทำได้
    • วิธีที่นิยมคือใช้ FreeMcBoot บนเมมโมรีการ์ดร่วมกับแฟลชไดรฟ์ USB และยังช่วยลดการสึกหรอของไดรฟ์ออปติคัลได้ด้วย
    • ถ้าจะไรต์แผ่นแล้วรันก็ต้องแฮ็กคอนโซล แต่ใช้ USB ก็ได้เหมือนกัน แค่อาจอยากไรต์เพราะต้องการอารมณ์ของแผ่นจริง
    • มีความเห็นว่าการใช้โหมดไดรฟ์ออปติคัลแทนแผ่นจริงน่าจะดีกว่า
  • มีโปรเจกต์คล้ายกันที่ใช้ QuickJS คือ nx.js สำหรับ Nintendo Switch

    • ตอนนี้โปรเจกต์นี้รองรับแค่ canvas2d แต่ในทางทฤษฎีก็น่าจะสร้างเลเยอร์สำหรับแปลงเกม WebGPU หรือ WebGL ไปลง Switch ได้
      เพียงแต่ถ้าเปลี่ยนจากเอนจิน v8/JIT มาเป็น QuickJS ประสิทธิภาพก็น่าจะลดลงมาก
  • ตอนนี้แม้แต่ PS2 ก็หนีเงื้อมมือของ JavaScriptไม่พ้นแล้ว

  • AthenaEnv เป็นโปรเจกต์ต่อจาก Enceladus ที่ใช้ Lua และมาจากนักพัฒนาคนเดียวกัน
    ไม่ได้ใช้แค่กับเกม แต่ยังใช้กับแอปโฮมบรูจำนวนมากด้วย โดยฝั่ง Enceladus มีตัวอย่างอย่าง RETROLauncher และ POPSLoader ส่วน Athena มี OSD-XMB

  • คิดว่าอาจเป็นไปได้ที่จะสร้างเว็บเบราว์เซอร์สำหรับ PS2 แล้วเปิดเกมเป็นเว็บไซต์

    • แต่ Chrome ต้องการหน่วยความจำขั้นต่ำ 4GB ดังนั้นถ้าจะให้พอดีกับ RAM 32MB ของ PS2 ก็ต้องย่อให้เหลือ 1/128
  • กำลังมองหาสิ่งแบบนี้อยู่พอดี เป็นโปรเจกต์ที่เจ๋งมากจริง ๆ ขอบคุณ

  • ผู้คนทำทุกอย่างเพื่อจะได้ไม่ต้องใช้ .gdscript หรือ Godot

    • ชอบ Godot นะ แต่บน PS2 มันรันไม่ได้
    • เอาจริง ๆ การบิลด์ด้วย Godot แล้ว export ไป PS2 ไม่ใช่เรื่องง่ายเลย