เหตุใด Java จึงไม่ใช้กันอย่างแพร่หลายในการพัฒนาเกม [ปิด]


77

ฉันไม่ได้เป็นผู้พัฒนาเกมหรืออะไร แต่ฉันรู้ว่า Java ไม่ได้ใช้กันอย่างแพร่หลายในการพัฒนาเกม Java ควรเร็วพอสำหรับเกมส่วนใหญ่แล้วเกมไหนที่จับได้? ฉันสามารถคิดด้วยเหตุผลบางอย่าง:

  • ไม่มีผู้พัฒนาเกมที่มีความเชี่ยวชาญใน Java
  • ขาดกรอบการพัฒนาเกมที่ดี
  • โปรแกรมเมอร์ไม่ต้องการยอมรับ Java เป็นภาษาการเขียนโปรแกรมเกม ส่วนใหญ่ยอมรับเฉพาะ C ++ เท่านั้น
  • ไม่รองรับเกมคอนโซล (แม้ว่าตลาดพีซียังคงมีอยู่)

แน่นอนมันอาจเป็นอย่างอื่น คนที่รู้จักธุรกิจดีกว่าฉันอธิบายได้หรือไม่ว่าทำไม Java ถึงไม่ได้รับแรงเมื่อพัฒนาเกม


37
และตอนนี้รอคำตอบ "Java ช้า, C ++ เร็ว" ทั้งหมดที่จริงเพียงสัมผัสพื้นผิวของปัญหาในทางที่กว้างและถูกต้องสมบูรณ์ โปรดระวังว่าคนที่ตอบแบบนี้แทบจะไม่ใช่นักพัฒนาเกมมืออาชีพ
Ed S.

20
ที่จริงแล้ว Java นั้นใช้สำหรับการพัฒนาเกม เช่นในตลาดมือถือ Java ME, Android
281377

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

14
ที่น่าสนใจคือ Minecraft นั้นใช้ Java
Uri

5
@Coder ดูเหมือนว่ารหัส C ++ ได้รับการปรับปรุงอย่างมาก แต่รหัส Java ไม่ได้ ดังนั้นจึงเป็นการเปรียบเทียบที่ไม่ถูกต้อง
Izkata

คำตอบ:


94

เหตุผลหลายประการ:

  • ในสมัยก่อนคุณจำเป็นต้องมี "การเข้าถึงโดยตรง" สำหรับประสิทธิภาพและ UI สิ่งนี้มาก่อนภาษา VM เช่น Java และ C #
  • คอนโซลส่วนใหญ่ (เช่น 360, PS3) ไม่มี JVM ดังนั้นคุณจึงไม่สามารถใช้รหัสซ้ำจากเวอร์ชั่นพีซีได้ มันง่ายกว่าในการคอมไพล์รหัส C ++ เพื่อรองรับอุปกรณ์ต่าง ๆ
  • เอ็นจิ้นเกมหลักส่วนใหญ่ (เช่น Unreal) มีการเชื่อม C ++ มีตัวเชื่อมต่อ Java บางตัว (เช่นสำหรับ OpenGL) แต่ไม่มีอะไรเหมือนมัน
  • สำหรับการเล่นเกมบนพีซี DirectX ไม่มีการสนับสนุน Java ที่แข็งแกร่ง (ถ้าเลย)
  • เกมบนเว็บทำงานใน JavaScript หรือ Flash คุณสามารถเขียนมันลงใน Java โดยใช้สิ่งต่าง ๆ เช่น GWT
  • iPhone ใช้งาน Objective-C รุ่นต่างๆ

Java ใช้เป็นหลักในเกม Android วันนี้เพียงเพราะเป็นภาษาหลักสำหรับแพลตฟอร์มนั้น


14
+1 "คอนโซลส่วนใหญ่ (เช่น 360, PS3) ไม่มี JVM ดังนั้นคุณจึงไม่สามารถใช้รหัสจากเวอร์ชั่น PC ได้อีกเป็นการง่ายกว่าที่จะรวบรวมรหัส C ++ เพื่อรองรับอุปกรณ์ต่าง ๆ " หากอุปกรณ์ไม่มีรันไทม์ คุณจะไม่เห็นเกมที่ได้รับการพัฒนาโดยใช้งานได้ในขณะนั้น Xbox 360 และ Windows phone มีการจัดการ. Net รันไทม์ดังนั้นการพัฒนาเกมโดยใช้พวกมันจึงเป็นไปได้และมีแนวโน้มเพิ่มขึ้น อย่างไรก็ตามเนื่องจากรันไทม์ไม่ได้อยู่ในแพลตฟอร์มที่สำคัญอื่น ๆ (PS3 และในระดับที่น้อยกว่ามาก Wii) จึงเป็นการยากที่จะพิสูจน์ว่ามีโค้ดเบสแยกกันอย่างสมบูรณ์ มันไม่ได้เป็นปัญหาประสิทธิภาพเลย
JustinC

2
มันเรียกว่า XNA ซึ่งปัจจุบันเป็นส่วนหนึ่งของกรอบงาน. Net 2.0 มีกรอบที่น่าสนใจอื่น ๆ ในป่า: MonoXNA, MonoTouch และ XnaTouch ท่ามกลางคนอื่น ๆ
JustinC

7
JVM ไม่สามารถคาดการณ์ประสิทธิภาพได้
Klaim

