แจ้งย้ายจากบล็อกไปเป็นเว็บ cmdev.net ครับ

คลิ้กไปที่อยู่ใหม่ได้เลยครับ >> cmdev.net

Chiangmai Game Dev Conference # 1



สวัสดีเพื่อนชาว CMDev ทุกคนนะครับ เว็บนี้ก็ทำขึ้นมาเพื่อเป็นที่แลกเปลี่ยนความรู้สำหรับคนทำเกมกันนะครับ
และในการนี้ ก็จะมีการจัดสัมนาเล็กๆครั้งแรกขึ้นในปลายเดือนนี้ครับ
ด้วยหัวข้อชวนกังแข้งกังขา ว่าทำไมต้องเป็น Xbox (และทำไมต้อง Begins ^^' )

เอาเป็นว่าถ้าใครเคยเขียนเกมเล่น ทั้งเกมแฟลช เกมโมบาย หรือเกมพีซี

มาหาคำตอบกันวันที่ 21 นี้นะครับ


ก้าวแรกสู่การพัฒนาเกมส์บนเครื่อง Xbox360


.:: 21 กรกฎาคม 2550 ::.

ชั้น1 อาคารอาร์เทค ตรงข้ามแม่วังสื่อสาร
ในโครงการเชียงใหม่บิสิเนสพาร์ค (หลังคาร์ฟูร์)

รอบเช้า (สำหรับบุคคลทั่วไป)


09:00 – 9:30 ลงทะเบียน
09:30 – 9:45 เปิดการสัมมนา โดยรักษาการผู้จัดการสาขา SIPA สาขาเชียงใหม่
09:45 – 10:00 Keynote : Game Industry : Current Status (สถานะการณ์ปัจจุบันของอุตสาหกรรมเกมส์)
10:00 – 11:00 XNA Game Studio Express : Overview
11:00 – 11:15 Break
11:15 – 12:15 Torque X : Game Engine for XNA
12:15 – 12:30 SIPA Project : Game Development Training

รอบบ่าย (สำหรับสถาบันการศึกษา)

13:00 – 13:30 ลงทะเบียน
13:30 – 13:45 เปิดการสัมมนา โดยรักษาการผู้จัดการสาขา SIPA สาขาเชียงใหม่
13:45 – 14:00 Keynote : Game Industry : Current Status (สถานะการณ์ปัจจุบันของอุตสาหกรรมเกมส์)
14:00 – 15:00 XNA Game Studio Express : Overview
15:00 – 15:15 Break
15:15 – 16:15 Torque X : Game Engine for XNA
16:15 – 16:30 SIPA Project : Game Development Training

---------------------------

เข้าฟรีครับ ถ้าใครสนใจ จะลงชื่อจองที่ไว้ในนี้ก่อนเลยก็ได้นะครับ
(ลงชื่อแล้วขอเบอร์หรือเมล์ติดต่อกลับด้วยนะครับ)

การจัดการหน่วยความจำของ C#

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

ในการจัดการหน่วยความจำในภาษาใดก็ตามมีขั้นตอน 5 ขั้นตอนในการใช้ทรัพยกรเครื่องซึ่งก็คือ
  1. เตรียมจองหน่วยความจำตามประเภทวัตถุที่โปรแกรมต้องการ
  2. กำหนดค่าเริ่มต้นและดำเนินการเบิ้องต้นเพือให้สามารถนำวัตถุมาใช้ในโปรแกรมได้
  3. นำวัตถุไปใช้ในโปรแกรม
  4. เมือไม่ใช้แล้วก็เตรียมทำพื้นที่หน่วยความจำนั้นให้ว่าง
  5. ทำให้หน่วยความจำพื้นที่นั้นว่าง

ในภาษาที่ไม่ได้มีการจัดการหน่วยความจำให้จากตัว runtime (un-managed language)อย่างเช่น C/C++ เราไม่สามารถบอกได้เลยว่า pointer นั้นชี้ไปยังวัตถุชนิดอะไร ขนาดเท่าไร (ก็ pointer มันมีขนาดเท่ากันหมดนิ) จึงเป็นไปไม่ได้เลยที่จะสร้างระบบปลดปล่อยหน่วยความจำที่โปรแกรมไม่ได้ใช้แล้ว (โปรแกรมเมอร์ต้องทำเองหมด) แต่ในภาษาที่อยู่ภายใต้การควบคุมของตัว runtime (managed language) อย่าง Java/ C# reference ทุกตัวมีขนาดที่แน่นอนเพราะต้องซี้ไปยังวัตถุที่ประกาศไว้เท่านั้น ทำให้การจัดการหน่วยความจำ 5 ขั้นข้างบน สามารถให้ตัว runtime จัดการให้ได้

การจัดการหน่วยความจำในภาษา C#

การเตรียมจองพื้นที่หน่วยความจำของภาษา C# จะเกิดขึ้นเมือโปรแกรมเมอร์ ใช้ keyword ว่า "new" ตัว runtime ของ C# หรือ Common Language Runtime (CLR) จะทำการตรวจสอบต่อว่าที่ heap ( คิดว่าเป็นกระบะเก็บวัตถุของคอมพิวเตอร์แล้วกันนะครับ ) มีพื้นที่เพียงพอหรือเปล่า หากว่าพอก็จะดำเนินการสร้างวัตถุชนิดนั้นๆ ที่โปรแกรมร้องขอต่อไป แต่หากว่าไม่พอ ก็.... ต้องใจเย็นๆนะครับเดียวค่อยเป็นค่อยไป เดียวเราจะได้พูดเรื่องนี้ต่อไปนะครับ

ในภาษาอื่นเช่น C ซึ่งเป็นภาษาที่หน่วยความจำไม่ได้ถูกจัดการด้วย runtime เมื่อไรก็ตามที่โปรแกรมเมอร์ เรียกใช้ keyword "new" สิ่งที่เกิดขึ้นคือ runtime ของ C จะพยายามค้นหาหน่วนความจำที่เพียงพอที่ Heap เหมือนกันเช่นเดียวกับ C# และถ้าเจอพื้นที่หน่วยความจำเพียงพอก็จะคืน pointer ที่อยู่ใน link list node ของ runtime ของ C ที่หน่วยความจำถูกจองไว้ การกระทำของ C# กับ C ฟังดูคราวๆอาจจะเหมือนกันนะครับ แต่จริงๆ แล้วต่างกันมากนะครับ เพราะ ในวิธีที่ C ใช้คือเจอที่ไหนพอก็จะจองพื้นที่ตรงนั้นไว้ ทำให้ลักษณะ Heap ของ C หน่วยความจำจะกระจัดกระจายมาก ( มันคงเป็นไปไม่ได้นะครับที่วัตถุทุกตัวจะมีขนาดที่สามารถนำมาเรียงต่อกันได้พอดีนะครับ )

ใน .Net CLR (มีคำแปลอยู่ข้างบนแล้วนะครับ) ตัว runtime จะรักษาพื้นที่หน่วยความจำที่ไม่ได้ใช้หรือยังว่างอยู่ให้มีความต่อเนื้องเสมอ ในทางตรงกันข้ามหมายถึงตัว runtime ก็จะรักษาพื้นที่หน่วยความจำที่ได้มีการใช้แล้วเรี้ยงกันอยู่ต่อเนื้องกันโดยตลอด โดยตัว runtime จะมี pointer อันหนึงซึ่งเราจะเรียกว่า (และฝรั่งอีกหลายล้านคนก็เรียกเหมือนเรา) NextObjPtr pointer หน้าที่ของมันก็คือการชี้ว่าบล๊อคสุดท้ายของหน่วยความจำที่ได้มีการใช้แล้วอยู่ที่ส่วนไหนของ Heap และทุกครั้งที่มีการจองหน่วยความจำใหม่มันจะไปจองที่จุดที่ NextObjPtr pointer ชี้อยู่เนี้ยแหละครับ ทำให้หน่วยความจำที่มีการใช้แล้วสามารถเรียงต่อเนืองกันได้ แต่ปัญหามันก็อาจจะเกิดได้ ถ้า NextObjPtr pointer ชี้ไปยังตำแห่งที่เกินขนาดความจุของ Heap ถ้าหากเป็นเช่นนี้ ตัว CLR ก็จะต้องเรียกให้มีการทำกระบวนการ Garbage Collection หรือเก็บกวาดวัตถุที่ไม่ได้ใช้แล้วใน heap ต่อไป

Garbage Collecting

สำหรับโปรแกรมเมอร์บ้างคนที่เขียน C++ มาก่อนนะครับ อาจจะรู้สึกแปลกๆที่ไม่ต้องทำการปลดปล่อยหน่วนความจำที่ไม่ได้ใช้แล้วเองนะครับ แต่ถ้าใครได้ลองให้ตัว runtime เป็นตัวจัดการหน่วยความจำเมือไรนะครับ รับรองจะทำงานได้เร็วขึ้นมากโขอยู่นะครับ แล้วจะติดใจไม่อยากไปลำบากกับภาษาอื่นแล้วล่ะครับ เดียวเราจะมาลองดูว่าการ Garabage Collecting เนี้ยมีหลักการทำงานคราวๆยังไงนะครับ

Garbage Collector จะเริมงานโดยการดูว่ามีวัตถุใดบ้างใน Heap ที่ไม่มีใครใช้แล้ว (ไม่มี reference อะไรชี้แล้ว) วัตถุเหล่านี้เป็นวัตถุที่สามารถปลดปล่อยจากหน่วยความจำได้ (ก็มันไม่มีใครใช้มันแล้วนี้ครับ อยู่ต่อไปทำไม) วิธีที่ runtime จะรู้ว่าวัตถุใดมี reference ชี้อยู่หรือไม่ก็ จากกระบวนการต่อไปนี้ครับ

ทุกโปรแกรมจะมีที่เราเรียกว่า หมู่ของ roots ซึ่งจะทำหน้าที่ในการบอกตำแหน่งของสิ่งที่อยู่ใน Heap ซึ่ง roots จะประกอบไปด้วย

  • วัตถุ
  • global และ static object
  • Call Stack ของ Thread
  • CPU register ที่มีค่าpointerไปยังวัตถุ
  • ค่า null

ซึ่งทั่งนี้ทั่งนั้น หมู่ roots ถูกจัดการโดย Just In Time compiler และ CLR

เมือ Garbage Collector เริ่มทำงาน มันจะสันนิฐานว่าวัตถุทุกอย่างใน Heap สามารถถูกปลดปล่อยได้หมด หรือ หมู่ roots ของโปรแกรมไม่ได้ชี้ไปยังวัตถุใดเลย แล้ว Garbage Collector จะเริ่มทำงานโดยการตรวจสอบที่ล่ะ root ว่ามีการชี้ไปยัง object ใดหรือไม่ เมือตรวจสอบ roots ขั้นต้น เสร็จแล้วจึงตรวจสอบ roots ขั้นตอ่ไปที่ลึกว่าเดิม แล้วสร้าง graph เหมือนกับต้นไม้เพือบอกความสัมพันธ์ของ roots และเพือหลีกเลี่ยงทีจะตรวจสอบอันเดิมที่ได้ตรวจสอบไปแล้ว ซึ่งก็จพทำอย่างงี้จนตวรจสอบ roots ทุกอันหากมีวัตถุอันไหนที่ไม่มี roots ชี้อยู่แปลว่า วัตถุอันนั้นสมควรตาย (หรือถูกปลดปล่อยจากหน่วยความจำ) จากนั้น Garbage Collector จึงทำการเคลือนย้ายหน่วยความจำที่กำลังถูกใช้อยู่ มาเรียงติดกัน โดยใช้คำสั่ง memcpy อันโด่งดัง

หลังจากสามารถเอาหน่วยความจำที่ยังใช้งานอยู่มาเรียงต่อกันได้แล้ว จึ้งย้าย pointer NextObjPtr ไปชี้ที่หน่วยความจำสุดท้ายที่ถูกใช้งาน ซึ่งแน่นอนครับกระบวนการดังกล่าวย่อมมีผลต่อประสิทธิภาพการทำงานของโปรแกรมนะครับ แต่ก็คุ้มกับสิ่งที่เสียครับ เพราะถ้าเราบริหารมันเป็น มันไม่มีปัญหาหรอกครับ เพราะส่วนใหญ่มันจะทำการ Garbage Collecting ก็ต่อเมือพื้นที่หน่วยความจำเต็มแล้วเท่านั้นครับ และตัว Garbage Collector ยังมีการ implement การ optimizing หลายอย่างนะครับที่จะทำให้การทำงานของมันแทบจะไม่กระทบกับประสิทธิภาพของโปรแกรมเราเลยครับ เดียวเรามาลองดู algorithm ของ Garbage Collector ของ CLR ดูสักหน่อยดีกว่า นะครับ

algorithm ของ Garbage Collection ใน CLR จะใช้ 2 อันนะครับคือ

  1. Mark and Sweep -ไม่มีอะไรมากครับเจออันไหนที่ไม่มี reference ใดอ้างถึงก็ mark ตัวไว้ครับ เพื่อให้ขั้นต่อไปนำไปทำลายและปลดปล่อยหน่วยความจำ(sweep)ได้ครับ จะเก็บ list อันหนึงไว้ตลอดครับ ซึ่งเป็น listที่บอกว่า slot ตรงไหนของหน่วยความจำทียังว่างอยู่ และหากมีการสร้างวัตถุเกิดขึ้นก็จะส่ง slot ที่เล็กที่สุดที่สามารถ สร้างวัตถุนั้นได้ ข้อดี - หลักการนี้ใช้การทำงานเพียงเล็กน้อยเอง เพราะ ต้องสร้างและจัดเก็บแค่ list เดียวเองนี้ ข้อเสีย - ทุกครั้งที่มีการสร้างวัตถุ ต้องค้นหา slot ที่ว่างทั้งหมด, เกิดช่วงของหน่วยความจำที่ไม่ต่อกัน
  2. Mark and Compact - เหมือนกับอันแรกแหละครับเพียงแต่ว่า ทุกครั้งที่ทำการปลดปล่อยหน่วยความจำ จะนำหน่วยความจำที่มีการใช้งานมา(compact)เรียงต่อกันด้วยครับ ข้อดี - ไม่เกิดช่วงของหน่วยความจำ, การจองหน่วยความจำใช้แค่ pointer ตัวเดียวมันเลยเร็วมาก ข้อเสีย - การย้ายวัตถุไปมาใน Heap อาจจะช้า(ถ้าวัตถุมันใหญ่)

สำหรับการจัดการ Heap ของ Garbage Collector จะทำโดยการ (สรุป)

  1. แบ่งขนาดของวัตถุใหญ่และเล็ก : เราจะสามารถแบ่งหมวดหมู่ของ Heap ได้เป็น หมวดหมู่สองอันคราวๆ คือ 1 Heap สำหรับวัตถุที่มีขนาดใหญ่ และ 2 Heap สำหรับวัตถุที่มีขนาดเล็ก ทำไมนะเหรอครับ ผมลองให้ไปดู หัวข้อข้างบนเรื่อง algorithm ของ Garbage Collector นะครับน่าจะพอเดาได้ การที่จะ compact วัตถุขนาดใหญ่มันใช้เวลาเกินไปครับ ดั้งนั้นเราจึงจำเป็นต้องเลือกที่จะ compact เฉพาะวัตถุขนาดเล็ก ซึ่งขนาดของวัตถุว่าอันเล็ก อันใหญ่ก็มีตัวเลขให้คราวๆ ดั้งนี้นะครับ สำหรับวัตถุที่มีขนาดใหญ่คือวัตถุที่ใช้เกิน 85000 bytes(.net ver 1.1)
  2. การค้นหาวัตถุเพือปลดปล่อยหน่วยความจำ (ได้เขียนไปแล้วนะครับในส่วนเรื่องของการ Garbage Collecting)
  3. Sweeping a heap คือการรวามหน่วยความจำที่ว่างอยู่มาเรียงต่อกันนั้นเองครับ แล้วก็เก็บ list ของ free slot ที่ว่างอยู่
  4. Compacting a heap คือการรวมพื้นที่หน่วยความจำของ Heap วัตถุขนาดเล็กให้เรียงต่อกัน

ส่วนเรื่องสุดท้ายนะครับ เป็นเรื่องที่ไม่รู้จะไปแป่ะส่วนไหนดีนะครับแต่มีความสำคัญต่อการทำงานของ CLR มากครับ นั้นก็คือส่วนของ

Generational Garbage Collector

เนื่องจากการศึกษาพฤติกรรมการทำงานของ software (หรือการออกแบบของโปรแกรมเมอร์ส่วนใหญ่) เค้าได้ข้อสรุปรวมกันว่า

  • วัตถุที่เพิ่งสร้างมีโอกาสที่จะมีระยะเวลาชีวิตต่อไปน้อยกว่าวัตถุที่ถูกสร้างมานานแล้ว
  • วัตถุที่สร้างมานานแล้วมีโอกาสที่จะมีระยะเวลาซีวิตได้นาน
  • วัตถุที่เพิงสร้างมา มักจะมีความสัมพันธ์กันและต้องการเรียกใช้ข้อมูลเหมือนกัน

จากข้อสมมุตืฐานดังกล่าวเค้าจึงออกแบบ Garbage Collection ของ CLR ให้เป็น 3 เจอเนอร์เรชัน คือ

  • Gen 0 : วัตถุที่เพิงสร้างมาใหม่ และไม่เคยถูกการทำ Garbage Collecting
  • Gen 1 : วัตถุที่เคยผ่านการทำ Garbage Collecting มาแล้ว 1 ครั้ง
  • Gen 2 : วัตถุที่ผ่านการทำ Garbage Collecting มาแล้วมากกว่าสองครั้ง

ทั้งนี้ Garbage Collector จะพยายาม เก็บ Gen 0 ไว้ที่ L2 Cache ของ CPU เพราะจะเป็น ส่วนที่จะโดนการทำ Garbage Collecting มากที่สุด เพราะเมือไรก็ตามที่ Gen 0 เต็ม ตัว Garbage Collector ก็จะทำการ Garbage Collecting วัตถุ อันไหนที่รอดจุดนี้ไป ก็จะไปอยู่ส่วนของ Gen 1 และ Gen 2 ต่อไป ฉะนั้นถ้าเรียงความสัมพันธ์กัน

  • ความถี่ในการ Garbage Collecting Gen 0 > Gen 1 > Gen 2
  • ถ้ามีความต้องการใช้หน่วยความจำที่สูง คนที่จะโดนลงโทษบ่อย(โดน Garbage Collecting)คือ Gen 0 และรองลงมาคือ Gen 1
  • ถ้าหน่วยความจำขาดแคลน Gen 0 จะโดน Garbage Collecting ถี่ขึ้น

หากต้องการอ่านในเวอร์ชันภาษาอังฤกษสามารถอ่านได้ที่นี้ นะครับ ENGLISH : http://mayansoftware.com/content/view/13/1/

อ่า.... ตอนนี้เหนือยแต๊ๆ แล้วเอาไว้พบกันคราวหน้าในครั้งต่อไป มีข้อเสนอแนะหรือสิ่งที่แนะนำก็สามารถ post ได้เลยนะครับหรือส่งมาที่ ผู้เขียนก็ได้ครับ ตอนนี้ไว้แค่นี้ก่อนคัรบ

ความเป็นมาของ XNA

ไมโครซอฟต์ได้เริ่มต้นพัฒนา XNA มานานหลายปีแต่ไม่เป็นที่เปิดเผย จนกระทั่งปี 2004 ไมโครซอฟต์ได้ทำการเปิดตัว XNA เป็นครั้งแรกในงาน GDC (Game Developer Conference) ซึ่งเป็นงานสัมมนาประจำปีของนักพัฒนาเกมที่ใหญ่ที่สุด

XNA เป็นเครื่องมือสำหรับพัฒนาเกมที่ต่างจาก DirectX เนื่องจาก XNA ไม่ได้เป็นแค่เพียง framework เหมือนกับ DirectX แต่ยังรวมเอาเครื่องมือสำหรับพัฒนาเกมมาด้วยอีกหลายอย่าง ซึ่งรวมถึง IDE (Integrated Development Environment) ที่พัฒนามาจาก Microsoft Visual Studio ด้วย เครื่องมือเหล่านี้ทำให้การพัฒนาเกมสะดวกขึ้นมาก

อย่างไรก็ตาม หลังจากการเปิดตัวในปี 2004 แล้ว XNA ก็เงียบหายไป แม้กระทั่งการเปิดตัว Xbox 360 ในงาน E3 ในเดือนพฤษภาคม 2004) ก็ไม่มีอะไรให้เห็น จนกระทั่งปลายปี 2005 ไมโครซอฟต์ก็ออก DirectX 10 สำหรับพัฒนาเกมในวินโดว์สวิสต้า ซึ่งเป็นสัญญาณว่า XNA นั้นไม่ได้เป็นสิ่งที่จะมาแทน DirectX ซึ่งข้อเท็จจริงนี้ก็ชัดเจนขึ้นเมื่อไมโครซอฟต์ก็ออก XNA (Build March 2006 CTP) มาให้นักพัฒนาเกมได้ทดลองใช้กันตอนต้นปี 2006

