ทำไมวิดีโอเกมที่เขียนด้วยภาษาจาวาเพียงไม่กี่เกม [ปิด]


171

เหตุใดจึงมีวิดีโอเกม 3 มิติเชิงพาณิชย์จำนวนมาก (ไม่ใช่ 2D แบบโอเพนซอร์ซแบบสุ่ม) ที่เขียนด้วย Java ในทางทฤษฎีแล้วมันสมเหตุสมผล: คุณได้รับการเพิ่มประสิทธิภาพการทำงานและแอพพลิเคชั่นข้ามแพลตฟอร์มเกือบฟรีเหนือสิ่งอื่นใดเช่นไลบรารี Java จำนวนมากและการรวบรวมขยะในตัว (แม้ว่าฉันจะยอมรับฉันก็ตาม) ฉันไม่แน่ใจว่าอันหลังเป็นสิ่งที่ดีหรือไม่) เหตุใดจึงไม่ค่อยใช้ ฉันนึกถึงเกมเชิงพาณิชย์ที่เป็นที่นิยมที่เขียนขึ้นสำหรับแพลตฟอร์ม Java เท่านั้น

เป็นเพราะประสิทธิภาพหรือไม่ ถ้าอย่างนั้น GPU ส่วนใหญ่ก็ไม่สามารถทำได้เช่นกันใช่ไหม



1
เรื่อง: mmyers; ฉันบ้างในช็อตว่าเป็นเกมที่ได้รับรางวัล "กราฟิกที่ดีที่สุด" รางวัลแม้ในปี 2005 ...
CloudyMusic

2
ใช่ แต่ "เกมจริง" ส่วนใหญ่ไม่ได้สร้างขึ้นใน. net ที่ถูกต้องใช่ไหม พวกเขาทำในโรงเรียนเก่า c / c ++?
Hardwareguy

14
Runescape เขียนด้วยภาษาจาวา
GameFreak

44
Minecraft เขียนด้วย Java!
daGrevis

คำตอบ:


155

โลกของการพัฒนาเกมเป็นเกมที่ตลก: ในอีกด้านหนึ่งพวกเขามักจะยอมรับแนวคิดใหม่ ๆ อย่างรวดเร็วในทางกลับกันพวกเขายังอยู่ในยุคหิน

ความจริงก็คือไม่ค่อยมีแรงจูงใจในการเปลี่ยนเป็น. NET / Java / อะไรมากกว่า C / C ++

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

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

ในที่สุดมันก็ยากสำหรับเกมที่จะเขียนด้วย 100% C ++ ต่อไป - มีหลายอย่างที่ใช้ภาษาสคริปต์ไม่ว่าจะเป็นแบบกำหนดเองหรือรวมภาษาที่มีอยู่ (Lua เป็นหนึ่งในเกมยอดนิยมในปัจจุบัน)

เท่าที่มีการเก็บขยะที่เกี่ยวข้องนั่นอาจเป็นปัญหาเล็กน้อย ปัญหาไม่ได้มีอยู่จริงมันทำงานได้มากกว่า - ตัวเก็บขยะจะต้องไม่ถูกบล็อก (หรืออย่างน้อยต้องรับประกันว่าจะปิดกั้นเพียงช่วงสั้น ๆ เท่านั้น) เนื่องจากมันไม่สามารถยอมรับได้ที่จะหยุดเกมเป็นเวลา 10 วินาทีในขณะที่ มันจะสแกนหน่วยความจำที่จัดสรรไว้ทั้งหมดเพื่อดูสิ่งที่สามารถเป็นอิสระ ฉันรู้ว่า Java มีแนวโน้มที่จะทำให้หายใจไม่ออกใน GC'ing เมื่อมันใกล้จะหมดหน่วยความจำ (และสำหรับบางเกมที่นั่นก็จะ)

นอกจากนี้คุณยังถูก จำกัด มากขึ้นในสิ่งที่คุณสามารถทำได้: คุณไม่สามารถใช้ประโยชน์จากฮาร์ดแวร์ได้อย่างเต็มที่เนื่องจากโอเวอร์เฮดของรันไทม์ ลองนึกภาพว่า Crysis เขียนด้วยภาษาจาวา ... แม้ว่ามันจะเป็นความแตกต่างที่มองเห็นได้ แต่มันก็ไม่เหมือนกัน (ฉันค่อนข้างมั่นใจว่าคุณต้องใช้ Core i7 ในการรัน)

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

เท่าที่เกมเชิงพาณิชย์มีความเกี่ยวข้อง - RuneScapeนับหรือไม่? นั่นอาจเป็นเกม Java ที่ประสบความสำเร็จที่สุด


16
เห็นได้ชัดว่าคุณจะไม่เรียกใช้ Crysis บน JVM; ถ้าคุณเขียนโค้ดเกมนั้นเป็นภาษาแอสเซมบลีคุณจะต้องมีซูเปอร์คอมพิวเตอร์เพื่อใช้งานในการตั้งค่าแบบเต็ม แต่ +1 สำหรับความเข้าใจที่ยอดเยี่ยมขอบคุณ
Sasha Chedygov

15
คุณไม่สามารถเปรียบเทียบ Unreal Tournament 3 หรือ Crysis กับ Runescape หากคุณกังวลเกี่ยวกับคุณภาพของกราฟิกคุณต้องใช้ภาษาที่มีระดับต่ำและมีค่าใช้จ่ายน้อยที่สุด แน่นอนว่าสำหรับอินดี้หรือเกมที่มีกราฟิกไม่ใช่จุดขายหลัก Java เป็นตัวเลือกที่ยอดเยี่ยมสำหรับ C / C ++
GuiSim