5
จุดที่ดีมาก อย่างไรก็ตามฉันต้องการเพิ่มข้อเท็จจริงที่ว่า GC สามารถทำให้หยุด / โหลดไม่แน่นอนได้ หากนี่ไม่ใช่ปัญหาสำหรับแอปเซิร์ฟเวอร์มันเป็นเกมแบบเรียลไทม์ นี่คือตัวอย่างที่มองเห็นได้ใน minecraft
deadalnix

2
@Klaim มันเป็นไปไม่ได้ด้วยmallocหรือnewดังนั้นถ้าเป็นเรื่องที่คุณกังวลที่จะนำมารวมกันไม่ว่าอะไรก็ตาม ไม่เกี่ยวข้องกับประเด็นดังกล่าวปัญหาใหญ่ของ Java คือไม่รองรับประเภทค่าเช่นเดียวกับ C #
Doval

80

เหตุผลทางเทคนิค:

  • เอ็นจิ้นเกม 3D ที่ดีที่สุดส่วนใหญ่เขียนด้วย C / C ++ นี่เป็นเรื่องใหญ่เนื่องจากผู้พัฒนาเกมส่วนใหญ่ไม่ต้องการประนีประนอมกับเอ็นจิ้น 3 มิติ แต่ไม่ต้องการเขียนตั้งแต่แรก Java มีjMonkeyEngineซึ่งเป็นโอเพ่นซอร์สและดีมากจริงแต่ก็ยังไม่สามารถแข่งขันกับUnreal Engineได้
  • สำหรับบางสถานการณ์ที่ไม่ค่อยพบบ่อยมีข้อดีในการรับ"ใกล้กับโลหะ"ในภาษา C หรือภาษาแอสเซมบลีโดยเฉพาะสำหรับการเข้าถึงคุณลักษณะฮาร์ดแวร์พิเศษ นี่ไม่ใช่สิ่งสำคัญในปัจจุบัน แต่นักพัฒนาเกมมืออาชีพยังคงต้องการตัวเลือก .....
  • Java มีการรวบรวมขยะรันไทม์ที่มีการจัดการ 99% ของเวลานี้เป็นข้อได้เปรียบอย่างมากมันทำให้การเขียนโค้ดง่ายขึ้นและมีข้อผิดพลาดน้อยลงและเป็นหนึ่งในเหตุผลสำคัญว่าทำไม Java จึงเป็นที่นิยม อย่างไรก็ตามมันทำให้เกิดปัญหาเวลาในการตอบสนองในการเล่นเกมเป็นครั้งคราวเนื่องจากรอบการรวบรวมขยะอาจทำให้เกิดการหยุดชั่วคราวที่สังเกตได้ สิ่งนี้กำลังมีปัญหาน้อยลงเมื่อใช้ JVMs ที่มีความหน่วงต่ำกว่ารุ่นใหม่ แต่ยังคงเป็นปัญหาสำหรับเกมที่เน้นกราฟิกซึ่งการรักษา FPS ที่สูงนั้นเป็นสิ่งสำคัญ

เหตุผลที่ไม่ใช่ด้านเทคนิค:

  • บ้านพัฒนาเกมมืออาชีพนั้นลงทุนอย่างหนักในทักษะ C / C ++ และเทคโนโลยี ทำให้เกิดความเฉื่อยจำนวนมาก
  • การรับรู้ที่ไม่มีเหตุผลส่วนใหญ่ที่ Java ช้า อาจเป็นจริงใน 90s ไม่เป็นความจริงในขณะนี้ - คุณสามารถเขียนเกม 3 มิติเชิงพาณิชย์ที่ทำกำไรได้กับ Java ( RunescapeทุกคนหรือMinecraft เป็นอย่างไร)
  • การรับรู้ที่ค่อนข้างยุติธรรมว่า Java มุ่งเน้นไปที่แอปพลิเคชันทางธุรกิจและเว็บมากกว่าการเล่นเกม สิ่งนี้อาจเปลี่ยนแปลงไปตามการเติบโตของอุปกรณ์พกพาและความต้องการในการพัฒนาข้ามแพลตฟอร์มมากขึ้น แต่ในปัจจุบันเป็นจริงอย่างแน่นอน

