มันสมเหตุสมผลที่จะเขียนเอ็นจิ้นเกมใน C หรือไม่? [ปิด]


53

แม้ว่า C ++ จะดูเป็นราชา แต่สิ่งที่ฉันได้รับการบอกว่า C ยังคงใช้กันอย่างแพร่หลายในเกมโดยเฉพาะบนคอนโซล อย่างไรก็ตามการเขียนโปรแกรมเกมทั้งหมดใน C จะไม่มีเหตุผลในวันนี้? ถ้ามีจะมีข้อได้เปรียบอะไรบ้างที่ C มีมากกว่า C ++? ทำไมบางคนอาจต้องการใช้ C ผ่าน C ++


1
เกมคอนโซลใช้ c ++ FYI!
Alan Wolfe

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

C ยังมีข้อได้เปรียบที่เพิ่มขึ้นของการพกพาอย่างกว้างขวางแม้กระทั่ง ABI ดังนั้นมันจึงค่อนข้างง่ายที่จะใช้รหัส C ที่มีอยู่ของคุณแล้วเริ่มใช้มันในภาษาอื่นจาก FFI C ++ ค่อนข้างอึดอัดมากกับชื่อ mangling, ไม่สามารถโยนข้ามขอบเขตของโมดูลได้, vtable reps ไม่เหมือนกันในคอมไพเลอร์, การใช้ไลบรารี่มาตรฐานที่แตกต่างกันระหว่างผู้ขาย ฯลฯ โดยทั่วไปฉันพบว่าไลบรารี C ที่ฉันเขียนนั้นใช้เวลานาน ออกไปข้างนอกอย่างมีสไตล์แม้ว่ามันจะใช้เวลานานกว่าในการเขียนสิ่งต่าง ๆ ด้วย

คำตอบ:


49

อย่างไรก็ตามการเขียนโปรแกรมเกมทั้งหมดใน C จะไม่มีเหตุผลในวันนี้?

มันสมเหตุสมผล แต่คำถามคือคุณซื้ออะไร คุณอาจไม่ต้องการความสะดวกในการพกพา C และมันเป็นความอัปยศที่ให้คุณสมบัติทั้งหมดของ C ++ ข้อเสนอเว้นแต่คุณจะตั้งหลักปรัชญาให้ต่อต้านมัน

หากมีข้อได้เปรียบอะไรบ้างที่ C มีมากกว่า C ++?

เวลารวบรวมที่ดีขึ้น?

ทำไมบางคนอาจต้องการใช้ C ผ่าน C ++

ฉันคิดว่ามันเป็นตัวเลือกที่สวยงาม หลายคนชอบ C เพราะเรียบง่ายและเรียบง่ายน้อยและรู้สึกสะอาด C ++ มีคุณสมบัติที่ดีมากมาย (เพียงอย่างเดียวเนมสเปซทำให้คุ้มค่ากับการใช้) แต่ก็ใหญ่และยุ่งเหยิง


3
จนถึง Id Tech 4
แว่นตา

9
@Josh: ง่ายต่อการตรวจแก้จุดบกพร่อง! โปรแกรม C นั้นยากที่จะทำการดีบักซึ่งส่วนใหญ่มาจากตัวชี้และการจัดการหน่วยความจำ โปรแกรม C ++ (เมื่อใช้สำนวนการเขียนโปรแกรม C ++ ที่แท้จริงซึ่งมีแนวโน้มที่จะหลีกเลี่ยงพอยน์เตอร์และการจัดการหน่วยความจำเมื่อใดก็ตามที่ทำได้)เป็นคำสั่งที่มีขนาดที่ง่ายต่อการดีบัก
BlueRaja - Danny Pflughoeft

14
C สามารถเข้าใจได้โดยมนุษย์ปุถุชน C ++ ดูเหมือนว่าจะมีคุณสมบัติมากมายและโปรแกรมเมอร์ที่มีประสบการณ์มาหลายปีเรียนรู้แม้กระทั่งหลังจากใช้มาสิบปีในชีวิตประจำวัน
Jari Komppa

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