XNA เวอร์ชั่นแรกนี้มีเครื่องมือสำหรับ build ที่เรียกว่า XNA build มีลักษณะการทำงานคล้ายกับ Ants ซึ่งเหมาะสำหรับการ build project ขนาดใหญ่ ซึ่งไมโครซอฟต์ได้แสดงให้เห็นความสามารถนี้โดยการเผยแพร่ source code ของ MechCommander 2 ออกมาพร้อมกันนี้ด้วย ซึ่งเป็นการแสดงศักยภาพของ XNA ได้เป็นอย่างดี แต่บรรดานักพัฒนาก็ไม่ได้ให้ความสนใจต่อ XNA มากนัก โดยเฉพาะนักพัฒนาขนาดกลางและขนาดเล็ก

จนกระทั่งเดือนสิงหาคม 2006 ไมโครซอฟต์ก็ได้จัดงาน Gamefest Conference (งานสัมมนาใหม่สำหรับนักพัฒนาเกมซึ่งจัดโดยไมโครซอฟต์เอง) และได้ออก XNA Game Studio Express beta 1 ในวันที่ 30 สิงหาคม 2006 ในเวอร์ชั่นนี้มี starter kit (ตัวอย่างสำหรับเป็นต้นแบบพัฒนาเกม) มาด้วยหนึ่งเกม คือ "Space Wars" แต่ XNA เวอร์ชั่นนี้ก็มีความสามารถทางด้าน 3D จำกัด โดยเฉพาะอย่างยิ่งการ import 3D model ซึ่งไม่มีเครื่องมือให้ทำได้โดยสะดวก ทำให้ XNA ในตอนนั้นเหมาะสำหรับการพัฒนาเกม 2D ขนาดเล็กเท่านั้น