ที่น่าสนใจมีเหตุผลที่ดีที่ผู้พัฒนาเกมควรพิจารณา Java:

  • ความสามารถในการพกพา - เมื่อจำนวนแพลตฟอร์มเป้าหมายเพิ่มขึ้น Java ก็น่าสนใจยิ่งขึ้นเรื่อย ๆ เนื่องจากความสามารถในการสร้างไบนารีข้ามแพลตฟอร์มได้อย่างแท้จริง
  • ระบบนิเวศของห้องสมุด - ด้วยข้อยกเว้นที่สำคัญมากสำหรับเอ็นจิ้นเกมสามมิติ Java มีไลบรารีที่ดีที่สุดโดยรวมของแพลตฟอร์มใด ๆ เครือข่าย, เสียง, AI, การประมวลผลภาพ, ที่เก็บข้อมูลคีย์ / ค่าคุณตั้งชื่อหัวข้อและอาจมีไลบรารี Java แบบโอเพ่นซอร์สสำหรับมัน
  • การพัฒนาฝั่งเซิร์ฟเวอร์ - Java เป็นแพลตฟอร์ม / เซิร์ฟเวอร์ที่ยอดเยี่ยมมากและเนื่องจากมีหลายเกมที่รวมเอาผู้เล่นหลายคนไว้ด้วยกันฝั่งเซิร์ฟเวอร์จะมีความสำคัญมากขึ้นเรื่อย ๆ Java บน Linux ดูน่าสนใจทีเดียวที่นี่เป็นแพลตฟอร์ม
  • JVM - น่าจะเป็นสภาพแวดล้อมการปฏิบัติการ VM แบบวิศวกรรมที่ดีที่สุดในโลกด้วยการรวบรวมขยะที่ยอดเยี่ยมคอมไพเลอร์ JIT การสนับสนุนการทำงานพร้อมกันเป็นต้นมันจะดีขึ้นเรื่อย ๆ และเมื่อนักพัฒนาเกมเริ่มใช้ภาษาไดนามิกภายในเกมที่พวกเขาต้องการ สภาพแวดล้อมรันไทม์ที่ดีที่สุดที่เป็นไปได้
  • ภาษา JVM อื่น ๆ - Java เป็นสิ่งที่น่าเชื่อถือ แต่นวัตกรรมที่แท้จริงนั้นเกิดขึ้นกับ JVM langauges ใหม่ (Scala, Clojure โดยเฉพาะ) ภาษาเหล่านี้ได้รับประโยชน์ทั้งหมดของแพลตฟอร์ม Java / JVM รวมถึงภาษาที่ทันสมัยและทรงพลังอย่างยิ่ง

19
ไม่ความสามารถในการคัดค้านไม่ดีกว่าใน Java ในโลกวิดีโอเกม คอนโซลส่วนใหญ่ไม่มี JVM สำหรับเหตุผลเรื่องความสะดวกในการพกพา C ++ ต้องการจาวาในโลกของวิดีโอเกม
deadalnix

5
ทำไมระบบนิเวศของห้องสมุดจึงเป็นโบนัสสำหรับ Java? ระบบเครือข่ายเสียงคู่ค่าคีย์ - นั่นไม่ใช่สิ่ง ที่ใช้ได้ทุกที่ในปัจจุบัน ฉันจะยืนยันว่า AI และการประมวลผลภาพทำได้ง่ายกว่ามากกับไลบรารี C / C ++ (fann, OpenCV)
MrFox

4
สำคัญกว่า FPS ฉันอาจจะเน้นอัตราเฟรมที่สอดคล้องกัน ฉันสามารถให้เกมของฉันทำงานที่ 100FPS ได้ แต่ถ้าเฟรมเหล่านั้นบางเฟรมใช้เวลาครึ่งวินาทีนั่นจะไม่เกิดขึ้นเลย แม้ว่า GC จะเร็ว แต่ถ้าทำให้เกิดความผิดปกติที่เห็นได้ชัดก็ยังคงเป็นปัญหาอยู่ (สิ่งนี้ไม่ได้พูดถึงประสิทธิภาพของ Java โดยเฉพาะปัญหาทั่วไปที่ต้องระลึกไว้)
Gankro

1
ฉันเขียนปืนคนแรกใน Java และฉันไม่เคยมีปัญหาใด ๆ กับตัวเก็บขยะแม้ว่าฉันจะไม่ได้ใช้งานด้วยความล่าช้าน้อยก็ตาม อย่างไรก็ตามเมื่อหน่วยความจำไม่ได้รับการจัดสรรบนกอง Java มันขึ้นอยู่กับฉันที่จะจัดการกับมันโดยไม่ต้องเก็บขยะและส่วนใหญ่ของหน่วยความจำของฉันมาจาก VBOs กล่าวอีกนัยหนึ่งการเก็บขยะไม่ได้เป็นปัญหาเพราะมันทำงานเมื่อมันถูกใช้สำหรับสิ่งที่ออกแบบมาและมันก็ไม่ได้ขึ้นอยู่กับการจัดการกับวัตถุขนาดใหญ่บน GPU หรือในกองพื้นเมือง (! = Java heap) อย่าตำหนิทั่งเพราะไม่ได้ผลดีในการแปรงฟัน
gouessej

1
@deadalnix โลกของวิดีโอเกมไม่ได้มี แต่คอนโซลเท่านั้น
gouessej

27

โอเคมีข้อมูลที่ผิดมากมายในกระทู้นี้

ฉันรู้จักธุรกิจเกมเป็นอย่างดีมาโดยตลอด 25 ปี ฉันรู้ว่า Java ในเกมเป็นอย่างดีด้วยการเป็นผู้สอนด้านเทคนิค Java Game ของ Sun และบรรยายผู้เชี่ยวชาญด้านการเขียนโปรแกรม Java

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

ในแง่ของการใช้งานหน่วยความจำ Java มีส่วนเกิน HelloWorld เป็นโปรแกรม 4K ในจาวา แต่ค่าใช้จ่ายนั้นค่อนข้างไร้ความหมายในระบบหลาย GB ในปัจจุบัน ท้ายที่สุด Java มีเวลาเริ่มต้นมากกว่า ฉันจะไม่แนะนำให้ใช้ Java สำหรับอรรถประโยชน์แบบรันไทม์สั้น ๆ เช่นคำสั่ง Unix command ในกรณีดังกล่าวการเริ่มต้นจะควบคุมประสิทธิภาพของคุณ อย่างไรก็ตามในเกมมันมีต้นกำเนิดที่ค่อนข้างยุติธรรม

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

