Application Model

เกมที่พัฒนาโดยใช้ XNA นั้นจะมี class หลักคือ Game class ซึ่งประกอบด้วย game engine, graphic device และ window setting รวมทั้งการเรียกใช้ input และ sound ด้วย

Game class นี้มี method ที่สำคัญคือ

  • initialize ( )
    ตั้งค่าเริ่มต้นของเกม และ load game content
  • LoadGraphicsContent ( )
    สำหรับ load graphics content ทั้งหมด
  • UnloadGraphicsContent ( )
    สำหรับ unload graphcis content
  • Update ( GameTime time )
    ถูกเรียกก่อนแสดงผลเพื่อให้เกม update สถานะต่างๆ เช่น การดำเนินเกม, input, sound และอื่นๆ ซึ่งหาก Graphics hardware ทำงานช้า Update จะถูกเรียกใช้มากกว่า Draw เพื่อให้การดำเนินเกมเป็นไปอย่างราบรื่นแม้จะแสดงผลไม่ทันก็ตาม
  • Draw (GameTime time )
    แสดงผลของเกมทางจอภาพ

นอกจากนี้ เรายังสามารถเพิ่ม Game Component เข้าไปในเกมได้ Game Component นี้คือ class ที่จะถูกเรียก Update และ Draw method จาก Game Class ซึ่งไมโครซอฟต์คาดหวังว่าจะทำให้เกิดตลาดของ Game Reuseable Asset ขึ้น

อย่างไรก็ตาม ใน XNA เวอร์ชั่นแรกนี้ Game Component ไม่ค่อยประสบความสำเร็จเท่าที่ควร จริงๆแล้วในเวอร์ชั่นแรกๆ (30 August 2006 release) ไมโครซอฟต์มี designer สำหรับประกอบ Game Component มากับ XNA ด้วยซ้ำไป แต่การใช้งานไม่ค่อยได้ผลดีนัก เวอร์ชั่นหลังๆ Designer นี้จึงถูกเอาออกไป (แต่เรายังใช้ Game Component ได้อยู่)

ไมโครซอฟต์มีเว็บไซต์สำหรับ Open Source Community อยู่ที่ www.codeplex.com ซึ่งก็มีโครงการสำหรับ XNA และ component อยู่พอสมควร ซึ่งตลาด Game Component นี้น่าจะมีการเติบโตได้ในอนาคต

องค์ประกอบของ XNA

XNA ประกอบด้วย 2 ส่วนหลัก

  1. XNA Game Studio Express
    หมายถึง IDE และเครื่องมือที่ใช้ในการพัฒนาเกมทั้งหมด
  2. XNA Framework
    หมายถึง library ที่ใช้ในการพัฒนาเกม ซึ่งเป็น dll ที่เขียนด้วยภาษา C#

XNA Framework มีองค์ประกอบเป็นชั้นๆ (Layers) ดังนี้

  • Platform - เป็นชั้นล่างสุดของโครงสร้างของ XNA เป็น low-level native and managed API สำหรับ XNA framework ทั้งหมดเรียกใช้ ส่วนนี้ทำหน้าที่ติดต่อกับฮาร์ดแวร์หรือตัวกลาง เช่น Direct3D, XACT, XInput และ XContent
  • Core Framework - เป็นส่วนที่ทำหน้าที่หลัก (core functionality) เช่น Managed DirectX ส่วนนี้แบ่งการทำงานเป็นกลุ่ม คือ Graphics, Audio, Input, Math และ Storage ส่วนของ XNA อื่นๆคือการขยายการทำงานจากส่วนนี้
  • Extended Framework - เป็นส่วนที่ช่วยอำนวยความสะดวกสำหรับการพัฒนาเกม ในเวอร์ชั่นแรกของ XNA ส่วนนี้ประกอบด้วย Application Model และ Content Pipeline ซึ่งไมโครซอฟต์มีแผนจะเพิ่มส่วนนี้อีกในอนาคต
  • Game - คือตัวเกมเอง ประกอบด้วย code และ content รวมทั้ง starter kits, templates และ game component

หรืออาจแบ่งองค์ประกอบของ XNA Framework อย่างง่ายๆตาม dll ได้ดังนี้

  • XNA Framework Engine - อยู่ใน Microsoft.Xna.Framework.dll
  • XNA Game Application Model - อยู่ใน Microsoft.Xna.Framework.Game.dll
  • XNA Content Pipeline - อยู่ใน Microsoft.Xna.Framework.Content.Pipeline.dlls