ในที่สุดเมื่อเดือนธันวาคม 2006 ไมโครซอฟต์ก็ออก XNA Game Studio เวอร์ชั่นสมบูรณ์ออกมาโดยมี Content Pipeline ที่ทำให้การ import กราฟฟิกและ 3D model ทำได้สะดวกมากขึ้น

นักพัฒนาเกมเริ่มให้ความสนใจ XNA อย่างจริงจังเนื่องจากปัจจัยสองประการ ปัจจัยแรกคือเป็นเครื่องมือพัฒนาเกมที่ดีและแจกฟรี แต่ประการสำคัญคือการที่ไมโครซอฟต์ได้ทำให้เกมที่สร้างขึ้นจาก XNA นี้เล่นได้ทั้งในพีซีและเครื่องเล่นเกม Xbox 360 (โดยนักพัฒนาต้องเสียค่าสมาชิก "Creators Club" ปีละ 99 เหรียญสหรัฐ)

นอกจากนี้ไมโครซอฟต์ก็ประกาศว่าในกลางปี 2007 นี้ (น่าจะเป็นในงาน Gamefest 2007) จะออก XNA Game Studio Professional สำหรับนักพัฒนาที่ต้องการพัฒนาเกมขนาดใหญ่โดยใช้ XNA และจะออก XNA Studio ซึ่งเป็นเครื่องมือสำหรับบริษัทเกมขนาดใหญ่ (ระดับ AAA Studio) โดยเฉพาะด้วย