2
@ BlueRaja-DannyPflughoeft #define malloc(x) my_malloc(x) #define free(x) my_free(x)และตอนนี้คุณกำลังดีบักหน่วยความจำ ด้วย C ++ คุณจะไม่มีทางรู้ว่าจะจัดสรรเมื่อไหร่เพราะมีหลายวิธีในการจัดสรรหน่วยความจำ (ใหม่, malloc, ตัวสร้างคลาส ฯลฯ )
YoYoYonnY

59

ฉันได้ทำงานอย่างกว้างขวางกับเอ็นจิ้นเกมบริสุทธิ์ C ที่ส่งมอบผลิตภัณฑ์จำนวนมากดังนั้นจึงเป็นไปได้อย่างแน่นอน นี่คือประสบการณ์ส่วนตัวของฉันในการทำงานกับทั้งเครื่องยนต์ C และ C ++:

  1. การใช้โครงสร้าง pure-C ช่วยให้คุณสามารถใช้ประโยชน์จากความรู้เกี่ยวกับการจัดตำแหน่งของโครงสร้างและจากนั้นคุณสามารถใช้ข้อมูลนี้เพื่อสร้างการคงอยู่ของวัตถุและเลเยอร์อนุกรม เอ็นจิ้นที่ฉันทำงานด้วยมีตัวแยกส่วนหัวแบบง่าย ๆ ที่จะสร้างเมทาดาทานี้โดยอัตโนมัติเกี่ยวกับโครงสร้างและทำให้การดำเนินการข้อมูลบางประเภทไม่สำคัญ การแยกไฟล์ส่วนหัว C ++ ตามอำเภอใจนั้นเป็นไปไม่ได้เป็นหลักและทันทีที่คุณเพิ่มการสืบทอดและฟังก์ชั่นเสมือนคุณจะสูญเสียความสามารถในการรู้ว่าสิ่งที่อยู่ในหน่วยความจำ
  2. เวลาในการคอมไพล์สั้นลงอย่างมากเพราะคุณสามารถทำให้ไฟล์ส่วนหัวของคุณมีขนาดเล็กมากและใช้ประโยชน์จากการประกาศไปข้างหน้าของโครงสร้าง
  3. การดีบักสามารถปรับปรุงได้เนื่องจากไม่มีการใช้เทมเพลตและการสืบทอดมันง่ายมากที่จะคิดออกว่าวัตถุบางอย่างคืออะไรและทำอะไรอยู่

ประโยชน์ทั้งหมดเหล่านี้สามารถทำได้โดยการใช้รหัส c ++ ที่ควบคุมไม่ให้ใช้เทมเพลตและการสืบทอดบนออบเจ็กต์ต่อเนื่อง แต่เป็นการตัดสินใจของ CTO ที่จะบังคับใช้ความเรียบง่ายได้ง่ายขึ้นหากองค์ประกอบที่สับสนมากขึ้นของ C ++ ไม่ ใช้ได้

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


5
ไม่มีอะไรที่จะหยุดยั้งคุณนำมรดกมาใช้ในซีและถ้าคุณใช้ C99 คุณสามารถประกาศตัวแปรในลูปได้
jsimmons

15
การไม่เห็นด้วยกับข้อที่ 3 เป็นเรื่องง่ายที่จะเขียนโค้ดยุ่ง ๆ ที่ยากต่อการดีบักใน C เหมือนกับใน C ++ การดีบักที่ดีกว่าไม่ใช่สิ่งที่มีอยู่ในภาษา C
Dan Olson

7
แม้กระทั่งโค้ดที่สะอาดอาจเข้าใจได้ยากกว่าใน C ++ ด้วยการโอเวอร์โหลดเทมเพลตฟังก์ชันเสมือนและข้อยกเว้นทำให้มองเห็นได้ยากยิ่งขึ้นว่ากระแสการควบคุมที่แท้จริงจะเป็นอย่างไร
Kylotan