ในแง่ของการเข้าถึงหน่วยความจำโดยตรง Java มีมานานแล้ว ตั้งแต่ Java 1.4 ในรูปของ Native Direct Byte Buffers Bit twiddling ใน Java อาจจะน่ารำคาญเล็กน้อยเนื่องจากไม่มีประเภทจำนวนเต็มที่ไม่ได้ลงนาม แต่รอบการทำงานเป็นที่รู้จักกันดีและไม่เป็นภาระอย่างมาก

ในขณะที่ Java ที่แท้จริงไม่เคยมีการเชื่อมโยง Direct3D แต่นั่นเป็นเพราะเทคโนโลยี Java พยายามอย่างหนักในการพกพา มันมีการผูกสอง OpenGL (JOGL และ LWJGL) และการผูก OpenAL (JOAL) และการเชื่อมต่ออินพุตแบบพกพา (JInput) ที่ผูกภายใต้ประทุนกับ DirectInput บน Windows, HID Manager บน OSX และการผูก Linux (ฉันลืมว่า)

ความจริงที่ว่าไม่มีเอนจิ้นเกมที่สมบูรณ์แบบที่มีคุณสมบัติของ Java พูดว่า Unity ได้ให้ความสำคัญกับ C # และนั่นเป็นจุดอ่อนในพื้นที่อิสระ ในอีกทางหนึ่งมีสองระดับ Scenegraph APIS ที่ดีซึ่งเป็นแพลตฟอร์มแบบพกพาโดยสิ้นเชิงใน Windows, OSX และ Linux ทั้งสองเขียนโดย Josh Slack ตัวแรกเรียกว่า JMonkey engine และ Ardor3D ตัวที่สอง

โปสเตอร์ด้านบนนั้นถูกต้องว่าสองสิ่งที่ยิ่งใหญ่ที่สุดที่ถือได้ว่าเป็นจาวาในการพัฒนาเกมคือความอยุติธรรมและการพกพา หลังเป็นปัญหาที่ใหญ่ที่สุด แม้ว่าคุณจะสามารถเขียนเกม Java และจัดส่งบน Windows, OSX และ Linux แต่ก็ไม่เคยมีคอนโซล VM นี่เป็นเพราะความไร้ประสิทธิภาพโดยรวมของผู้บริหารระดับกลางของซัน พวกเราบางคนที่ทำงานเกี่ยวกับ Java ในเกมจริง ๆ แล้วมีข้อตกลงกับ Sony ไม่น้อยกว่า 3 เท่าในการรับ VM บน Playstation และผู้บริหารระดับกลางของ Sun ทั้ง 3 คนฆ่ามัน

ในขณะที่ซุนเจ้าชู้กับเทคโนโลยีของลูกค้าข้อเท็จจริงของเรื่องนี้ก็คือการจัดการของซันไม่เคยได้รับสินค้าอุปโภคบริโภค นั่นเป็นเหตุผลว่าทำไม Java ในฐานะภาษาลูกค้าจาก Sun ไม่เคยประสบความสำเร็จในทุกรูปแบบและทำไมจึงใช้ Google และ Dalvik (เช่น Java java เหมือน VM) เพื่อให้ Java เป็นแพลตฟอร์มที่ประสบความสำเร็จได้ทุกที่

และนั่นคือเหตุผลที่ฉันโค้ดเกมใน C # วันนี้ เพราะโมโนไปที่ฝ่ายบริหารของซันปฏิเสธ


8

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

  • การตรวจสอบขอบเขตและกลไกความปลอดภัยอื่น ๆ (ความแตกต่างของประสิทธิภาพเล็กน้อยในปัจจุบัน)
  • ต้องแปลงระหว่างโครงสร้างข้อมูล C ++ และโครงสร้างข้อมูล Java (ไม่เพียงคัดลอกหน่วยความจำระหว่างบัฟเฟอร์)
  • หนังสือและแบบฝึกหัดจำนวนมากติดตามผู้ชมอย่างยากลำบากเพื่อหาข้อมูล dev เกมที่ไม่ใช่ C ++
  • ไลบรารีกราฟิกหลัก (DirectX และ OpenGL) และเอ็นจิ้นนอกชั้นวางจำนวนมากนั้นใช้ C / C ++
  • เกมจำนวนมากพยายามที่จะทำงานให้เร็วที่สุดเท่าที่จะเป็นไปได้เพื่อให้พวกเขาสามารถเพิ่มคุณสมบัติที่ดึงดูดสายตามากขึ้น

มันไม่ง่ายที่จะทำงานกับไลบรารี C ++ จากภาษา bytecode เช่น Java (การเขียนเลเยอร์ JNI) และ. net (คุณลักษณะ marshalling / unmarshalling, api / โครงสร้างจำนวนมาก) ดังนั้นมันจึงเพิ่มการทำงานให้กับผลประโยชน์เพียงเล็กน้อย

หมายเหตุด้าน: เซิร์ฟเวอร์เกมบางตัวใช้ Java

โพสต์ที่คล้ายกันที่นี่ : https://stackoverflow.com/questions/1034458/why-arent-video-games-written-in-java


คุณไม่จำเป็นต้องเขียน JNI ด้วยตัวเองเพียงแค่ใช้ JogAmp หรือห้องสมุดที่คล้ายกัน
gouessej