6
@GuiSim: สำหรับเกมส่วนใหญ่คุณภาพกราฟิกไม่ได้เป็นจุดขายที่สำคัญ มีเพียงไม่กี่เกมที่ฉันสามารถนึกถึงเกมที่สร้างขึ้นด้วยกราฟิกในใจ (ฉันกำลังคิดถึง Crysis แต่ Half-Life 2 เช่นกันในเวลานั้น) ฉันไม่คิดว่านักพัฒนาเกมส่วนใหญ่สนใจเรื่องกราฟิกมากนักตราบใดที่พวกเขา "ดีพอ" (หรือเทียบเท่ากับเกมอื่น ๆ ส่วนใหญ่)
Sasha Chedygov

4
กราฟิกมีส่วนเกี่ยวข้องกับภาษาน้อยมาก สาขาฟิสิกส์, AI, ใช่ กราฟิคหมายเลข
JulianR

10
@JulianR อาจมีภาระงานจำนวนมากสำหรับการเตรียมและบำรุงรักษาฉากที่จะเรนเดอร์ได้อย่างมีประสิทธิภาพดังนั้นภาษาและค่าใช้จ่ายด้านภาษาที่เกี่ยวข้องนั้นมีความสำคัญสำหรับกราฟิก
KSchmidt

95

ฉันคิดว่า John Carmack พูดได้ดีที่สุดกับ:

ปัญหาที่ใหญ่ที่สุดคือ Java ช้าจริงๆ ในระดับซีพียู / หน่วยความจำ / จอแสดงผล / การสื่อสารบริสุทธิ์โทรศัพท์มือถือรุ่นใหม่ ๆ ส่วนใหญ่ควรเป็นแพลตฟอร์มเกมที่ดีกว่าเกมบอยแอดวานซ์ ด้วย Java บนโทรศัพท์ส่วนใหญ่คุณจะเหลือพลังงานซีพียูของพีซี IBM เดิม 4.77 เมกะเฮิร์ตซ์และควบคุมทุกอย่างได้อย่างดีเยี่ยม [... snip ... ] เขียนทุกครั้งที่วิ่ง ฮ้า hahahahaha เรากำลังทดสอบเฉพาะสี่แพลตฟอร์มในขณะนี้และไม่คู่เดียวมีนิสัยใจคอที่แน่นอน เกมเชิงพาณิชย์ทั้งหมดได้รับการปรับแต่งและรวบรวมเป็นรายบุคคลสำหรับแพลตฟอร์มแต่ละแห่ง (มักจะมากกว่า 100+) การพกพาไม่ใช่เหตุผลสำหรับประสิทธิภาพอันยิ่งใหญ่

(ที่มา )

จริงอยู่ที่เขากำลังพูดถึงแพลตฟอร์มมือถือ แต่ฉันพบปัญหาที่คล้ายกันกับ Java โดยรวมมาจากพื้นหลัง C ++ ฉันพลาดการจัดสรรหน่วยความจำใน Stack / Heap ตามเงื่อนไขของฉันเอง


60
คำพูดนั้นมาจากปี 2005 ทั้งเทคโนโลยี Java และพลังมือถือได้พัฒนาขึ้นอย่างมากตั้งแต่นั้นมา การเปรียบเทียบการเล่นเกมมือถือกับการเล่นเกมบนพีซีกำลังเปรียบเทียบแอปเปิ้ลกับส้ม
Chris Dail

78
John Carmack พูดว่า ปิดคดี.
GuiSim

41
ฉันไม่สบายใจเมื่ออ่าน "Java ช้ามาก" มันเหมือนกับว่ารถสปอร์ตราคา $ 50k นั้นช้าเมื่อเทียบกับรถสปอร์ตราคา $ 100k แน่นอนว่ามันช้ากว่า แต่ 90% ของเวลางานที่ทำอยู่นั้นยังคงยอดเยี่ยมและเสียค่าใช้จ่ายเพียงครึ่งเดียว;) ไม่มีสงครามเปลวไฟเกิดขึ้น ฉันยอมรับว่าเหตุผลข้างต้นเป็นสาเหตุว่าทำไม Crysis และเกมที่คล้ายกันไม่ได้เขียนใน Java
Ross

17
@Chris Dail สิ่งนี้ตอกย้ำปัญหาทั้งหมดที่เกิดขึ้นกับประสิทธิภาพของ Java ประสิทธิภาพของ Java ดีขึ้นหรือไม่ ไม่โทรศัพท์มือถือเร็วขึ้น เกมควรจะผลักดันขีด จำกัด ของความสมจริงดังนั้นจึงผลักดันขีด จำกัด ของฮาร์ดแวร์และทิ้งประสิทธิภาพของคุณ 30% ถึง 40% ก่อนที่คุณจะเขียนโค้ดแม้แต่บรรทัดเดียวก็ไม่สามารถยอมรับได้
cgp

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

54

สิ่งหนึ่งที่การขาดตัวดำเนินการมากเกินไปของ Java ทำให้คณิตศาสตร์ทั้งหมดที่คุณต้องจัดการเพื่อให้ได้กราฟิกที่ใช้งานได้ดีมากน่ารำคาญและอ่านยาก

การคูณเมทริกซ์และเวกเตอร์เลียนแบบทั้งหมดที่คุณต้องจัดการนั้นง่ายกว่ามากหากพวกมันอยู่ในนิพจน์ทางคณิตศาสตร์ที่มีรูปแบบที่ดีแทนที่จะเป็นนิพจน์เชิงวัตถุเช่น