6
@Dan: เพียงแค่มีเนื้อหาเพิ่มเติม C ++ ก็ยากที่จะทำการแก้ไข แน่นอนคุณสามารถ จำกัด ตัวเองจากการใช้สิ่งใด ๆ ซึ่งในกรณีนี้มันง่ายที่จะทำการดีบั๊กเป็น C - เพราะมันกลายเป็น C

จริงๆแล้วสิ่งที่น้อยกว่านั้นเป็นเหตุผลที่ฉันชอบ C ตัวอย่างเช่นใน CI สามารถคัดลอกบิตและไบต์ด้วยmemcpyสิ่งใดก็ได้เพราะระบบประเภทไม่อนุญาตให้มีสิ่งต่าง ๆ เช่นคัดลอก cker และ dtors ฉันสามารถเขียนโค้ดได้เพราะรู้ว่าฉันจะไม่ต้องย้อนกลับผลข้างเคียงในเกือบทุกบรรทัดของโค้ดเพราะฉันไม่สามารถออกจากฟังก์ชันโดยปริยายได้เว้นแต่ว่าฉันจะส่งคืนอย่างชัดเจน ไม่มีข้อยกเว้นถูกโยน ทั้งหมดนี้ทำให้การเขียนโครงสร้างข้อมูลง่ายขึ้นมาก - ใน C ++ เพียงการเขียนตามมาตรฐานvectorนั้นใช้เวลานานโดยเฉพาะอย่างยิ่งถ้าคุณต้องการทำให้มัน ...

18

ฉันเขียนโปรแกรมเกม 2D ที่เขียนด้วย C ++ และ Lua เป็น C และ Lua จนถึงตอนนี้ประสบการณ์ก็ค่อนข้างดี เห็นได้ชัดว่าการดำเนินการเวกเตอร์และเมทริกซ์ไม่ได้จบลงอย่างสวยงามในซี แต่นอกเหนือจากนั้นฉันได้พบประสบการณ์ที่ค่อนข้างสดชื่นหลังจากใช้เวลากว่า 10 ปีในฐานะนักพัฒนา C ++

C มีข้อดีหลายประการบน C ++:

  1. คอมไพเลอร์จะทำให้แน่ใจว่าไม่มีการเรียกใช้รหัสในเวลาเริ่มต้นคงที่ ทำให้ปลอดภัยอย่างสมบูรณ์ในการจัดสรรข้อมูลส่วนกลางเช่นสตริงที่ใช้เป็นคีย์เช่น
  2. ความโปร่งใส ในการมอบหมาย C หรือการจัดสรรหรือการกำหนดตัวแปรจะไม่ทำให้เกิดการโหลดของรหัสที่จะทำงาน C ++ จะสร้างตัวสร้างสำเนาให้คุณโดยอัตโนมัติเพื่อให้คุณสามารถควบคุมสิ่งที่ถูกเรียกใช้งานได้น้อยลงเมื่อทำการมอบหมาย
  3. การดีบักจำนวนมากสามารถทำได้ง่ายกว่าเนื่องจากไม่ได้รับชื่อฟังก์ชันที่ยุ่งเหยิง
  4. โดยปกติแล้วมันก็โอเคที่จะใช้memcpyใน C แต่มันจะทำให้เกิดปัญหาใน C ++ ได้ง่ายเพราะตัวสร้างการคัดลอกจะไม่ทำงาน รับmemcpyนั้นเร็วกว่าstd :: copyที่สำคัญ

นอกจากนั้นยังมีข้อดีอีกหลายข้อในการคิดแบบ C ใน C ++ ฉันมักจะพบว่าตัวเองทำสิ่งต่าง ๆ สูงเกินไปและเป็นนามธรรม ใน CI มักจะตัดสิ่งต่าง ๆ เช่นวิธีการตั้งค่าและมักจะจัดสรรล่วงหน้าขนาดคงที่แทนที่จะใช้อาร์เรย์แบบไดนามิก บ่อยครั้งที่ฉันจบลงด้วยรหัสที่สั้นลงและง่ายขึ้นใน C โครงสร้างข้อมูลมักจะราบเรียบและดูง่ายขึ้นในตัวดีบัก