Dll เหล่านี้เขียนโดยใช้ C# ซึ่งเป็น managed code จึงสามารถใช้โปรแกรม class browser เช่น Reflection for .NET เปิดดูการทำงานของ dll ได้ ซึ่งจะเห็นว่าการทำงานส่วนใหญ่คือการเรียกใช้ DirectX นั่นเอง (ยกเว้นส่วน content pipeline)

รายละเอียดขององค์ประกอบที่สำคัญมีดังนี้

Application Model
เป็นส่วนที่ทำให้นักพัฒนาไม่ต้องกังวลถึง platform ที่กำลังเล่นอยู่ ส่วนนี้จะทำหน้าที่จัดการเรื่อง window, message pump, timer or clock, รวมทั้งการจัดการ GraphicsComponent และ Graphics Device นักพัฒนาจึงไม่ต้องสนใจความแตกต่างของ PC และ XBos ยกเว้นในเกมที่ต้องการคุณสมบัติเฉพาะของเครื่องเท่านั้น และสามารถประกอบเกมขึ้นจาก GameComponents ได้ด้วย (เรียกส่วนนี้ว่า Componet Model) ซึ่งทำให้การสร้างเกมง่ายขึ้น และสามารถสร้าง reusable component ไว้ใช้ได้ด้วย ส่วนนี้เป็นสิ่งที่ไมโครซอฟต์มีความคาดหวังว่าตลาดจะโตมาก

Graphics
XNA พัฒนาส่วนกราฟฟิกจาก DirectX 9.0 โดยได้ตัดเอา Fixed-function pipeline ทิ้งไปเนื่องจากต้องการให้เกมใน PC version นั้น full compaitible กับ Xbox 360 version จึงมีแต่ shader-driven programmable pipeline ให้ใช้เท่านั้น ซึ่ง XNA จำเป็นต้องทำให้การใช้งาน shaders และ effects ง่ายขึ้นมากโดยมี BasicEffect ซึ่งเป็นการใช้ shader แบบง่ายๆโดยไม่ต้องมีความรู้เรื่อง shader เมือนักพัฒนาคุ้นเคยขึ้นก็สามารถใช้ shader แบบเต็มรูปแบบได้ต่อไป (DirectX 10 เองก็มีแต่ shader-driven pipeline เหมือนกัน)

Audio
ด้านของเสียง XNA สร้างขึ้นจาก XACT ซึ่งเป็น cross-platform audio API สำหรับ Windows กับ Xbox ของไมโครซอฟต์เอง XACT ใช้ concept คล้ายกับ shaders ใน Direct3D คือ นักพัฒนาเสียงจะสร้างเสียงไว้เป็น package ซึ่งมีรายละเอียดบรรจุครบถ้วน เช่น volume, looping, channel mixing (including 5.1) ฯลฯ แล้วโปรแกรมเมอร์เรียกใช้จากชื่อ package โดยไม่ต้องคำนึงถึงรายละเอียดด้านฮาร์ดแวร์เลย

Input
ส่วนนี้สร้างขึ้นจาก XInput ซึ่งก็เป็น cross-platofrm API สำหรับ common controller โดยทำงานแบบ immediate mode API ไม่ต้องมีการ initiialization ไม่ต้องยุ่งกับรายละเอียดการคุมฮาร์ดแวร์ เพียงแค่เรียกคำสั่ง GetState จาก GamePad, Keyboard และ Mouse ก็ใช้ได้เลย

Storage
เป็นส่วนสำหรับเก็บข้อมูลเกม (save games, high scores etc) ใน Xbox 360 จะเก็บสถานะของเกม (Game state) ไว้กับ profile และ storage device (hard drive หรือ memory unit) XNA มีส่วนนี้ emulate ให้ทำงานบนพีซีเหมือนใน Xbox จึงสามารถใช้ code ร่วมกันได้เลย

Math
XNA มีความสามารถทางคณิตศาสตร์ที่จำเป็นสำหรับเกม เช่น Vector2, Vector3, Vector4, Matrix, Plane, Ray เป็นต้น รวมถึง bounding volume เช่น BoundingBox, BoundingSphere และ BoundingFrustum ซึ่งสามารถคำนวณ intersection และ containment test ได้ ที่ต้องสังเกตคือ Math ทั้งหมดเป็น right-handed เพื่อให้ไม่ต้องทำ function ให้เป็นสองชุดจึงสะดวกต่อการสร้าง content ตลอดจนการใช้ middleware ด้วย (แต่ถ้าต้องการจริงๆ ก็เรียก Left-handded API ได้ด้วย)

จุดประสงค์ของการพัฒนา XNA