product = vector.multiply(projectionMatrix).dotProduct(otherVector);

นั่นแย่มาก คณิตศาสตร์ไม่ควรมีลักษณะเช่นนั้น


19
ฉันจำย้อนกลับไปได้ในปี '96 ฉันคิดว่ามันเป็นนักออกแบบบางคนจาก Sun ได้ให้การนำเสนอบน Java ที่ Berkeley William Kahan ( en.wikipedia.org/wiki/William_Kahan ) กำลังให้พวกเขามีส่วนร่วมในเรื่องนี้ :)
JP Alioto

13
ฉันคิดว่ามีเหตุผลที่ดีที่จะไม่อนุญาตให้ผู้ปฏิบัติงานมีการโอเวอร์โหลดในภาษา: เพื่อป้องกันไม่ให้ผู้คนใช้งาน มันเป็นเครื่องมือที่ทรงพลังและยอดเยี่ยมสำหรับคณิตศาสตร์ แต่มันอันตรายสำหรับทุกสิ่ง สันหลังยาวเป็น coders พวกเขามักจะคิดถึงมันสำหรับการย่อโค้ดและช่วงเวลาที่ผู้คนเริ่มแสดงแผนที่ที่คูณด้วยฟังก์ชั่น iterable หรือแม้กระทั่งเมื่อทุก ops ทางคณิตศาสตร์ถูกกำหนดไว้สำหรับฟังก์ชั่น ใช่ฉันใช้เวลาในการเปลี่ยนรหัสเป็นจำนวนมาก : -S มันเป็นตัวเลือกการออกแบบ และตัวเลือกการออกแบบมักจะมีข้อโต้แย้ง
back2dos

19
ลงโทษทุกคนสำหรับแอปเปิ้ลที่ไม่ดีไม่กี่คน? นี่คือเหตุผลหนึ่งที่ฉันชอบ C # ถ้าฉันต้องการโอเปอเรเตอร์การบรรทุกเกินพิกัดจริงๆ
ChaosPandion

1
โดยทั่วไปการใช้งานมากเกินไปเหมาะสำหรับสถานการณ์ที่แตกต่างกัน 2-3 สถานการณ์ในการออกแบบ OOP เท่านั้น (เวกเตอร์, เมทริกซ์, จำนวนเชิงซ้อน) สถานการณ์อื่น ๆ ส่วนใหญ่มีการกำหนดอย่างหลวมเกินไปและนำไปสู่โค้ดเลอะเทอะไวยากรณ์ที่ไม่รัดกุมและเอกสารที่ไม่ดีเท่านั้นแม้จะมาจากผู้ที่รู้วิธีใช้งาน ฉันคิดว่านั่นเป็นสาเหตุที่ Sun เลือกที่จะไม่ใช้ใน Java และฉันคิดว่านั่นเป็นการตัดสินใจที่ถูกต้อง
bgroenks

1
@MMJZ: แลมบ์ดานิพจน์เกี่ยวข้องกับการใช้งานเกินพิกัดอย่างไร?
Sasha Chedygov

26

ฉันคิดว่า. NET มีปัญหาเกี่ยวกับการรับรู้เหมือนกันมากมายที่ Java มี Microsoft เพิ่งทำตลาดได้ดีขึ้นสำหรับนักพัฒนาด้วย XNA :-)


10
XNA ยังทำให้สามารถปรับใช้แอ็พพลิเคชัน. NET ของคุณกับ XBox ฉันไม่เห็นอะไรที่ราบรื่นสำหรับ Java
StriplingWarrior

คุณยังสามารถปรับใช้กับ Zune ได้เช่นกัน
cbeuker

บิตของคำถามที่เก่ากว่า แต่เพียงเพื่ออัปเดตตอนนี้คุณสามารถเขียนเกม XNA สำหรับ Windows Phone ได้ด้วย :-)
Joel Martinez

3
@JoelMartinez อัปเดตอีกครั้ง: ไม่สามารถเขียนเกม XNA สำหรับ Windows Phone 8 ได้
Tomas Andrle

@TomA ตอนนี้เป็นไปได้แล้วที่จะเขียนเกม monogame สำหรับ WP8
Alex Lapa

17

คะแนนรองก่อน:

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

  • ข้ามแพลตฟอร์ม "ฟรี" ไม่ดีอย่างที่คุณคิดเพราะนักพัฒนาน้อยต้องการใช้ OpenGL และหลายแพลตฟอร์มหลักอาจขาดการใช้จาวาที่ดีหรือ wrappers สำหรับไลบรารีดั้งเดิมของพวกเขาไม่ว่าจะเป็นกราฟิกเสียงระบบเครือข่าย ฯลฯ