เพื่อความเป็นธรรมฉันจะไม่สร้างแอพเฉพาะใน C เหตุผลที่ใช้งานได้เพราะฉันรวมมันเข้ากับภาษาระดับสูงกว่าเช่น Lua ซึ่งสามารถเติมเต็ม C ได้ดีมากเพราะ C ไม่แข็งแรง

ซอฟต์แวร์ Id เขียนส่วนใหญ่ของเครื่องยนต์ของพวกเขาใน CI เชื่อว่าคุณสามารถดูReturn to castle Wolfensteinซึ่งเขียนด้วย C

ฉันเขียนเกี่ยวกับประสบการณ์บางอย่างของฉันเกี่ยวกับความยืดหยุ่นของ C vs C ++และdownsides ของเวกเตอร์ STL เมื่อเทียบกับอาร์เรย์ธรรมดา


11
FYI ในทุกอินสแตนซ์ที่ฉันตรวจสอบ (ซึ่งก็คือฉันคิดว่าดาร์วิน gcc และ vc2008) std :: copy จะรวบรวมการเรียกไปยัง memcpy หากทั้งสองประเภทเป็น POD
BRaffle

3
นอกจากนี้ RE: STL เวกเตอร์เทียบกับอาร์เรย์ธรรมดาทำไมไม่ใช้ส่วนที่ดีของเวกเตอร์และใช้พอยน์เตอร์ C ปกติแทนที่จะเป็นตัววนซ้ำถ้าคุณไม่ชอบ คุณสามารถทำได้ & myvector [N] มันเป็นสิ่งที่ดีที่สุดของโลกทั้งใบโดยสมมติว่ารหัส C ของคุณทำการจัดสรรหน่วยความจำแบบเดียวกัน หรือในลูปตรวจสอบ BOOST_FOREACH ทำให้ง่ายกว่า C.
BRaffle

1
ขอบคุณสำหรับเคล็ดลับเกี่ยวกับ std :: copy memcpy ฉันไม่รู้ เมื่อ Alexandrescu ปฏิบัติเช่นนี้เมื่อหลายปีก่อนมันไม่ได้เป็นเช่นนั้น เกี่ยวกับตัววนซ้ำ C ++ เป็นหลักเกี่ยวกับปรัชญาฉันพยายามเขียนโปรแกรมว่า C ++ หมายถึงการเขียนโปรแกรมเพื่อประโยชน์ของคนที่ฉันทำงานด้วยและเพื่อใช้ประโยชน์จากคุณสมบัติ C ++ มันถูกสร้างขึ้นมาเพื่อชี้ให้เห็นว่าการปรับปรุง C ++ บางอย่างเช่นคอนเทนเนอร์ STL นั้นไม่ได้ดีไปกว่าการใช้วิธี C แบบเดิมเสมอไป
Erik Engheim

7

ในฐานะที่เป็นคนอื่นชี้ให้เห็น C ++ นำข้อได้เปรียบของไหล่ขนาดใหญ่ที่คุณสามารถยืน (BOOST, STL ฯลฯ ) ในที่สุดมันเป็นตัวเลือกส่วนบุคคล แต่ฉันจะเลือก C ++ เพราะทรัพยากรที่มีอยู่ หากมีคุณสมบัติใน C ++ ที่คุณไม่ต้องการใช้ก็อย่าใช้มัน


1
โปรดทราบว่า 99% ของเอ็นจิ้นเกมในบ้านและเอ็นจิ้นในบ้านต้องอยู่ห่างจาก Boost และ STL ด้วยเหตุผลหลายประการ (รับประกันประสิทธิภาพความสามารถในการแก้จุดบกพร่องความปลอดภัยของเธรดการควบคุม)
Kaj

42
และ 99% ของสถิติถูกสร้างขึ้น
BRaffle

ฉันรู้สึกว่ามันควรจะเป็นกฎที่จะอ้างอิงสถิติทั้งหมด
Matt Jensen

