- ทุกเกมในโปรเจกต์ส่วนตัวถูกพัฒนาด้วย ‘C ล้วน’ ซึ่งถือเป็นทางเลือกที่พบได้ไม่บ่อยในปัจจุบัน
- เกณฑ์หลักในการเลือกภาษาคือ ความน่าเชื่อถือ ความสามารถในการพกพา และความยั่งยืนในระยะยาว โดยไม่ผูกติดกับ OS หรือแพลตฟอร์มใดแพลตฟอร์มหนึ่ง
- ให้ความสำคัญกับ ความเรียบง่ายและความเร็วในการคอมไพล์ รวมถึง การตรวจสอบชนิดข้อมูลอย่างเข้มงวดและระบบคำเตือนที่ทรงพลัง
- ได้พิจารณาภาษาทางเลือกอย่าง C++·C#·Java·Go·Haxe เป็นต้น แต่ตัดสินว่าไม่เหมาะสมเพราะความซับซ้อน, GC, การบังคับใช้ OOP เป็นต้น
- C เป็นภาษา ที่อันตรายแต่เรียบง่ายและรวดเร็ว และยังคงเป็นตัวเลือกที่ดีที่สุดด้วยการรองรับแพลตฟอร์มอย่างกว้างขวางและระบบนิเวศของไลบรารีที่แข็งแกร่ง
เกณฑ์ในการเลือกภาษา
- เงื่อนไขสำคัญที่สุดคือ ความน่าเชื่อถือและเสถียรภาพ เพื่อไม่ให้ต้องเสียเวลากับบั๊กที่ตัวเองไม่ได้สร้าง
- ในอดีตเคยพัฒนาเกมบน Flash แต่เมื่อ Flash เสื่อมความนิยมลง จึงอยาก มุ่งไปที่การสร้างเกมใหม่ แทนการพอร์ตไปยังแพลตฟอร์มใหม่
- ให้ความสำคัญกับ ความสามารถในการพกพาและการรองรับไลบรารีทั่วไป เพื่อไม่ให้ผูกกับ OS เฉพาะ และเพื่อเปิดโอกาสสำหรับ การพัฒนาลงคอนโซล
- เงื่อนไขที่พึงประสงค์คือ ไวยากรณ์ที่เรียบง่ายและโครงสร้างที่จำง่าย
- ต้องการหลีกเลี่ยงการคอยเปิดค้นหา API หรือฟีเจอร์ของภาษาที่ซับซ้อนอยู่เรื่อย ๆ
- ต้องการลดบั๊กด้วย การตรวจสอบชนิดข้อมูลอย่างเข้มงวด คำเตือนที่ทรงพลัง และการวิเคราะห์แบบสแตติก และต้องการค้นหาปัญหาได้ง่ายด้วย ดีบักเกอร์ที่ดีและเครื่องมือวิเคราะห์แบบไดนามิก
- ให้ความสำคัญกับ ความเร็วในการคอมไพล์ อย่างมาก
- เวลารอที่ยาวนานทำให้เสียสมาธิและลดประสิทธิภาพการทำงาน
- มอง การเขียนโปรแกรมเชิงวัตถุ (OOP) อย่างกังขา และชอบแนวทางที่แยกข้อมูลกับโค้ดออกจากกันแล้วจัดการให้เหมาะกับสถานการณ์
การประเมินภาษาทางเลือกหลัก
- C++
- แม้ยังเป็นมาตรฐานในวงการพัฒนาเกม แต่ไม่พอใจกับ ความซับซ้อนและความเร็วในการคอมไพล์ที่ช้า
- แม้จะให้ประสิทธิภาพสูงและมีฟีเจอร์หลากหลาย แต่ก็มีฟีเจอร์จำนวนมากที่ไม่ต้องการ และต้นทุนด้านความซับซ้อนก็สูง
- C# และ Java
- ยืดยาวและซับซ้อน และด้วยโครงสร้างที่เน้น OOP อย่างหนักทำให้มีอิสระน้อย
- แม้คุณลักษณะของภาษาระดับสูงจะซ่อนความซับซ้อนไว้ แต่ก็ไม่ได้ป้องกันปัญหาพื้นฐาน
- Go
- มองในแง่บวกว่าเป็นการตีความ C ใหม่ในแบบสมัยใหม่ แต่ stop-the-world garbage collection ไม่เหมาะกับการพัฒนาเกม
- มีข้อกังวลทั้งเรื่องการขาดแคลนไลบรารีสำหรับเกมและความยั่งยืนในระยะยาว
- JavaScript
- การเปลี่ยนแปลงอย่างรวดเร็วของสภาพแวดล้อมการพัฒนาเว็บและการสิ้นสุดของ Flash ทำให้รู้สึกว่าไม่เสถียร
- ตัดสินว่า ไวยากรณ์ที่หลวม ไม่เหมาะกับการเขียนซอฟต์แวร์ขนาดใหญ่
- Haxe
- มองว่าน่าสนใจเมื่อใช้พัฒนาเว็บ แต่มีความกังวลเรื่องความยั่งยืนเพราะเป็น ภาษาที่ค่อนข้างใหม่
- การพัฒนาภาษาของตัวเอง
- เป็นแนวคิดที่น่าสนใจ แต่ตัดสินว่าไม่สมจริงเพราะ ต้องทิ้งไลบรารีเดิมและมีภาระในการรักษาความเข้ากันได้
เหตุผลที่เลือก C
- เป็นภาษา ที่อันตรายแต่เชื่อถือได้ และด้วยโครงสร้างที่เรียบง่าย หากใช้อย่างระมัดระวังก็มีความเสถียร
- เปรียบเหมือน “มีดที่คมมาก” โดยเน้นว่าแม้จะใช้งานยาก แต่หากเชี่ยวชาญแล้วก็เป็นเครื่องมือที่ทรงพลัง
- คอมไพล์ได้เร็วมาก และสามารถรันได้บนแทบทุกแพลตฟอร์ม
- กระบวนการพอร์ตก็ค่อนข้างง่าย และในระยะยาวก็มีแนวโน้มที่จะยั่งยืนสูง
- การรองรับไลบรารีและทูลลิงแข็งแกร่ง และยังได้รับการดูแลอย่างต่อเนื่อง
- โดยส่วนตัวมีประสบการณ์กับโค้ด ‘C ล้วน’ มาแล้วมาก จึงคุ้นเคย
- ไม่ได้แนะนำให้คนอื่นใช้ C และมองว่านี่คือ ทางเลือกที่เหมาะกับรสนิยมส่วนตัวและวิธีการทำงานของตนเองที่สุด
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ปกติฉันเขียนโค้ดแบบ สไตล์ C เป็นหลัก แต่จะใช้ฟีเจอร์ของ C++ เฉพาะเวลาจำเป็นเท่านั้น
เพราะงั้นถ้ามองผ่าน ๆ บางทีก็ดูเหมือนโค้ด Rust
คนที่บอกว่าเขียนเกมด้วย C มักจะไม่ชอบฟีเจอร์ของ C++ แต่สุดท้ายก็ลงมือทำ virtual interface เอง หรือสร้าง switch ก้อนมหึมาเพื่อทำเรื่องคล้าย ๆ กัน
ถ้าไม่อยากใช้ฟีเจอร์ที่ภาษาให้มาก็แค่ไม่ต้องใช้ แต่การบ่นว่ามันมีอยู่ตั้งแต่แรกผมว่าก็ไม่ค่อยมีความหมาย
C++ ไม่ได้คอมไพล์ช้าถ้าไม่ใช้ template แบบเกินเหตุ
เมื่อเวลาผ่านไป สมาชิกทีมเปลี่ยน หัวหน้าทีมเปลี่ยน ชุดของฟีเจอร์ ที่ถูกใช้งานก็จะค่อย ๆ ขยายใหญ่ขึ้น
และพอฟีเจอร์เพิ่มไปแล้ว การลดมันกลับลงมานั้นยากมาก
อีกอย่าง คุณอาจจำเป็นต้องใช้ ไลบรารี ที่ใช้ฟีเจอร์ซึ่งคุณไม่ต้องการ
ยกตัวอย่าง ผมไม่ชอบการเรียกแบบแฝง (destructor, operator overloading ฯลฯ) แต่ถ้าไลบรารีใช้มัน สุดท้ายก็ต้องตามน้ำ
หนึ่งในสิ่งที่แย่ที่สุดของ C++ คือมันมี โค้ดที่ซ่อนอยู่ ซึ่งถูกสร้างขึ้นอัตโนมัติเยอะเกินไป
ต่อให้โค้ดส่วนใหญ่จัดการกับ concrete type (Goose, Duck ฯลฯ) ทุกอ็อบเจ็กต์ก็ยังต้องพกตัวชี้ vtable ไปด้วย
ขณะที่ Rust จะใช้ vtable เฉพาะจุดที่จำเป็น จึงประหยัดหน่วยความจำกว่า
โปรแกรมเมอร์ C จะลงมือทำเฉพาะฟังก์ชันที่ต้องใช้เอง จึงไม่ถูกผูกไว้กับโครงสร้างที่ภาษาบังคับมากนัก
แค่ include
<vector>ก็ลากโค้ดเข้ามาเป็นหมื่นบรรทัดแล้วเพราะงั้นถ้าไม่ใช้ standard library ก็จะมีการเถียงกันว่า “ทำไมต้องประดิษฐ์วงล้อใหม่”
พอถกแบบนี้ซ้ำ ๆ ก็รู้สึกว่า กลับไปใช้ C ง่ายกว่าเยอะ
ผมเองก็ย้ายไปใช้ C ราวปี 2017 และจนถึงตอนนี้ทุกครั้งที่ต้องใช้ไลบรารี C++ ก็ยังรู้สึกล้า
มีข้อยกเว้นคือ Dear ImGui ที่โอเค แต่ถึงอย่างนั้นผมก็ยังชอบ C binding มากกว่า
พอเปลี่ยนนามสกุลเป็น .c เวลาคอมไพล์ก็ลดลงครึ่งหนึ่ง
ฉันชอบ ความหยาบและความเรียบง่าย ของ C แต่ไม่ชอบ preprocessor
เพราะงั้น Zig เลยเหมือนของขวัญจากพระเจ้า — มันเรียบง่ายกว่า C และมี การออกแบบภาษา ที่แม่นยำกว่า
ตัวอย่างเช่น Zig แยก single pointer ออกจาก array pointer
มันสามารถ import ไลบรารี C และทำให้ใช้งานง่ายขึ้นได้ ซึ่งมีประโยชน์มากในงานพัฒนาเกม
ไลบรารี C++ ส่วนใหญ่ก็มี C header ให้มาด้วย
ใน zig-gamedev มี ไลบรารี C ที่ถูกทำให้เป็นสไตล์ Zig แบบนี้อยู่เยอะ
แทนที่จะใช้ preprocessor ฟีเจอร์ comptime ของ Zig ดีกว่ามาก และมันก็เป็นแค่ “โค้ด Zig ที่รันตอนคอมไพล์” เท่านั้น
ฉันก็เห็นด้วยกับผู้เขียน
เหตุผลใหญ่ที่สุดที่ทำให้ชอบภาษาสักภาษาคือ ความเรียบง่าย
เพราะงั้นฉันเลยชอบภาษาอย่าง C, Go, Odin, Zig
แต่ภาษาที่จัดการกับ ความซับซ้อนที่จำเป็น ได้อย่างสง่างามก็สำคัญเหมือนกัน
ในโค้ดเครือข่ายที่ต้องการ memory safety, concurrency และ functional pattern นั้น Rust ดูเป็นธรรมชาติ
ในทางกลับกัน สำหรับโค้ดที่เรียบง่ายและเร็วอย่างเกมอินดี้ C หรือ Odin จะเหมาะกว่า
Odin ให้ความรู้สึกเหมือนรวมความเรียบง่ายของ Go เข้ากับประสิทธิภาพของ C เลยแนะนำได้
และยังทำเกมด้วย Raylib ได้ง่ายด้วย
เลยสงสัยว่าคุณคิดว่า Odin เหมาะกับตำแหน่งนั้นมากกว่า Zig หรือเปล่า
ในต้นฉบับบอกว่าการรองรับไลบรารีเกมของ Go ยังไม่ดี แต่ดูเหมือนนั่นจะเป็น บทความราวปี 2015
ตอนนี้สถานการณ์อาจเปลี่ยนไปแล้วก็ได้
และยังดูภาพหน้าจอของเกมที่ทำไว้ตอนนั้นได้ด้วย
ตัวอย่างเช่น Knossu มีสไตล์ 3D ที่โดดเด่นดี
การทำเกมด้วย C ในปี 2026 อาจจะดู บ้าหน่อย ๆ แต่ฉันก็ทำอยู่เหมือนกัน
เช่น Chrysalis ก็พัฒนาด้วย C (ใช้ GLFW3, FMOD)
มันอยู่บนพื้นฐาน idTech3 และระบบต่อสู้ละเอียดมากจนการเปลี่ยนเล็กน้อยก็ทำให้สมดุลทั้งเกมพังได้
ต่อให้เพิ่ม
i++แค่ตัวเดียว จังหวะเวลาก็เปลี่ยนแล้วเพราะงั้นเลยยังใช้คอมไพเลอร์อายุ 22 ปีตัวเดิมอยู่
ถึงจะมีฟอร์กที่ทำให้ทันสมัยขึ้น แต่ความรู้สึกดั้งเดิมมันหายไป
idTech3 เป็นเอนจินที่แสดง แก่นแท้ของ C ได้ดีจริง ๆ
มีเกมนับพันเกมที่เขียนด้วย C และ graphics API อย่าง OpenGL, Vulkan, DX ก็ล้วนมีพื้นฐานเป็น C
เพราะงั้นมันไม่ได้แปลกอะไรเลย
เอนจินเกมส่วนใหญ่ก็เขียนด้วย C/C++
ฝั่งคอนโซลก็แตกต่างกันไปในแต่ละยุค
ต่างจากการเขียนโปรแกรมบนลินุกซ์ งานพัฒนาเกมนั้นมี C++ เป็นศูนย์กลางมานานกว่า 30 ปีแล้ว
โดยพื้นฐานแล้วฉันเป็น คนที่รัก C
ใช้มันมาได้ดีหลายสิบปี แต่พอต้องดูแลโค้ด C กันเป็นทีม ความเจ็บปวดมันจะมากขึ้น
อีกทั้งความเร็วในการพัฒนาก็ช้ากว่าภาษาสมัยใหม่
ถึงอย่างนั้นเสน่ห์ของความเรียบง่ายก็ยังอยู่
จากประสบการณ์ของฉัน C เจ็บปวดน้อยกว่า C++ เสียอีก
ข้อเท็จจริงนี้ทำให้ข้อจำกัดด้านการทำงานร่วมกันของ C ดูอ่อนลง
คำพูดว่า “ไม่มีใครทำเกมด้วย C แล้ว” นั้นเกินจริง
ตอนนี้อาจไม่ใช่กระแสหลัก แต่ก็ยังมีคนจำนวนมากทำเกมด้วย C อยู่
คุณก็แค่เป็นข้อยกเว้น และประโยคนั้นก็ยังถือว่าถูกในเชิงสถิติ
ฉันชอบ C
ฉันควบคุม การจัดการหน่วยความจำ ได้ทั้งหมด และได้พฤติกรรมที่คาดเดาได้
มันมีประโยชน์มากโดยเฉพาะในสภาพแวดล้อมที่ต้องการการจัดสรรล่วงหน้าแบบกฎ MISRA
มันยังเหมาะกับการจัดการ exception หรือ error ในระดับฮาร์ดแวร์โดยตรง
และก็เขียน unit test ได้ง่ายด้วย
C เข้าถึงได้ง่าย แต่ ความรู้เรื่องการจัดการหน่วยความจำ เป็นสิ่งจำเป็น
ตอนที่ฉันเป็นนักพัฒนา Java แล้วต้องรีบทำคอนเน็กเตอร์จากสิ่งที่มีให้แค่ .h กับ .so ฉันเลือก C แทน C++
ถ้า C คือมีดคม ๆ สักเล่ม C++ ก็เหมือน เสามีดหมุน — เผลอเมื่อไรก็เจ็บ
แต่เรื่องจัดการสตริงใน C นั้นทรมานเกินไป จนอยากยืมระบบสตริงของ C++ มาใช้