จุดดี. ฉันใช้ JOGL และ JMonkeyEngine ใน Java สิ่งที่ฉันควรทำคือใช้ XNA / MonoGame เป็น DirectX และ OpenTK เป็น OpenGL ด้วย nvorbis / naudio / openal ใน C # และใช้งานได้ดีสำหรับเกมขนาดเล็กถึงขนาดกลางโดยเฉพาะอย่างยิ่งเมื่อทำงานกับ shaders ปรับปรุงประสิทธิภาพการผลิตอย่างมากใน C ++ ปัญหาที่แท้จริงเพียงอย่างเดียวของคุณจะเหมือนกับภาษา GC-based ใด ๆ : การป้องกัน / บรรเทา GC มันจะถ่วงเวลาเฟรมของคุณเป็นระยะ ๆ ดังนั้นคุณจะต้องมีอาร์เรย์ขนาดคงที่การจัดสรรแบบคงที่หรือบัฟเฟอร์ที่มีอายุการใช้งานนานซึ่งสามารถโยนได้เมื่อการเล่นเกมถูกถ่วง (เมนูโหลดภาพยนตร์)
แกรม Wicksted

ฉันใช้ JOGL ตั้งแต่ปี 2549 และฉันไม่เคยมีปัญหาแบบนี้แม้แต่กับฮาร์ดแวร์ระดับต่ำสุดในสภาพแวดล้อมเดสก์ท็อป ตัวรวบรวมขยะไม่ควรตำหนิเนื่องจากวัตถุที่ใหญ่ที่สุดมักจะอยู่ใน GPU RAM หรือฮีปดั้งเดิม (โดยทั่วไปคือบัฟเฟอร์ NIO โดยตรง) อดีตไม่ได้รับการจัดการโดยชุดเก็บขยะ "ปกติ" และ aren หลัง ' ไม่ได้รับการจัดการโดยตรงโดยการรวบรวมขยะ "ปกติ" ในขณะที่ดูแลวัตถุ Java บนกอง Java ขึ้นอยู่กับผู้พัฒนาที่จะปล่อยหน่วยความจำที่จัดสรรในฮีปดั้งเดิมอย่างมีประสิทธิภาพ
gouessej

ในความเห็นต่ำต้อยของฉันปัญหาค่อนข้างมาจาก "การเพิ่มประสิทธิภาพ" บางอย่างที่จินตนาการโดยโปรแกรมเมอร์ไม่ได้อยู่ในความคิดของจาวาที่ป้องกันไม่ให้ตัวเก็บรวบรวมขยะทำงาน หากคุณเก็บการอ้างอิงที่รัดกุมบนวัตถุ Java ที่ไร้ประโยชน์บางตัวที่เชื่อมโยงกับทรัพยากรดั้งเดิมบางอย่างตัวเก็บรวบรวมขยะจะไม่พิจารณาว่าจะเรียกคืนได้ การจัดสรรแบบไม่ใช้ฮีปอาจมีประโยชน์ในบางกรณี แต่หากคุณใช้ในทางที่ไม่เหมาะสมทรัพยากรที่มีอยู่ของคุณจะอยู่ในความทรงจำและคุณจะไม่สามารถสร้างวัตถุใหม่ได้
gouessej

โปรแกรมเมอร์เกมบางคนชอบที่จะจัดสรรบัฟเฟอร์ขนาดใหญ่ในตอนแรกโดยแบ่งพวกมันออกจากรันไทม์และจัดการหน่วยความจำนี้ด้วยตัวเอง แต่พวกเขาอาจจะแย่กว่านั้นคือระบบปฏิบัติการและจากนั้น Java จะใช้เวลามากในการสร้างพื้นที่ว่าง การหลีกเลี่ยงการรั่วไหลของหน่วยความจำไม่ใช่เรื่องยากใน Java และโซลูชันที่ทำงานได้มากขึ้นประกอบด้วยการติดตามเฉพาะวัตถุที่ไม่ได้จัดสรรหน่วยความจำบน heap Java เพื่อปล่อยพวกเขาในเวลาที่เหมาะสม (ในระหว่างหยุดชั่วคราวเมื่อสลับจากระดับหนึ่งไปอีกระดับหนึ่ง , ... ) ไม่มีอะไรเกี่ยวข้องกับตัวเก็บขยะ
gouessej

5

Java นั้นไม่เร็วพอสำหรับการพัฒนาเกมส่วนใหญ่ มันช้ากว่าการใช้ C ++ / Assembly ซึ่งเป็นมาตรฐาน มันเป็นเหตุผลเดียวกันกับที่การพัฒนาเกมไม่ได้ทำโดยใช้ C # หรือ VB นักพัฒนาเกมต้องการและวางแผนวงจรนาฬิกาทุกครั้งที่พวกเขาสามารถรับมือกับสิ่งต่าง ๆ เช่นการคำนวณทางฟิสิกส์ตรรกะ AI และการโต้ตอบของสภาพแวดล้อม

สำหรับเกมที่ง่ายกว่า Java สามารถใช้ได้อย่างมีประสิทธิภาพ หากคุณต้องการสร้างโคลน Tetris หรือ Bejeweled หรืออย่างอื่นของรายละเอียดในระดับนั้น Java จะทำงานได้ดี แต่ Java ไม่สามารถสร้างเกมเช่น Halo, Medal of Honor, Command & Conquer และอื่น ๆ และทำให้เล่นได้ อย่างน้อยมันก็มีอยู่ทุกวันนี้

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