3

ฉันไม่คิดว่าทุกคนใช้ C เฉพาะวันนี้มันมักผสมกับภาษาระดับสูงกว่า

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

ดังนั้นมันอาจนำมาซึ่งประโยชน์บางอย่างในการเขียนชิ้นส่วนที่มีประสิทธิภาพที่สำคัญของเกมในลักษณะคล้าย C มากกว่าในวิธี C ++ แบบดั้งเดิม ในช่วงไม่กี่ปีที่ผ่านมาฉันไม่เคยได้ยินใครเขียนเกมทั้งหมดใน C

ในบางแพลตฟอร์มเช่น iPhone ที่ใช้ C ++ สามารถเพิ่มขนาดปฏิบัติการของคุณด้วยกิโลไบต์ที่แน่นอน (ฉันลืมไปมากแค่ไหนขออภัย) ซึ่งเป็นเหตุผลว่าทำไมนักพัฒนา iPhone บางคนเลือกที่จะเขียนรหัสด้วย C และ Objective -C


3

ฉันจะให้เหตุผลเพิ่มเติมสองสามข้อกับคุณว่าทำไมการเขียนเอ็นจิ้นเกมใน C แทน C ++ ในวันนี้จึงไม่มีเหตุผลอันสมควร: STL และ BOOST

ฉันนึกภาพไม่ออกเลยว่ามันจะคุ้มค่าที่จะเขียนอีกครั้งlistเมื่อคุณสามารถใช้โค้ดที่ทำงานนอกกรอบได้ (และคุณไม่ต้องเขียน!)


1
สตูดิโอใหญ่ ๆ ใช้การเพิ่มหรือไม่ แม้การใช้งาน STL ยังอยู่ภายใต้การอภิปรายเนื่องจากการพกพา อย่างน้อยสำหรับเอ็นจิ้นคอนโซล
slicedlime

2
ส่วนตัวฉันใช้ Boost.FunctionTypes สำหรับการโต้ตอบ c ++ / lua (ดูgamedev.net/reference/programming/features/CPPLuaExport/ ...... ) และห้องสมุดเลขสุ่ม Boost สำหรับการสร้างเลขสุ่มสม่ำเสมอ (สำหรับระบบอนุภาค) นอกจากนี้ Boost.Foreach ก็เรียบร้อย BTW ใครจะสนใจถ้าสตูดิโอใหญ่ไม่ได้ใช้ BOOST พวกเขามีกำลังคนในการเขียนไลบรารี STL ของตัวเองตั้งแต่เริ่มต้นฉันไม่มี
Loris

1
ใช่ แต่ก็ตระหนักว่ามีห้องสมุดที่คล้ายกันสำหรับ C เช่นกัน
jsimmons

2
ฉันเชื่อว่าหลาย ๆ คนใช้การเพิ่มประสิทธิภาพในเกม แต่มันก็ยังห่างไกลจากข้อกำหนด (หรือเป็นที่ต้องการ) สำหรับพวกเราหลายคน
Dan Olson

6
คนสิ่งที่คุณเชื่อว่าจะไม่เกี่ยวข้อง: ทั้งคุณรู้หรือคุณไม่ทราบว่า
o0 '

3

การเขียนโปรแกรมเกมใน C นั้นสมเหตุสมผล มันรวดเร็วและสามารถนำไปใช้กับหลาย ๆ ระบบได้ ตัวอย่างเช่นคุณสามารถใช้สำหรับ Android (ด้วยการใช้ NDK) คุณสามารถใช้กับ iPhone (Objective c เป็นเพียงส่วนเสริมของ c) คุณสามารถใช้สำหรับและระบบปฏิบัติการหลักเช่น Linux, Mac หรือ Windows ถ้าคุณรู้สึกสะดวกสบายกับ c ฉันขอแนะนำให้คุณลอง!


2