แต่ส่วนใหญ่ปัญหาคือความเข้ากันได้ย้อนหลัง ผู้พัฒนาเกมย้ายไปที่ C ++ จาก C และ C จากการประกอบหมดจดเนื่องจากเส้นทางการโยกย้ายราบรื่น ผู้ประสานงานแต่ละคนมีความใกล้ชิดกับหน้าที่ก่อนหน้านี้และรหัสก่อนหน้าของพวกเขาทั้งหมดนั้นสามารถใช้งานได้ในภาษาใหม่บ่อยครั้งผ่านคอมไพเลอร์ตัวเดียว ดังนั้นการโยกย้ายจึงช้าหรือเร็วเท่าที่คุณต้องการ ตัวอย่างเช่นส่วนหัวเก่าของเราที่ใช้อยู่ในปัจจุบันยังคงมี#ifdef WATCOMCในและฉันไม่คิดว่าจะมีใครใช้คอมไพเลอร์ Watcom ที่นี่ในอีกสิบปีข้างหน้า มีการลงทุนจำนวนมากในโค้ดเก่าและแต่ละบิตจะถูกแทนที่ตามความจำเป็นเท่านั้น กระบวนการแทนที่และอัปเกรดบิตและชิ้นส่วนจากเกมหนึ่งไปเป็นเกมถัดไปนั้นแทบจะไม่มีประโยชน์ถ้าคุณเปลี่ยนเป็นภาษาที่ไม่สามารถทำงานร่วมกับโค้ดที่มีอยู่ของคุณได้ ใช่การทำงานร่วมกันของ C ++ / Java เป็นไปได้ แต่ไม่สามารถทำได้โดยเปรียบเทียบกับการเขียน "C ด้วย bit C ++" หรือฝัง asm blocks ใน C

ในการทำให้ภาษาซี ++ เป็นภาษาที่ผู้พัฒนาเลือกไว้ถูกต้องจะต้องทำหนึ่งในสองสิ่งต่อไปนี้:

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

ฉันคิดว่า Java ไม่ตรงกับสิ่งใดสิ่งหนึ่ง ภาษาระดับสูงกว่าอาจตรงกับภาษาที่ 2 หากมีผู้กล้าพอที่จะเป็นผู้บุกเบิก (EVE Online อาจเป็นตัวอย่างที่ดีที่สุดที่เรามีใน Python ที่สามารถใช้งานได้ แต่ซึ่งใช้ภาษา Python หลัก, ส่วนประกอบ C ++ จำนวนมากสำหรับการทำงานและแม้กระทั่งสำหรับเกมที่ค่อนข้างไม่ต้องการในแง่ที่ทันสมัย)


เพียงแค่ต้องการเพิ่ม EVE Online คือการจำลองพื้นที่ 'ออนไลน์' ซึ่งผู้เล่นทั่วไปต่อสู้กับผู้เล่น 1000 และ 1000 คนซึ่งนับเป็นสถานการณ์ที่ท้าทายในแง่ของประสิทธิภาพ ถึงแม้ว่ามันจะเป็นส่วนที่ใช้ความเร็วสูงเขียนใน C / C ++ แต่ก็ยังเป็นการศึกษาที่น่าสนใจเกี่ยวกับความท้าทายในการใช้ภาษาระดับสูง (Python) ในเกม
Hakan Deryal

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

ใช่แล้วมันเป็นเรื่องจริง แต่การต่อสู้นั้นมีเรือมากกว่า 2,000 ลำบนหน้าจอพร้อมขีปนาวุธมากกว่า 2,000 ตัว (ขีปนาวุธพร้อมแอนิเมชัน) การระเบิดและอื่น ๆ ที่ต้องการประสิทธิภาพกราฟิกที่หนักหน่วง อย่างไรก็ตามขอบคุณสำหรับคำตอบโดยละเอียดมันยังคงเป็นจริง
Hakan Deryal

1
หากคุณคิดว่าไวยากรณ์ของ C & Java เหมือนกันดังนั้นจึงมีความสัมพันธ์กับประสิทธิภาพคุณไม่เข้าใจจริงๆว่าเกิดอะไรขึ้น C อาจตัดสินใจได้อย่างไรในขณะที่ฟังก์ชั่นที่กำหนดนั้นถูกเรียกด้วยพารามิเตอร์เดียวกันซ้ำ ๆ กันและแทนที่การเรียกฟังก์ชั่นทั้งหมดด้วยค่าคงที่ในขณะที่รักษาการเรียกใช้ฟังก์ชันเมื่อมีการเบี่ยงเบนในพารามิเตอร์ ฉันไม่ได้บอกว่า runtime นั้นดีกว่าหรือแย่กว่านั้นเพียงเพราะมันไม่มีความสัมพันธ์ใด ๆ กับไวยากรณ์!
Bill K

1
@BILLK - คุณดูเหมือนจะเข้าใจผิด ฉันพูดถึงไวยากรณ์เฉพาะที่อ้างอิงถึง 'ประสิทธิภาพ' - ไม่ใช่ 'ประสิทธิภาพ' เป็นความจริงที่การเพิ่มประสิทธิภาพ JIT สามารถทำให้ Java เร็วขึ้นในทางทฤษฎี แต่สิ่งนี้ไม่ได้เกิดขึ้นในทางปฏิบัติอย่างน้อยก็ไม่ใช่ในซอฟต์แวร์เกม
Kylotan

12

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


5
และสำหรับเวอร์ชั่น Mac พวกเขาจะผลักดันทุกสิ่งภายในเครื่องเสมือนของไวน์ที่ได้รับการดัดแปลง ยังคงเร็วกว่ามันจะอยู่ในตรง Java ผมคิดว่า :-)
เบน Gotow

10
Wine ไม่ใช่เครื่องเสมือนเป็นไลบรารีรันไทม์ที่เลียนแบบพฤติกรรมของไลบรารีรันไทม์ของ Windows ดังนั้นชื่อ (Wine Is Not an Emulator)
Nate CK

2
นี่เป็นเรื่องธรรมดามากในเกมบ่อยครั้งตรรกะที่ไม่สำคัญเวลาเขียนในภาษาสคริปต์บางประเภทโดยทั่วไป lua หรือหลาม
KSchmidt