ความคิดนี้เปลี่ยนไปจากความสามารถในการใช้ภาษาระดับสูงเหล่านี้สำหรับเกมขั้นสูงบางเกม ตัวอย่างเช่นหนึ่งในเกมโปรดของฉันคือ Auran Train Simulator ถูกเขียนด้วยส่วนใหญ่ใน C # และทำงานได้ค่อนข้างดี ดังนั้นฐานกำลังเติบโตและจะพัฒนาต่อไป


17
คุณปล่อยให้หนึ่งในจุดที่สำคัญที่สุด; เครื่องมือและ API ส่วนใหญ่ที่ใช้จะถูกเขียนด้วยภาษา C ++ และเขียนใหม่เพื่อทำงานกับ Java หรือภาษาอื่น ๆ จะเป็นงานที่ต้องทำมากมาย นอกจากนี้การวางนัยทั่วไปของคุณที่"[Java คือ] ช้ากว่าการใช้ C ++ / Assembly " นั้นกว้างเกินไปที่จะแม่นยำ แอสเซมบลีไม่ได้ใช้บ่อยเท่าที่คุณคิดในเกมพีซีเนื่องจากคอมไพเลอร์ที่ดีจะสร้างโค้ดที่มีประสิทธิภาพมากกว่าที่คุณจะเขียนแอสเซมเบลอร์ การใช้ทรัพยากรที่กำหนดได้และความสามารถในการเข้าถึงฮาร์ดแวร์ได้อย่างถูกต้อง
Ed S.

15
บางคนต้องการสร้างตัวอย่างที่ดีกว่าของความสามารถของ Java มากกว่า Minecraft จนกว่าจะมีใครสามารถสร้างสิ่งที่เทียบเท่า WoW หรือ C&C หรือ MOH หรือ Starcraft ใน Java หรือ C # ฉันจะยังคงยึดมั่นในสิ่งที่ฉันพูด
BBlake

12
"แอสเซมบลีไม่ได้ใช้บ่อยเท่าที่คุณคิดในพีซีเกมเพราะคอมไพเลอร์ที่ดีจะสร้างโค้ดที่มีประสิทธิภาพมากกว่าที่คุณจะเขียนแอสเซมเบลอร์" นั่นเป็นลักษณะทั่วไปอีกอย่าง ฉันยังไม่เห็นคอมไพเลอร์เกินกว่าจะสร้างภาษาเครื่อง IA32 ได้ดีกว่าโปรแกรมเมอร์ภาษาแอสเซมบลี IA32 ที่มีประสบการณ์ คอมไพเลอร์สร้างรหัสสำหรับเครื่องนามธรรมที่แมปเข้ากับเครื่องเป้าหมาย โปรแกรมเมอร์ภาษาแอสเซมบลีใช้ประโยชน์เต็มที่จากโปรเซสเซอร์พื้นฐานรวมถึงสำนวนเครื่อง
bit-twiddler

10
อย่าลืมการใช้งานหน่วยความจำ การใช้หน่วยความจำน่าจะสำคัญกว่าความเร็ว Java ไม่ได้ออกแบบมาสำหรับการควบคุมหน่วยความจำโดยตรงเช่น C ++ และตัวรวบรวมขยะหมายถึงการใช้หน่วยความจำสูงกว่า C ++ สำหรับงานเดียวกันเสมอ
Matthew อ่าน

9
นี่ไม่ใช่ 1985 เรามีหน่วยความจำมากกว่า 640k, ดีกว่า 50 mghz processor, และมากกว่า 1.44 mbs ของหน่วยความจำแบบถอดได้ ผู้พัฒนาเกมในวันนี้มีความท้าทายไม่เหมือนเดิมเมื่อ 25 ปีก่อน ไปข้างหน้าและค้นหาตัวอย่างของรหัส x86 / หรือ ia64 ที่สร้างขึ้นด้วยมือสำหรับเกมที่ทันสมัย ตำนานบางอย่างเป็นเพียงผิดธรรมดา ความท้าทายคือการพกพาและไคลเอนต์ระดับล่างที่ใช้สภาพแวดล้อมการทำงานที่ค่อนข้างเก่า ตัวหารร่วมน้อยที่สุดเทียบกับความน่าดึงดูดใจ
JustinC

5

เกมสมัยใหม่เป็นเกมเกี่ยวกับกราฟิก 3 มิติที่เกิดขึ้นในฮาร์ดแวร์ที่มีวัตถุประสงค์พิเศษ

แม้แต่ในปี 2545 จาค็อบมาร์เนอร์พบในรายงานของเขา "การประเมิน Java เพื่อการพัฒนาเกม" ว่า Java นั้นค่อนข้างใช้งานได้สำหรับเกมยกเว้นชิ้นส่วนที่ขึ้นอยู่กับประสิทธิภาพมากที่สุดและเนื่องจากความแข็งแกร่งของภาษาและ JVM พื้นฐานว่าราคาถูก ทำแบบนี้

http://java.coe.psu.ac.th/FreeOnline/Evaluating%20Java%20for%20Game%20Development.pdf

มันเป็นความเห็นส่วนตัวของฉันว่าด้วยความก้าวหน้าที่เกิดขึ้นโดยเฉพาะอย่างยิ่งในกราฟิก 3 มิติและด้วยการเชื่อมโยงที่ยอดเยี่ยมกับ OpenGL และคณะทำให้ข้อเสียนี้ไม่ค่อยเด่นชัดในทุกวันนี้