แน่นอนว่ามันสมเหตุสมผล โดยส่วนตัวแล้วฉันจะไม่ทำมันและแฟน ๆ C ส่วนใหญ่ที่ฉันรู้จักก็แค่เขียนโค้ด C-like ในไฟล์. cpp แต่ภาษานั้นคล้ายกันมากพอที่จะไม่สำคัญ

สำหรับเหตุผลที่บางคนเลือกที่จะทำสิ่งนี้ฉันคิดว่ามันเป็นปรัชญาการต่อต้าน C ++ โดยส่วนตัวฉันยังไม่คิดว่านี่เป็นเหตุผลที่ดีในการเลือก C บน "C-style C ++" typedef struct ความบ้าคลั่งเป็นเหตุผลที่ดีพอที่จะหลีกเลี่ยง C และมีอีกหลายคน

น่าเสียดายที่ C และ C ++ เป็นภาษาที่แย่มากเมื่อเราลงไป นั่นเป็นเหตุผลหนึ่งที่ผู้คนพยายามเขียนโค้ดเป็นจำนวนมากในช่วงไม่กี่ปีที่ผ่านมา

หากคุณกำลังมองหาตัวอย่างของคนที่ทำงานใน C คุณสามารถเพิกเฉยต่อ id ในขณะที่ฉันจำได้ว่าพวกเขาได้ทิ้ง C นานมาแล้ว Cryptic Studios (Star Trek Online) พัฒนาเครื่องยนต์ทั้งหมดใน C เท่าที่ฉันสามารถบอกได้ใช่มันเป็นเพราะปรัชญามากกว่าเพราะความได้เปรียบที่จับต้องได้


0

ใช่และไม่. ใช่ฉันทำไปเมื่อไม่กี่ปีก่อน แต่ฉันต้องการให้เกมของฉันทำงานในแบบ 3 มิติบนยูนิกซ์ (ไม่ใช่ Linux) 64 บิตเซิร์ฟเวอร์ระยะไกลพร้อมผู้เล่นบนเทอร์มินัลโง่ มันไม่สำคัญเลย C เป็นสิ่งที่ดีคือคุณต้องการรวม LUA แต่ในที่สุดฉันก็มี lua เพื่อทำงานใน C ++ ดังนั้นฉันจึงบอกว่าใช่มันเป็นไปได้ แต่ไม่ได้ทำ


0

คำตอบที่ดีที่เป็นไปได้อาจเป็น "ใช้ทั้งคู่" หรือไม่

ดังที่ฉันได้ยินมาว่าโครงการ panda3d นั้นสามารถปรับให้เหมาะสมที่สุดได้การฆ่าคอขวดโดยใช้ cython หรือ recode ส่วนเหล่านั้น

ส่วนใหญ่เวลาที่จำเป็นต้องปรับให้เหมาะสมคือส่วนที่มีการวนซ้ำและซ้อนหรือมีการคำนวณเชิงตัวเลขจำนวนมากดังนั้นการเดาของฉันคือการใช้ภาษาทั้งสองโดยใช้ C สำหรับชิ้นส่วนที่มีการเขียนโปรแกรมระดับต่ำจำนวนมากดังนั้นคุณจึงไม่สามารถใช้ภาษา C ++ ในทางที่ผิดสำหรับส่วนที่ต้องการความเร็วและ C ++ สำหรับส่วนที่เหลือของเกม

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

แน่นอนว่าคุณไม่สามารถสร้างเอ็นจิ้นดังกล่าวที่เหมาะกับนักพัฒนาเกมทุกคนที่ต้องทำยกเว้นถ้าคุณอุทิศเอนจิ้นสำหรับเกมประเภทพิเศษ ...

แต่อย่าทำตามคำแนะนำของฉันเพราะฉันไม่ใช่นักพัฒนาเกมที่มีประสบการณ์หรือนักพัฒนาที่มีประสบการณ์ ... ฉันคิดว่า C บังคับให้คุณเขียนโค้ดอย่างรวดเร็วในขณะที่เขียนโค้ด C ++ ที่ดีและรวดเร็วสำหรับโปรเจ็กต์ใหญ่พอ ๆ กับเกม เป็นสิ่งที่แตกต่าง ...