แม้ว่ามันจะไม่ใช่วานิลลาโมโนก็ตาม EA ต้องการทีมพิเศษที่ทำงานกับ CLR ที่กำหนดเองเต็มเวลาเพื่อให้ทำงานได้
Crashworks

4
มีข้อสังเกตว่า Sims 3 มีชื่อเสียงในด้านประสิทธิภาพที่ต่ำกว่าแม้ในคอมพิวเตอร์ที่ยอดเยี่ยม
Lotus Notes

12
  • มีเครื่องมือหรือห้องสมุดเกมที่ดีหรือไม่?
  • นักพัฒนา C / C ++ หลายคนโดยเฉพาะอย่างยิ่งเกมบน Windows (ที่เขียนเกมเชิงพาณิชย์ส่วนใหญ่) คุ้นเคยกับ Visual Studio ไม่มีการเปรียบเทียบใน IDEs
  • โดยทั่วไปแล้ว Java ถูกขายให้กับธุรกิจต่างๆเนื่องจากมีการพิมพ์ที่ดีและมีความเข้าใจว่าไม่มีปัญหาด้านการจัดการหน่วยความจำ
  • และใช่แล้ว Java ยังคงมีปัญหาจากการรับรู้ว่ามันช้าและการจัดการหน่วยความจำก็แย่และสำหรับเกมมันอาจไม่เหมาะกับงาน ตามที่ระบุไว้ในคำตอบอื่น ๆ การรวบรวมขยะจะไม่ตัดเมื่อคุณจัดการกับความต้องการประสิทธิภาพสูงแบบเรียลไทม์ วิดีโอเกมผลักดันซีพียูและ GPU ให้ถึงขีด จำกัด

1
+1 สำหรับข้อความตัวหนา ผู้คนดูเหมือนจะไม่ทราบว่าเมื่อเกมของคุณทำงานที่ 20 fps มันมักจะเป็นฮาร์ดแวร์ที่ 20 fps มันต้องการได้ถึง 30+ fps .. แต่มันทำไม่ได้
GuiSim

ฉันไม่คิดว่ามันเป็นแค่ GC ที่เป็นปัญหาประสิทธิภาพที่ชาญฉลาดแม้ว่า ... หรือแม้แต่กับขั้นตอนการเริ่มต้นช้า ... มันเป็นปัญหาประสิทธิภาพทั่วไป
rogerdpack

2
ฉันคิดว่า ณ จุดนี้ฉันมีแนวโน้มที่จะเห็นด้วยมากกว่าในอดีต การเพิ่มประสิทธิภาพของ JVM ได้รับการปรับปรุง อย่างไรก็ตามในแง่ของการปรับปรุงประสิทธิภาพของภาษาที่พิมพ์อย่างหลวม ๆ เช่น JavaScript และอื่น ๆ ประสิทธิภาพของ Java ในการเปรียบเทียบค่อนข้างอภัยไม่ได้ มี apologists มากมายสำหรับประสิทธิภาพของ Java (แต่การรับรู้ที่ได้รับในตอนท้ายเป็นสิ่งที่สำคัญ) '
cgp

10

หนึ่งในสาเหตุที่ใหญ่ที่สุด Java และภาษาอื่น ๆ เครื่องเสมือนไม่ได้ใช้สำหรับเกมเป็นเพราะ Garbage Collection สิ่งเดียวกันสำหรับ. NET การรวบรวมขยะได้มานานและใช้งานได้ดีกับแอพพลิเคชั่นเกือบทุกประเภท ในการดำเนินการรวบรวมขยะคุณต้องหยุดและขัดขวางแอปพลิเคชันเพื่อรวบรวมถังขยะ สิ่งนี้อาจทำให้เกิดความล่าช้าเป็นระยะเมื่อเกิดการรวบรวม

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

ไม่ใช่ว่า Java ช้า เป็นที่ Java ไม่ดีในการจัดการงานเรียลไทม์


1
อย่างไรก็ตามคุณสามารถเขียนตัวกำหนดตารางเวลาของคุณเองสำหรับตัวรวบรวมขยะหากคุณกำลังจะไปไกลถึงพอร์ต Java กับสภาพแวดล้อมใหม่ หน่วยความจำจะต้องได้รับการเรียกคืนทั้งสองวิธีและในสภาพแวดล้อมแบบเรียลไทม์คุณสามารถมีตัวเลือกเวลาที่จะกำหนดเวลา gc ของคุณ ... ดีที่สุดในโลกทั้งสอง ฉันต้องย้อนกลับไปยังจุดที่ไม่มีเหตุผลมากพอที่จะย้าย Java ไปยังสถาปัตยกรรมเพื่อทำสิ่งที่คุณต้องการให้ทำเมื่อ C / C ++ ทำสิ่งเหล่านี้ให้คุณแล้ว Java ส่องสว่างในที่อื่น ๆ
San Jacinto

5
นี่ไม่ใช่ 1990 นักสะสมขยะค่อนข้างดีตอนนี้เมื่อปรับเพื่อหยุดชั่วคราว
Tom Hawtin - tackline

8

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

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


7