เครื่องมือช่วยในการเขียนเกมโดย XNA

Tools for XNA Game Programming

  • TestDriven.NET - a nice test-driven tool for VisualStudio
  • Ants Profiler - profiler tools (commercial)
  • Visual3D.NET - the first shader-based 3D engine and design toolset built on Microsoft .NET and XNA designed to simplify rapid creation of:

    • Next-generation PC and Xbox 360 games
    • Massive-multiplayer online games (MMOs)
    • Interactive visualizations
    • Training simulations
    • and other 3D virtual worlds

  • TorqueX - the game engine for XNA based on famous Torque Engine

การติดตั้ง XNA Game Studio Express

Requirements

  • Windows XP SP2 หรือ Windows Vista
  • DirectX 9 (release December 2005)
    DirectX SDK is recommend for tools (e.g.DDS generator) and documents
  • 512 MB Ram (recommend 1-2 GB)
  • 1 GHz CPU or faster
  • Shader Model 1.1 graphics card

การทำงานของ XNA นั้น support แต่ dynamic function pipeline เท่านั้น ไม่เหมือนกับ DirectX ที่ support fixed function pipeline ด้วย ดังนั้น XNA จึงต้องการ graphic card ที่ support อย่างน้อย Shader Model 1.1 หรือดีกว่า ตัวอย่าง graphic card เหล่านี้ได้แก่

  • Shader Model 1.1 - GeForce 3 และ ATI 7000 (release 2001)
  • Shader Model 2.0 - GeForce 5x และ ATI 9x00 series (release 2003 และนิยมมากในปี 2004 เนื่องจากเกมใหญ่ๆใช้ เช่น Far Cry, Doom 3, Half-Life 2)
  • Shader Model 3.0 - GeForce 6x และ ATI x1000 series (current standard)
  • Shader Model 4.0 - GeForce 8x