0

C ทำงานให้กับJohn Carmackคุณอาจได้รับประโยชน์มากมายจากการใช้ C แต่ก่อนที่คุณจะไปถึงที่นั่นเพื่อรับประโยชน์จากสิ่งเหล่านี้อาจใช้เวลาสักครู่

ที่นี่คุณจะพบรายชื่อของเอ็นจิ้นเกมบางตัวเขียนด้วยภาษาซีบางทีคุณสามารถดูข้อมูลเชิงลึกเกี่ยวกับวิธีสร้างเอ็นจิ้นเกม C โดยผ่านซอร์สโค้ดของมัน


0

รหัส C ปกติรหัส C ++ ที่ถูกต้อง

ปัญหาหลักของ C ++ นั้นใช้อย่างไม่ถูกต้อง ( Linus Torvalds เกลียดมันด้วยเหตุผลนี้เขายังมีปัญหาอื่น ๆ เกี่ยวกับการพกพาของห้องสมุดและอื่น ๆ ด้วยเขาซื้อที่ทำงานในระดับระบบปฏิบัติการและต้องสามารถทำงานทุกอย่างแบบสุ่ม ชิปออกมี)

ตัวอย่างเช่นแทบจะไม่มีประโยชน์ที่จะใช้อาร์เรย์ cstyle [] บน c ++ std :: vector <> (หรือคอนเทนเนอร์ที่คล้ายกัน)

เวกเตอร์เป็นประเภทที่ปลอดภัยและสามารถตรวจสอบขอบเขตได้ (คุณสามารถเข้าถึงองค์ประกอบโดยใช้ get () หรือ [] แม้ว่าคุณจะไม่ได้ใช้วิธีการตรวจสอบอาร์เรย์คุณยังสามารถสืบค้นขนาดแทนที่จะซื้อด้วยตัวชี้)

แต่เวกเตอร์อาจช้าลงได้เช่นถ้าคุณไม่ประกาศขนาดเริ่มต้นในตัวสร้าง การเพิ่มสิ่งต่าง ๆ ลงในเวกเตอร์อาจทำให้การทำงานช้าลงหากจำเป็นต้องปรับขนาด C ++ 11 เพิ่มข้อดีมากมายเช่นการกำหนดค่าเริ่มต้นที่เหมือนกัน (ตอนนี้คุณสามารถประกาศและเตรียมใช้งานเวกเตอร์โดยใช้ไวยากรณ์เดียวกัน) และมีตัวสร้างการย้ายที่สามารถอนุญาตให้คุณหลีกเลี่ยงการคัดลอก คุณสามารถกำหนดค่าเริ่มต้นของคุณเอง (ถ้าคุณต้องการทำสิ่งอื่นนอกเหนือจากการใช้ malloc ด้วยเหตุผลบางอย่าง)

หรือแน่นอนว่าถ้าคุณต้องการปรับขนาดสิ่งต่าง ๆ เวกเตอร์ก็ยังง่ายต่อการทำคุณไม่ต้องยุ่งกับ malloc คัดลอกสิ่งต่าง ๆ ด้วยตนเอง

C ++ ให้โค้ดเชิงวัตถุแก่คุณ เมื่อรวบรวมมันจะมีประสิทธิภาพมากเพราะมันเป็นเพียงนามธรรมสำหรับคนที่ทำงานกับรหัส แม้ว่าสิ่งต่างๆเช่นคอนสตรัคเตอร์สามารถชะลอการสร้างวัตถุได้ แต่คุณจะต้องมีคอนสตรัคเตอร์เพื่อตั้งค่าเริ่มต้นหรือมิฉะนั้นคุณสามารถเริ่มต้นวัตถุโดยไม่ต้องใช้ตัวสร้าง (โดยไม่ต้องใส่เครื่องหมาย ())

แต่การวางแนวทางวัตถุทำให้เกมการเขียนโปรแกรมมากได้ง่ายขึ้น เกมมักจะจัดการกับวัตถุ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.