ปัญหาด้านประสิทธิภาพเป็นเหตุผลแรก เมื่อคุณเห็นรหัส C ++ ที่ได้รับการปรับปรุงประสิทธิภาพสูงสุดซึ่งอยู่ในเอ็นจิ้น Quake ( http://www.codemaestro.com/reviews/9 ) คุณจะรู้ว่าพวกเขาจะไม่เสียเวลากับเครื่องเสมือนจริง

แน่นอนว่าอาจมีเกม. NET บางเกม (เกมใดบ้างฉันสนใจมีเกมที่ใช้ CPU / GPU มากจริง ๆ หรือไม่) แต่ฉันคิดว่าน่าจะเป็นเพราะคนจำนวนมากเป็นผู้เชี่ยวชาญในเทคโนโลยี MS และติดตาม Microsoft เมื่อเปิดตัว เทคโนโลยีใหม่ของพวกเขา

โอ้และข้ามแพลตฟอร์มไม่ได้อยู่ในใจของ บริษัท วิดีโอเกม Linux เป็นเพียงประมาณ 1% ของตลาด, Mac OS และอีกไม่กี่% พวกเขาคิดว่ามันไม่คุ้มค่าที่จะทิ้งเทคโนโลยีและ Windows librairies เช่น DirectX


3
"ข้ามแพลตฟอร์มไม่ได้อยู่ในใจของ บริษัท วิดีโอเกม" - นั่นเป็นเหตุผลที่ฉันเคารพ บริษัท ที่ทำ :)
Sasha Chedygov

ฉันรู้สึกขอบคุณ Carmack ที่ได้ทุ่มเททั้งแพลตฟอร์มและโอเพ่นซอร์ส ฉันเพียงแค่ระบุสิ่งที่ บริษัท ส่วนใหญ่คิดว่า
Ksempac

