เหตุใด C / C ++ จึงเป็นที่ต้องการสำหรับนักพัฒนาเกม


14

บางคนบอกว่ามันให้การควบคุมแก่นักพัฒนามากขึ้น แต่มันคืออะไรที่แม่นยำที่สามารถควบคุมผ่าน C ++ ซึ่งไม่สามารถควบคุมได้โดยใช้ตัวอย่างเช่น Java?

คำตอบ:


21

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

Java เป็นภาษาที่รวบรวมขยะ คุณไม่มีการควบคุมโดยตรงกับหน่วยความจำของคุณ คุณสามารถจัดสรรชิ้นส่วนของหน่วยความจำใหม่ แต่คุณไม่สามารถควบคุมได้ (ดี) เมื่อมันถูกลบ ตัวรวบรวมขยะจะตรวจสอบหน่วยความจำทุกชิ้นที่คุณจัดสรรทุกเฟรม x และกำหนดว่ามันเป็นขยะหรือยังถูกใช้อยู่

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

ประการที่สองห้องสมุดที่เราใช้ส่วนใหญ่เขียนด้วยภาษา C หรือเขียนด้วยภาษา C ++ ฉันกำลังพูดถึง Scaleform, Havok physics engine, PhysX, SpeedTree และอื่น ๆ แพ็คเกจมืออาชีพทั้งหมดที่ใช้กันอย่างแพร่หลายในอุตสาหกรรม หากภาษาอื่นต้องการที่จะเป็นราชามันจะสนับสนุนพวกเขาได้ดีกว่า

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

ฉันไม่ได้พูดว่า: อย่าใช้จาวา ฉันกำลังพูดว่า: คิดว่าทำไมคุณถึงใช้ Java Minecraft นั้นสร้างขึ้นใน Java ดังนั้นจึงเป็นไปได้ที่จะสร้างเกมใน Java แต่มันจะเป็นเกมที่ดีกว่านี้สร้างขึ้นใน C ++ หรือไม่? แน่นอนว่ามันไม่ถูกเลยที่จะให้มันทำงานบนสามใหญ่ (Windows, MacOS, Linux) แต่ถึงกระนั้นก็พบข้อผิดพลาดเฉพาะแพลตฟอร์มจำนวนมากในการพัฒนาข้อบกพร่องที่ Java ไม่ราบรื่น เกิน.

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


1
เพียง nitpick แต่ภายใต้สภาพแวดล้อมการทำงานส่วนใหญ่โค้ดเนมจะทำงานในเครื่องเสมือน Java ทำงานในเครื่องเสมือนภายในเครื่องเสมือน
Skyler Saleh

1
@RTS: มันเป็นการยืดเวลาในการโทรหา op -> micro-op แปลเครื่องเสมือนจริงถ้านั่นคือสิ่งที่คุณได้รับ

ไม่ฉันกำลังพูดถึงเครื่องเสมือนที่แอพพลิเคชั่นทั้งหมดนำมาใช้กับระบบปฏิบัติการที่ทันสมัยเพื่อให้สามารถทำงานมัลติทาสก์ได้อย่างปลอดภัย สิ่งนี้เกิดขึ้นบนระบบปฏิบัติการที่ทำงานบนสถาปัตยกรรมที่ไม่มี micro-ops (RISC) ซึ่งรวมถึงหน่วยความจำเสมือนการขัดจังหวะซอฟต์แวร์ระบบสำหรับการเข้าถึงฮาร์ดแวร์ที่เกิดขึ้นพร้อมกันตัวกำหนดตารางเวลาระบบปฏิบัติการและการจัดการไฟล์ลงทะเบียน
Skyler Saleh

@RTS ฉันไม่แน่ใจว่าการแยกงานมีคุณสมบัติเหมาะสมกับ VM จริงๆ มันเป็น RM (Real Machine) ที่มีการป้องกันในตัวไม่มีเลเยอร์ abstraction คำแนะนำที่ชัดเจนระหว่างการเรียกใช้ / exec คอมไพเลอร์และลิงเกอร์สร้างโค้ดที่เปลี่ยนตำแหน่งได้ตามความต้องการ ซีพียูให้การสนับสนุนฮาร์ดแวร์สำหรับสิ่งนี้มาก - ซึ่งลบแง่มุม "เสมือน"
3

2

คำตอบสั้น ๆ : คอมไพล์ C ++ กับรหัสเนทีฟดังนั้นประสิทธิภาพจึงขึ้นอยู่กับนักพัฒนาไม่ใช่รันไทม์หรือ VM

คำตอบยาว:

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

ย้อนกลับไปในวันนี้คุณสามารถใช้ C, C ++, BASIC / 2, Delphi และอื่น ๆ และรับโปรแกรมที่มีประสิทธิภาพและอิสระ การเลือกใช้ภาษาเป็นเรื่องของความชอบส่วนตัวและกลไกตลาด

ทุกวันนี้การสันนิษฐานว่า "C ++ เร็วกว่า" นั้นเป็นคำทำนายการตอบสนองด้วยตนเองเป็นหลักแม้ว่า LLVM จะอยู่ในตำแหน่งที่ดีที่จะเปลี่ยนว่าเมื่อใดก็ตามที่มันเข้าสู่การแยกวิเคราะห์

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

Java มีโครงสร้างในลักษณะที่มันจะเป็นเรื่องยากมากที่จะใช้โดยไม่ต้อง JVM พอผิดปกติ C # ทั่วไปและไม่ถูกต้องถือว่าเทียบเท่ากับ Java อย่างคร่าว ๆ แล้วรวบรวมรหัสพื้นเมืองบนแพลตฟอร์มต่าง ๆ รวมถึง iOS

ด้านบนของรายการคริสมาสต์ของฉัน? ไทม์แมชชีนที่จะย้อนกลับและเพิ่มคุณสมบัติการจัดการข้อยกเว้นที่แท้จริงและ polymorphism การทำงานจริงไปยัง C ++ และกำจัด crap ลูกศรไวยากรณ์ f "d up up ที่ parser สามารถหาได้ด้วยตัวเองฉันเขียน preprocessor เป็นเวลา 10 ปี ที่ผ่านมาเพราะมันบ้าโง่


คุณหมายถึงการเข้าถึงสมาชิกทางอ้อม (เหมือนใน h-> x) หรือไม่ การลบที่จะทำให้การจัดการและตัวชี้ชนิดสมาร์ทมีประโยชน์น้อยลง หากคุณยืนยันที่จะเปลี่ยนเพียงเพื่อตัวชี้ดิบคุณก็ทำให้ภาษาไม่สอดคล้องกัน
Lars Viklund

1
อะไรไม่ทำงานเกี่ยวกับความหลากหลายของ C ++
Casey

@ LarsViklund ใช่นั่นคือสิ่งที่ฉันหมายถึง แต่ในขณะที่ที่อยู่การอ้างอิงและตัวดำเนินการสมาชิก (&, *, ::, -> ... ) ล้วนแล้วแต่มีความหมายต่างกัน แต่ส่วนใหญ่แล้วเป็นไปได้ที่จะสรุปผลลัพธ์ที่ได้จากบริบท สิ่งต่าง ๆ อาจถูกทำให้เรียบง่ายขึ้นเช่นเดียวกับที่ทำในภาษาอื่น จุดผสานเล็กน้อย แต่เป็นจุดที่มีศักยภาพในการเพิ่มความซับซ้อนของรหัส (และเวลาและค่าใช้จ่าย dev)
3ave
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.