หมายเหตุ: Xbox ใช้ extended version ของ Shader Model 3.0

ขั้นตอนการติดตั้ง

  1. Uninstall beta versions (if you have)
  2. Download Microsoft Visual C# 2005 Express
  3. Download Microsoft Visual C# 2005 Express SP1
  4. Download XNA Game Studio Express
  5. Install Microsoft Visual C# 2005 Express
  6. Install Microsoft Visual C# 2005 Express SP1
  7. Start Microsoft Visual C# 2005 Express
  8. Register the Microsoft Visual C# 2005 Express by using menu Help->Register
  9. Close Microsoft Visual C# 2005 Express
  10. Install XNA Game Studio Express

Content Pipeline

มีหน้าที่ในการ import, compile และ load game asset ซึ่งได้แก่ textures, 3D models, shaders และ sounds

Content Pipeline ประกอบด้วย dll หลายตัว ดังนี้

  • Microsoft.Xna.Framework.Content.Pipeline.dll
    basic functions สำหรับ content pipeline
  • Microsoft.Xna.Framework.Content.Pipeline.EffectImporter.dll
    import และ compile shaders
  • Microsoft.Xna.Framework.Content.Pipeline.FBXImporter.dll
    import และ compile Filmbox (.fbx) 3D model รวมทั้ง skining และ bones
  • Microsoft.Xna.Framework.Content.Pipeline.TextureImporter.dll
    สำหรับ import texture files ในรูป DirectX format, .png, .jpg, .bmp และ .tga รวมทั้ง 2D sprites
  • Microsoft.Xna.Framework.Content.Pipeline.XImporter.dll
    สำหรับ mport และ compile .X 3D model