1
นั่นเป็นเรื่องจริง คุณไม่เห็นวิดีโอเกมยอดนิยมมากมายที่โอนย้ายไปยัง Linux :(
Sasha Chedygov

ข้ามแพลตฟอร์มไม่ได้เป็นเพียงแค่ระบบปฏิบัติการข้าม คิดถึง PS3, Xbox 360, Wii
JulianR

"พวกเขาจะไม่เสียเวลากับเครื่องเสมือน" en.wikipedia.org/wiki/Quake_III_Arena#Virtual_machine , Carmack สร้างของตัวเองสำหรับตรรกะของเกม
James McMahon

4

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

Java ยังไม่มีการเข้าถึงฮาร์ดแวร์โดยตรงซึ่งหมายความว่าคุณติดอยู่กับ API ของเฟรมเวิร์กใด ๆ


Java สามารถเรียกใช้รหัสเนทีฟผ่าน "JNI"
Bart van Heukelom

4
... และสูญเสียการพกพาในขณะที่คุณอยู่ที่นี่!
LiraNuna

1
คุณจะไม่สูญเสียการพกพามากนักเมื่อใช้ JNI หากคุณยังคงสามารถรวบรวมไลบรารีดั้งเดิมบนแพลตฟอร์มที่คุณต้องการสนับสนุนได้ก็หมายความว่าคุณเพียงแค่ทำการพอร์ต / คอมไพล์ใหม่ 1% ของโค้ดแทนที่จะเป็นทั้งหมด คุณยังคงได้รับประโยชน์มากมายจากการพกพาของ Java
bgroenks

4

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


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

4

รายชื่อเอ็นจิ้นเกมใน Wikipedia แสดงเอ็นจิ้นเกมมากมายพร้อมด้วยภาษาโปรแกรมที่เขียนขึ้น

มีเอ็นจินเกม Java จำนวนมาก

เมื่อคลิกที่ลิงค์จะนำคุณไปสู่ตัวอย่างของเกมและการสาธิตที่เขียนด้วยภาษาจาวา นี่คือสองสาม:

สำหรับเกมและสถานการณ์บางอย่างการแลกเปลี่ยนของ Java อาจเป็นที่ยอมรับ


ฉันรู้ว่ามีเกมที่เขียนด้วย Java แต่นอกเหนือจากเกม Minecraft และ Runescape เกมเชิงพาณิชย์ที่สำคัญน้อยมากถูกเขียนขึ้นสำหรับแพลตฟอร์ม Java Java มีหนังสือ AAA กี่เล่ม และทำไมน้อย ดังนั้นคำถามของฉัน
Sasha Chedygov

3

.NET มีปัญหาเดียวกันกับ Java อย่างแน่นอนเมื่อพูดถึงประสิทธิภาพ 3D ที่เข้มข้น Microsoft ยังลงทุนเวลาและเงินในการพัฒนาห้องสมุดมากขึ้นเมื่อต้องทำงานกับการทำงานหนัก 3D

(... โดยส่วนตัวฉันคิดว่าพวกเขามีขาขึ้นเมื่อมันมาถึงความมหัศจรรย์ระหว่าง DirectX และ. NET)


2
  1. Java ช้าการยกของหนักส่วนใหญ่ไม่ได้จัดการโดย GPU ยังมีอนิเมชั่นฟิสิกส์และ AI ชน CPU ซึ่งทั้งหมดใช้เวลานานมาก

  2. Java ไม่มีอยู่บนคอนโซลและคอนโซลเป็นเป้าหมายหลักสำหรับเกมเชิงพาณิชย์ หากคุณใช้ Java บนพีซีคุณกำลังกำจัดความสามารถในการพอร์ตไปยังคอนโซลภายในเวลาและงบประมาณที่เหมาะสม

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

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


3
คุณสามารถใช้ JavaCL, JOCL หรือ APARAPI เพื่อถ่ายภาพจำนวนมากไปยัง GPU
bgroenks

2

ในความเป็นจริงมันเป็นไปได้มากสำหรับรหัสที่มีการจัดการในการทำเกม 3 มิติปัญหาคือเอ็นจิ้นด้านหลัง ด้วย. Net ในช่วงเวลาสั้น ๆ มีตัวจัดการ DirectX wrapper ไปยัง DirectX 9 โดย Microsoft นี่คือสิ่งที่เป็นนามธรรมก่อนที่ตอนนี้ XNA

เมื่อได้รับสิทธิ์การเข้าถึงโดยรวมของ DirectX API เกม. Net จะได้รับการปฏิบัติ ตัวอย่างที่ดีที่สุดที่ฉันรู้จักคือ www.entombed.co.uk ซึ่งเขียนใน VB.Net

น่าเสียดายที่ในแง่ของ Java มันขาดอย่างจริงจังส่วนใหญ่เป็นเพราะเหตุผลที่ DirectX ไม่พร้อมใช้งานสำหรับ Java และโปรแกรมเมอร์เกมรู้และเข้าใจ DirectX api - ทำไมเรียนรู้ api อื่นเมื่อคุณจะกลับไปที่ DirectX?


2

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


1

ฉันเดาว่าความเร็วยังคงเป็นปัญหาอยู่ Cross platform จะเป็นปัญหาหรือไม่เพราะคุณไม่รู้ว่าการ์ด 3d มีอะไรบ้างเมื่อคุณเขียนรหัส? จาวามีอะไรที่จะสนับสนุนการค้นพบความสามารถ 3 มิติอัตโนมัติหรือไม่? และฉันเดาว่ามีเครื่องมือที่ช่วยให้ง่ายต่อการย้ายเกมระหว่าง wii, xbox และ ps3 แต่แพงฉันจะพนัน

ps3 มีจาวาผ่านการสนับสนุนบลูเรย์ ตรวจสอบเว็บไซต์ bd-j


1

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

สตูดิโอพัฒนาเกมมักทำงานใกล้ชิดกับผู้จำหน่ายฮาร์ดแวร์ซึ่งให้การเข้าถึงอินเทอร์เฟซระดับต่ำของผลิตภัณฑ์ นี่คือโลกที่คุณต้องใช้ ASM และ C เพื่อการสื่อสารของอุปกรณ์ สภาพแวดล้อมเสมือนจริงจะทำให้ชิ้นส่วนโปรแกรมเหล่านี้ช้าลง

อย่างไรก็ตามเกม 3 มิติที่ทันสมัยในความเป็นจริงจะใช้ภาษาระดับสูงกว่า บ่อยครั้งที่คุณจะพบกับตรรกะของเกมที่เขียนในภาษาเช่น Lua หรือ Python แต่แกนกลาง (I / O, เธรด, การกำหนดตารางเวลา) ของเกม 3D ทั่วไปจะถูกเขียนในภาษาระดับต่ำในอีก 25 ปีข้างหน้าหรืออุปกรณ์ที่มีความยาวไม่อนุญาตให้ใช้นามธรรมและการจำลองเสมือนด้วยตัวเอง (ซึ่งจะเกิดขึ้น)


1

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

สิ่งหนึ่งที่ฉันต้องการเพิ่มคือมันยากที่จะดึงลูกเล่น DRM ที่น่ารังเกียจผ่านเครื่องเสมือน

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


0

Runescape โดย Jagex เขียนด้วย Java แท็ก "วิดีโอเกม" อาจไม่ได้นำมาใช้เป็นเกมออนไลน์โดยเฉพาะ แต่มีการติดตามที่เหมาะสม


ขออภัย แต่นี่ไม่ได้ตอบคำถามของฉันเลย
Sasha Chedygov

2
แต่คำสั่งที่ตาบอดของคำถามนำไปสู่การสันนิษฐานว่าไม่มีการเขียนเกมใน Java เพียงแค่ชี้ให้เห็นถึงกรณีที่ประสบความสำเร็จว่าอยู่ที่ไหน
Mark Schultheiss

0

มันถูกพูดถึงมากแล้วคุณสามารถค้นหาแม้กระทั่งบน Wiki เหตุผล ...

  • C / C ++ สำหรับเอ็นจิ้นเกมและเนื้อหาที่เข้มข้นทั้งหมด
  • Lua หรือ Python สำหรับการเขียนสคริปต์ในเกม
  • Java - ประสิทธิภาพที่แย่มาก, การใช้หน่วยความจำขนาดใหญ่ + ไม่มีใน Game Consoles (ใช้สำหรับเกมที่ง่ายมาก (ใช่ Runescape นับที่นี่ไม่ใช่ Battlefield หรือ Crysis หรืออื่น ๆ ) เพราะมี โปรแกรมเมอร์จำนวนมากที่รู้ภาษาการเขียนโปรแกรมนี้)
  • C # - การใช้งานหน่วยความจำขนาดใหญ่ (มันใช้สำหรับเกมง่ายๆบางเกมเพียงเพราะมีโปรแกรมเมอร์ค่อนข้างมากที่รู้ภาษาการเขียนโปรแกรมนี้)

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

ฉันจำบทความในเว็บไซต์ MIT ที่พวกเขาแสดงให้เห็นว่า C / C ++ สามารถทำอะไรถ้าคุณใช้ภาษาและคอมไพเลอร์ฟีเจอร์: ตัวคูณเมทริกซ์ (2 เมทริกซ์), 1 การนำไปใช้ใน Java และ 1 การนำไปใช้ใน C / C ++ พร้อมคุณสมบัติ C / C ++ และการเพิ่มประสิทธิภาพคอมไพเลอร์ที่เหมาะสมเปิดใช้งานการใช้งาน C / C ++ เร็วกว่าการใช้งานจาวา ~ ~ ~ ~ ~ ~ ~ ~ 260 260

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

แก้ไข : เนื่องจากมีคนถามบทความที่นี่ฉันค้นหาในที่เก็บถาวรของเว็บเพื่อรับสิ่งนั้นฉันหวังว่าคุณจะพอใจ ... MIT กรณีศึกษา

และเพื่อเพิ่มไม่ Java สำหรับเกมยังคงเป็นความคิดที่น่ากลัว ไม่กี่วันที่ผ่านมา บริษัท ขนาดใหญ่ที่ฉันจะไม่ตั้งชื่อให้เริ่มเขียนโปรแกรมไคลเอนต์เกมใหม่จาก Java ไปยัง C ++ เพราะเกมที่ง่ายมาก (ในแง่ของกราฟิก) ถูกปกคลุมด้วยความร้อนและแล็ปท็อป i7 กับ nVidia GT 5xx และ 6xx ไม่เพียงแค่ nVidia จุดนี้คือการ์ดที่ทรงพลังซึ่งสามารถจัดการกับการตั้งค่าสูงสุดของเกมใหม่ส่วนใหญ่และไม่สามารถจัดการกับเกมนี้ได้) และการใช้หน่วยความจำอยู่ที่ ~ 2.5 - 2.6 GB Ram สำหรับกราฟิกที่เรียบง่ายเช่นนี้มันต้องการสัตว์ร้ายของเครื่องจักร