ดังนั้นปัญหาจะต้องอยู่ที่อื่น เหตุผลที่เป็นไปได้ก็คือขนาดของรันไทม์ Java (ซึ่งมีปัญหาน้อยกว่าในทุกวันนี้เมื่อมีเกมแบบมัลติดีวีดี) และความเฉื่อยของรหัสที่มีอยู่อีกรายการหนึ่ง มันเปราะฉาวโฉ่ที่จะเริ่มทำงานกับรหัสพื้นเมืองใน Java เหตุผลข้อที่สามคือสิ่งที่นักพัฒนาซอฟต์แวร์ที่คุ้นเคยกับเกม ที่สี่คือว่า Java มีอยู่บนแพลตฟอร์มหรือไม่

มีสิ่งหนึ่งที่แน่นอน - เกมส่วนใหญ่กำลังเข้าสู่การเขียนสคริปต์แทนที่จะเขียนมันทั้งหมดในรหัส C ตั้งแต่เริ่มต้นและคุณต้องการรันไทม์ที่ดีที่สุดภายใต้ภาษาสคริปต์ของคุณ ทุกวันนี้สิ่งนี้หมายถึง CLR หรือ JVM


1
oddlabs.com/technology.php - "เราได้พัฒนาบนพื้นฐานของการรวมกันของ LWJGL และ Java ซึ่งช่วยให้เกมทำงานบนแพลตฟอร์มที่รองรับ LWJGL โดยไม่มีการดัดแปลงใด ๆ

Jake2 มีประสิทธิภาพสูงกว่า Quake2 มากกว่า 10 ปีที่แล้ว เราไม่ได้อยู่ในปี 2545 อีกต่อไปแล้ว
gouessej

4

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


4

ฉันคิดว่าปัจจัย จำกัด สำหรับคนส่วนใหญ่คือความพร้อมของเอ็นจิ้นเกมที่ดี เพื่อให้ได้ไกลเราต้องดูว่าทำไมจึงไม่มีอยู่

ฉันจะดูสิ่งนั้นจากอีกทิศทางหนึ่งชั่วครู่ การพัฒนาเกมเครื่องยนต์ (ตัวอย่าง) เป็นจำนวนมากของการทำงาน ใครบ้างที่จะได้ประโยชน์จากการพัฒนาเพื่อลงทุนเวลาและความพยายาม

ผู้สมัครส่วนใหญ่ที่เห็นได้ชัดสำหรับการพัฒนาที่คล้ายกับกรอบใน / สำหรับ Java (เช่น IBM, Oracle) ดูเหมือนจะไม่มีความสนใจในเกม ผู้สมัครที่เห็นได้ชัดเจนสำหรับการพัฒนาเกม (เช่น Id, EA) ดูเหมือนจะมีความสนใจใน Java เพียงเล็กน้อย

ผู้สมัครเกือบคนเดียวที่ฉันสามารถนึกได้ว่าดูเหมือนว่าสมเหตุสมผลก็คือ Google ภาษาสำหรับการพัฒนาเบื้องต้นสำหรับ Android คือ Java และการส่งเสริมการพัฒนาเกมสำหรับ Android สามารถให้ประโยชน์ที่แท้จริงสำหรับแพลตฟอร์ม

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


ฉันคิดว่าคุณประสบปัญหาสำคัญกับเอ็นจิ้นเกม - ฉันคิดว่านี่เป็นเหตุผลที่ดีที่สุดว่าทำไม Java ไม่ได้ติดกับ C / C ++ เป็นไปได้ว่าโอเพนซอร์สอาจเพิ่มระดับการเล่นได้เล็กน้อย - ฉันประทับใจมากกับ jMonkeyEngine ( jmonkeyengine.com )
mikera

และอย่าลืมว่าผู้พัฒนาเกมนั้นมีความอนุรักษ์นิยมโดยรวม (ในทางเทคนิค) และร้านค้าขนาดใหญ่ (ผู้มีอิทธิพล) ส่วนใหญ่มีอยู่หลายสิบปีและ C (++) / ASM เป็นศูนย์กลางดังนั้นจะไม่ลงทุนในการพัฒนา Java มันหมายถึงการลงทุนที่ครอบคลุมทั้งเวลาเงินและทรัพยากรอื่น ๆ ล่วงหน้าเมื่อพวกเขามีสถาปัตยกรรม C (++) / ASM ทั้งหมดพร้อมที่จะม้วน
jwenting

1

คำถามอยู่เสมอเพื่อถามสิ่งในบรรทัด:

อะไรจะดีไปกว่าพลังของรถยนต์เครื่องยนต์เรือหรือเครื่องยนต์ไอพ่น

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


0

Java ไม่ได้ถูกสร้างขึ้นโดยคำนึงถึงการพัฒนาเกม แต่ Java ถูกสร้างขึ้นเพื่อเป็นภาษา "สำหรับเว็บ"

สำหรับการพัฒนาเกมซันไม่ได้สนับสนุน Java ในฐานะภาษาพัฒนาเกมเนื่องจาก Microsoft สนับสนุน C #

ฉันคิดว่าการขาดกรอบการพัฒนาเกมที่น่าสนใจคือสิ่งที่ทำให้ Java ตายในแง่นี้