ใน XNA Team Blog, Boyd Multerer (Product Unit Manager - XNA) กล่าวว่า XNA นั้นเป็นผลิตภัณฑ์ที่จะช่วยแก้วิกฤตในอุตสาหกรรมเกม ซึ่งเป็นอุตสาหกรรมที่ทำยากขึ้นทุกที กราฟฟิกที่ดีขึ้น เครื่องที่ดีขึ้น จนหลายเกมเน้นไปที่ความสวยงามมากกว่าสนุก เกมจำนวนมากขาดทุน ในขณะที่บางเกมประสบความสำเร็จอย่างมาก แต่ต้นทุนการผลิตก็เพิ่มสูงขึ้นอย่างมาก

ปัญหานี้ทำให้วงการเกมเกิดความกลัวที่จะทดลองกับแนวความคิดสร้างสรรใหม่ๆ ส่วนใหญ่จะยึดกับแนวการเล่นและประเภทของเกมที่เป็นที่รู้จักกันเป็นอย่างดีเท่านั้น เพราะเป็นสิ่งที่พอจะ "คาดหวังผล" ได้ และเชื่อว่าความเสี่ยงในทางด้านการเงินจะลดลง ผลที่ตามมาคือวงการเกมเริ่มที่จะไม่มีสิ่งใหม่ให้เห็น

อีกปัญหาคือการสร้างเกมนั้นเป็นเรื่องยาก ทั้งในด้านการออกแบบและเทคโนโลยี ความเสี่ยงทางธุรกิจที่สูงมากนี้ทำให้ขาดแคลนคนที่มีความสามารถสูง และทำให้กระบวนการพัฒนาเกมทำแบบยุ่งเหยิงไม่เป็นระเบียบและไม่ถูกหลักวิชาการ ทีมขนาดเล็กที่มีคนที่มีความสามารถจำกัดจึงทำให้สำเร็จได้ยาก

แต่ในขณะเดียวกันการเข้าสู่วงการพัฒนาเกมของเด็กรุ่นใหม่ๆแม้จะจบการศึกษาสูงและมีความสามารถก็เป็นไปได้อย่างยากลำบาก เนื่องจากการที่วงการเป็นวงการที่เสียงและต้องการความเชี่ยวชาญสูง

Development Tools ส่วนใหญ่ออกแบบมาเพื่อให้ coder ที่มีความชำนาญสูงใช้ แต่เรามักพบว่าคนที่ออกแบบเกมได้ดีมักไม่ใช่ coder เหล่านั้น

การพัฒนา XNA นี้ทีมงานพัฒนาได้หยิบเอาหลักการของ .NET Compact Framework (สร้างโดย Mike Zintel) มาใช้ใน XBox 360 นั่นเอง

ในการเปิดตัวในงาน GDC 2006 ไมโครซอฟต์ได้แสดงการ run โปรแกรมแบบ managed code บน Xbox 360 development kit และการนำเสนอส่วนใหญ่เน้นไปที่การช่วยให้นักออกแบบและทีมเกมสามารถสร้างเกมได้เร็วขึ้นและประหยัดต้นทุนที่สุด สิ่งที่น่าตื่นเต้นที่สุดคือการออกมาของ CTP และการที่ไมโครซอฟต์ลงทุนเผยแพร่งานกราฟฟิกและ souce code ของ MechCommander 2 (ไม่รวมเน็ตเวิร์กโค้ด) ออกมาเป็นการตอบแทนต่อชุมชนพัฒนาเกม

สิ่งนี้เองที่เป็นประโยชน์ต่อนักพัฒนา (อย่างเราๆ) มาก เนื่องจากได้เห็นว่าเกมนั้นพัฒนาขึ้นมาอย่างไร ทีม XNA พยายามอย่างมากที่จะกระตุ้นในนักพัฒนารุ่นใหม่สร้างเกมที่มีความคิดสร้างสรรมากขึ้น จนถึงกับเอ่ยว่าอยากให้เหมือนกับเวที Sundance ของวงการภาพยนต์โน่นทีเดียว ซึ่งจะทำให้การเข้าสู่วงการเกมนั้นทำได้ง่ายขึ้น

ทีม XNA วางแผนจะสร้าง XNA ให้เป็นเครื่องมือที่ดีสำหรับการสร้าง Casual games แล้วค่อยๆพัฒนาไปสู่การเป็นเครื่องมือสำหรับเกมขนาดใหญ่แบบ FPS ในอนาคต ที่สำคัญคือต้องการให้ XNA กลายเป็น tools สำหรับ game studio ในทุกระดับ ตั้งแต่ทีมขนาดเล็กที่เริ่มเข้าสู่วงการ จนถึงระดับมืออาชีพ