10
คุณรู้น้อยมากเกี่ยวกับ Java runtime ที่ทันสมัยและเครื่องเสมือนจริง ๆ บทความที่คุณกล่าวถึงเป็นไปได้มากกว่าทศวรรษที่ผ่านมาหรือมากกว่านั้นแน่นอนว่าไม่มีใครรู้เพราะคุณไม่ได้อ้างถึง การรับรู้ของคุณเกี่ยวกับ Java ล้าสมัยแล้ว
bgroenks

2
ตกลงเพื่อให้การศึกษาพิสูจน์ว่าสำหรับการคูณเมทริกซ์ขนาดใหญ่ Java จะสูญเสียไปที่ C เมื่อมีการใช้การเข้าถึงอาร์เรย์แบบสองมิติเพื่อเข้าถึงข้อมูล ใช่ฉันก็จะเดาได้เช่นกัน และถ้านั่นเป็นปัญหาสำหรับคุณจริงๆซึ่งฉันสงสัยว่ามันจะเป็นเช่นนั้นนั่นคือเหตุผลที่คุณมี JNI ขอบเขตการตรวจสอบโอเวอร์เฮดสำหรับอาร์เรย์จะเพิ่มขึ้นในสถานการณ์นั้นแม้ว่ารหัส Java ของเขาอาจได้รับการปรับให้เหมาะสมเพื่อปรับปรุงผลลัพธ์อย่างมีนัยสำคัญ ฉันถามความเข้าใจของเขาเกี่ยวกับ JIT เมื่อเขากล่าวว่า "การรวบรวมที่เร็วขึ้น = ไม่ใช่รหัสที่ดีที่สุดที่สร้างขึ้น" ไปอ่านข้อมูลจำเพาะของ IBM เพื่อพิสูจน์เป็นอย่างอื่น
bgroenks

3
Java ไม่ใช่ตัวเลือกที่แย่สำหรับการพัฒนาเกม มีเกมที่ประสบความสำเร็จมากมายที่รัน Java โดยปกติแล้วคุณต้องการความช่วยเหลือเล็กน้อยจากเนทีฟโค้ด (โดยเฉพาะกับ LWJGL และอื่น ๆ ) เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด แต่ถ้าฉันต้องพอร์ตและคอมไพล์ใหม่ 1% ของรหัสแทนที่จะเป็น 100% นั่นฟังดูเป็นเรื่องที่ดีสำหรับฉัน
bgroenks

1
@bgroenks "100%" - ดูเหมือนว่าคุณไม่มีความคิดเกี่ยวกับ C / C ++ ... และเมื่อสร้างเกมคุณสามารถใช้ไลบรารีข้ามแพลตฟอร์ม (SDL และเครืออื่น) หรือกรอบ (ตัวอย่างเช่น Qt) ตัวอย่างเช่น: EA ใช้ Qt สำหรับเกมทุกเกมที่พวกเขามี ... Qt คือ WAY ข้ามแพลตฟอร์มมากกว่า Java และคอมไพล์เป็นรหัสเนทีฟ
Lilian A. Moraru

2
ฉันไม่เห็นจุดใน Java จริงๆเมื่อคุณมี Qt ฉันพบรหัส Qt ชัดเจนยิ่งขึ้นเข้าใจและบำรุงรักษาง่ายกว่าโค้ด Java เมื่อฉันถามเพื่อน ๆ ว่าทำไมพวกเขาถึงกลัว C ++ พวกเขามักจะบอกฉันเสมอว่าพวกเขาเกลียดตัวชี้และทำให้แน่ใจว่าได้จัดสรรคืนหน่วยความจำ ดูเหมือนว่าผู้คนจำนวนมากไม่รู้เกี่ยวกับ shared_ptr ใน C ++ ... สำหรับฉันแล้ว Qt และ C # .NET / C ++ .NET นั้นเป็นวิธีที่ดีที่สุดในการเขียนโค้ด Java มักจะมีความวุ่นวายมากยกเว้นการจัดการห้องสมุดมักจะล้าสมัยแล้ว (การทำดีส่วนใหญ่เฉพาะในฝั่งเซิร์ฟเวอร์ แต่ส่วนที่เหลือ ... ) และเอกสารที่ล้าสมัยบ่อยครั้ง
Lilian A. Moraru
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.