3
แต่ภาษาซีพลัสพลัสไม่ได้ทำเป็นภาษาเกมเหมือนกัน แต่ในฐานะที่เป็นภาษาการเขียนโปรแกรมระบบเช่นเดียวกับซีและจริงๆแล้วซันได้ใช้ความพยายามกับจาวาเป็นภาษาเกมฉันคิดว่าพวกเขาร่วมมือกับ Sony เพื่อนำจาวาไปยัง PS2 หรือ บางอย่าง แต่มันไม่เคยเกิดขึ้น ...
Anto

1
@Phobia: แต่มันถูกออกแบบมาสำหรับการเขียนโปรแกรมระบบ
Anto

1
@Phobia: ฉันกำลังบอกว่ามันเป็นภาษาการเขียนโปรแกรมทั่วไปเช่นเดียวกับ C ++ ในคำตอบของคุณคุณบอกว่า Java ไม่ได้ออกแบบมาเป็นภาษาโปรแกรมเกม แต่คุณลืมว่า C ++ นั้นไม่ได้ออกแบบมาอย่างนั้น
Anto

2
@Joe Blow: จากหน้า Wikipedia เกี่ยวกับ C: "ถึงแม้ว่าC ได้รับการออกแบบมาสำหรับการนำซอฟต์แวร์ระบบมาใช้แต่ก็ยังใช้กันอย่างแพร่หลายในการพัฒนาซอฟต์แวร์แอปพลิเคชันแบบพกพา" ฉันคิดว่ามันค่อนข้างชัดเจนใช่มั้ย
Anto

2
@Phobia ฉันขอโทษเกี่ยวกับความชอบส่วนตัวของคุณ แต่พวกเขาไม่เกี่ยวข้องกับการสนทนาอย่างสมบูรณ์ นอกจากนี้ฉันไม่ต้องการแข่งขันว่าทุกวันนี้ C ++ ถูกนำไปใช้ในการเขียนโปรแกรมประยุกต์โดยเฉพาะ นี่ไม่ใช่สิ่งที่การสนทนานี้เกี่ยวกับ การอ้างสิทธิ์ของคุณว่า Java ได้รับการออกแบบโดยคำนึงถึงการเขียนโปรแกรมเว็บเป็นหลัก C ++ ได้รับการออกแบบโดยคำนึงถึงการเขียนโปรแกรมระบบเป็นหลัก นักออกแบบกล่าว จบการสนทนา
Konrad Rudolph

-1

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

สำหรับเกมที่การเพิ่มประสิทธิภาพให้กับฮาร์ดแวร์ล่าสุดนั้นมีความสำคัญน้อยกว่าเช่นเกมโทรศัพท์มือถือทั่วไปการใช้ C ในลักษณะนี้มีความสำคัญน้อยกว่าการพกพาที่มากขึ้นของ Java


-4

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


สิ่งนี้อ่านมากขึ้นเช่นความเห็นดูวิธีการตอบ
gnat

-8

แน่นอนมันอาจเป็นอย่างอื่น คนที่รู้จักธุรกิจดีกว่าฉันอธิบายได้หรือไม่ว่าทำไม Java ถึงไม่ได้รับแรงเมื่อพัฒนาเกม

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

หากคุณต้องการปั๊มกราฟิกที่คลั่งไคล้เช่นไครซิสและอะไรก็ตามที่คุณไม่ควรทำกับ Java

ไม่เพียงเท่านั้น Oracle ยังเป็นเจ้าของ Java ความคิดที่ว่า บริษัท สามารถฟ้องร้องคุณไม่กล้า โดยเฉพาะอย่างยิ่งเมื่อคุณต้องการสร้างล่ามของคุณเองสำหรับ JAVA เพื่อกำหนดเป้


1
คุณควรอ่านเกี่ยวกับการรวบรวม JIT อย่างจริงจังและดูมาตรฐานที่ Java วางเทียบกับ C ++
Anto

1
ใครห่าคะแนนโหวตคำตอบนี้ลง? คำถามทั้งหมดนี้กลายเป็นเรื่องไร้สาระอย่างไม่น่าเชื่อ! ความเศร้าโศกที่ดี
Fattie

7
@ Joe คำตอบนั้นผิด Java ไม่ได้รับการตีความ
Konrad Rudolph

3
@Anto ลืมมาตรฐานโง่ ๆ C ++ เป็นคำสั่งของขนาดเร็วกว่า Java ที่จะนับดูprogrammers.stackexchange.com/questions/29109/29136#29136และprogrammers.stackexchange.com/questions/368/13888#13888
Konrad Rudolph

1
@ ถึงสิ่งที่ฉันคิดว่าจะดู? ความเร็ว? C ++ การใช้ความจำ? C ++ ดู minecraft และลองโฮสต์เซิร์ฟเวอร์และดูว่าเกมมีหน่วยความจำเท่าใด Java ใช้หน่วยความจำมากกว่าเดิมเมื่อเทียบกับ C ++ สร้างเกมออนไลน์ฉันคิดว่ามันยากใน Java มาตรฐานทุกตัวที่ฉันเคยเห็น Java ใช้หน่วยความจำเพิ่มขึ้นตอนนี้มีเกม mmorpg ที่เซิร์ฟเวอร์กลางถูกเข้ารหัสใน java ฟังดูดีถ้าคุณไม่สนใจหน่วยความจำหรือเปลี่ยนนิยามของ MMORPG ที่มีขนาดใหญ่
mythicalprogrammer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.