แจ้งย้ายจากบล็อกไปเป็นเว็บ 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 เท่านั้น