Dll เหล่านี้จะไม่ถูกใช้ในการ run เกม แต่จะใช้สำหรับ build และ compile เท่านั้น content ที่ได้จากการ compile จะอยู่ในรูป .xnb (XNA binary) ซึ่งทำให้การ distribute เกมทำได้สะดวก ไม่ต้องกังวลรูปแบบและความครบถ้วนของ content เนื่องจากทุกอย่างจะอยู่ใน .xnb ทั้งหมดและแปลงเป็นรูปแบบที่ใช้ได้แล้ว ดังนั้นเราจึงไม่ควรเปลี่ยนแปลง content ของ .xnb (ขณะนี้ยังไม่มี tools ที่จะเปลี่ยน .xnb เป็น resource ตั้งต้น) ไฟล์ .xnb นี้จะแตกต่างกันระหว่างเวอร์ชั่นของพีซี และ Xbox 360

แม้ว่าใน Windows เราจะสามารถเขียนโปรแกรมให้ใช้งาน content ต่างๆได้โดยตรง (เช่น load file .jpg ตรงๆ) แต่การเขียนเกมด้วย XNA นี้ควรใช้ content pipeline compile content เป็น .xnb แทนการใช้ content โดยตรงเพราะเกมที่ run ใน Xbox 360 จะ load ได้เฉพาะ content ใน .xbn เท่านั้น

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 ได้ในอนาคตด้วย