วัตถุประสงค์ของ XNA

  1. Cross-platform Game Development Tools - เกมที่สร้างขึ้นจะสามารถเล่นได้ทั้งใน Windows และ Xbox ไมโครซอฟต์ต้องการให้นักพัฒนาสามารถสร้างเกมใน Windows ได้อย่างสะดวกและรวดเร็ว (รวมทั้งต้นทุนต่ำด้วย) แล้วสามารถสร้างเวอร์ชั่นสำหรับ Xbox ได้อย่างง่ายดาย เป้าหมายคือ code จะมีความเหมือนกันประมาณ 95% ส่วนที่ต่างกันก็คือการใช้ features ที่เฉพาะเจาะจงสำหรับ platform นั้นๆ ซึ่งหมายความว่าเกมส่วนใหญ่จะไม่มี code ที่แตกต่างกันเลย
  2. Simplify Game Development - คือทำให้การพัฒนาเกมนั้นง่ายขึ้น เป้าหมายภายในทีมของ XNA นั้นต้องการให้

    • นักออกแบบเกมสามารถสร้างเกมที่ออกแบบเองได้ภายในห้านาทีแรกที่เริ่มหัด XNA
    • โปรแกรมเมอร์ไม่ต้องสนใจเรื่องการจัดการ Windows, Graphics Card, Graphics Mode, Input, Message pump สิ่งที่ต้องสนใจมีอย่างเดียวคือการเขียน code เกม
    • การจัดการด้าน resource ก็ทำได้ง่าย โดยมีเครื่องมือที่ชื่อ "Content Pipeline" ที่ทำให้การส่ง content เข้าไปในเกมทำได้ง่ายทั้งการ import, compiling, และ loading ในเกม
    • มี "Starter Kits" ให้ คือเป็นเกมที่สมบูรณ์ทั้ง resource และ code ที่ใช้เป็น project template ได้เลย นักพัฒนาเกมสามารถเริ่งสร้างเกมโดยการปรับแต่ง template ดังกล่าวได้ทันที


นอกจากนี้ไมโครซอฟต์ได้กำหนด business model ไว้ว่า tools ต่างๆที่ใช้พัฒนาจะฟรี แต่ให้นักพัฒนาที่ต้องการพัฒนาเกมใน Xbox 360 ต้องเสียค่าสมาชิกปีละ $99.00 เพื่อที่จะ run program ที่ไม่ได้ signed บน Xbox ได้ ซึ่งไมโครซอฟต์หวังว่าระบบสมาชิกนี้เองที่จะทำให้สามารถควบคุม business model ของเกมเหล่านี้ได้ รวมทั้งการที่จะลงทุนในเกมที่น่าสนใจบางเกม

ไมโครซอฟต์มีความคาดหวังว่าจะทำให้เด็กๆมีความสนใจและตื่นตัวในการพัฒนาเกมมากขึ้น รวมทั้งได้รับการสนับสนุนจากผู้ปกครองและสถาบันการศึกษาที่จะบรรจุการพัฒนาเกมเข้าไปในการเรียนการสอนมากขึ้น

XNA นั้นไม่ใช่เป็นแค่เครื่องมือสำหรับนักพัฒนาระดับต้นเท่านั้น เราสามารถสร้างเกมที่สมบูรณ์แบบที่ใช้ความสามารถระดับสูงเช่น shaders และ high-end graphics ได้ด้วย

ไมโครซอฟต์ได้จับมือกับ Garage Games เจ้าของเกมเอนจิ้นชื่อดัง "Torque" เพื่อออก "TorqueX" ซึ่งเป็นเวอร์ชั่นที่ใช้ manage code และ run เกมใน Xbox ได้ ซึ่ง Garage ได้ออกเกมตัวอย่างมาโชว์ได้อย่างน่าประทับใจ คือ Marble-Blast สำหรับ Xbox การที่มี tools ของ Garage เข้ามาเสริมนี่เองที่ทำให้ XNA ง่ายขึ้นมากสำหรับนักพัฒนาหน้าใหม่ และนักออกแบบเกมทั่วไป

ข้อจำกัดของ XNA เวอร์ชั่นแรกนี้คือ เกมที่สร้างขึ้นสามารถเล่นใน PC เครื่องอื่นๆได้ แต่หากจะเล่นใน Xbox เครื่องอื่น จำเป็นต้องส่ง source code ไปกับเกมด้วย ซึ่งไมโครซอฟต์ประกาศว่าข้อจำกัดนี้จะหมดไปในอนาคต

นอกจากนี้ไมโครซอฟต์ยังมีแผนการที่จะออก XNA Game Studio Professional ซึ่งจะทำให้สามารถพัฒนา Commercial Game สำหรับ Xbox 360 ได้ในอนาคตด้วย