Java เป็นตัวเลือกที่ดีสำหรับเกมข้ามแพลตฟอร์มหรือไม่? [ปิด]


13

ฉันต้องการสร้างเกมใน Java และต้องการให้ทำงานบน Windows, Linux และ Mac ฉันค่อนข้างมั่นใจว่า C # เป็นตัวเลือกที่ไม่ดีสำหรับเรื่องนี้และฉันไม่มีประสบการณ์เพียงพอใน C หรือ C ++ ฉันต้องการอยู่ห่างจาก Flash ดังนั้น Java เป็นตัวเลือกที่ดีสำหรับฉันหรือไม่ ส่วนใหญ่ฉันใช้ C # และคิดว่า Java คล้ายกันดังนั้นฉันคิดว่ามันจะไม่เป็นการยากที่จะเรียนรู้ แต่มันเร็วพอหรือไม่? มีภาษาที่เหมาะกับความต้องการของฉันมากกว่า Java หรือไม่?


8
ขึ้นอยู่กับรูปแบบของเกมที่คุณต้องการทำ ขึ้นอยู่กับสไตล์ที่ต้องการอาจเป็นได้ว่า HTML5 และจาวาสคริปต์บางอย่างจะทำงานให้คุณถ้าไม่ใช่จาวา
Patrick Hughes

Oddlab ขายเกมที่ใช้ Java เช่น Tribal Trouble คุณสามารถดูรายละเอียดของเครื่องยนต์ได้ที่oddlabs.com/technology.php

5
Minecraft เป็นตัวอย่างที่ยอดเยี่ยมของเกมข้ามแพลตฟอร์มที่เขียนด้วย Java เมื่อเด็กหนุ่มของเรามีเพื่อนร่วมทีมของเขาสำหรับการเล่นเกม Minecraft อย่างจริงจังพวกเขาเล่นบน OSX, Windows และ Linux
Kev

อีกสองปีต่อมา C # ตอนนี้ค่อนข้างดีสำหรับสิ่งต่าง ๆ ด้วยความช่วยเหลือของ Unity engine และ / หรือ Monogame ซึ่งทั้งสองรองรับ iOS, Android และ WP8
Magus

คำตอบ:


28

Java เหมาะอย่างยิ่งสำหรับการเขียนเกมข้ามแพลตฟอร์ม ข้อได้เปรียบหลัก:

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

การตัดสินใจหลักที่คุณจะต้องทำคือกรอบของ GUI ที่คุณจะใช้ มีตัวเลือกที่แตกต่างกันค่อนข้างน้อย แต่ตัวที่โดดเด่นที่สุดคือ:

  • jMonkeyEngine - เอนจิ้น 3 มิติที่สมบูรณ์ หากคุณต้องการสร้างเกม 3 มิติน่าจะเป็นทางเลือกที่ดีที่สุดของคุณ - ประกอบด้วยคุณสมบัติเอ็นจิ้นเกมมากมายเช่นกราฟฉากการสร้างภูมิประเทศเป็นต้น
  • LWJGL - ไลบรารี่ระดับต่ำที่เข้าถึง OpenGL ได้โดยตรง มีแนวโน้มที่จะดึงดูดความสนใจของคุณหากคุณต้องการประสิทธิภาพสูงสุดและไม่สนใจที่จะเขียนเอนจินมากมายตั้งแต่เริ่มต้น
  • สวิง - มีข้อดีของการพกพาอย่างมากและรวมอยู่ในรันไทม์ของจาวาดังนั้นจึงไม่จำเป็นต้องมีการพึ่งพาเป็นพิเศษ เหมาะสำหรับเกม 2D ที่ไม่เน้นกราฟิก (เกมวางแผนเกมไพ่ ฯลฯ )
  • Slick - ห้องสมุดเกม 2D ที่มีพื้นฐานจาก LWJGL อาจดีถ้าคุณต้องการเขียนเกม 2D แต่ยังต้องการประสิทธิภาพกราฟิกที่ดี (shoot-em-ups, เกมแพลตฟอร์มการเลื่อน ฯลฯ )
  • JavaFX - ออกแบบมาสำหรับแอปพลิเคชันอินเทอร์เน็ตที่มีความสมบูรณ์เช่นเดียวกับ Flash มีคุณสมบัติที่เป็นระเบียบมากมายที่จะดีสำหรับเกมแม้ว่าฉันจะไม่ได้เห็นมันใช้งานมาก โดยเฉพาะ JavaFX 2.0 นั้นดูค่อนข้างมีแนวโน้ม

ข้อเสียเปรียบหลักสำหรับ Java สำหรับเกมอยู่รอบ ๆ "คดีขอบ" ที่อาจจะไม่ส่งผลกระทบต่อคุณ แต่มีความเกี่ยวข้องกับเกมบางประเภท:

  • ความพร้อมใช้งานของเอ็นจิ้น 3 มิติ - แม้ว่าเครื่องมือและเอ็นจิ้นด้านบนนั้นดี แต่ก็ยังไม่ถึงระดับของ C / C ++ เอ็นจิ้นเช่น Unreal Engine ที่ใช้โดย บริษัท เกมมืออาชีพ ดังนั้น Java อาจไม่เป็นตัวเลือกแรกของคุณหากคุณพยายามพัฒนา FPS สำคัญด้วยงบประมาณหลายล้าน - C / C ++ ยังคงชนะที่นี่
  • การรวบรวมขยะGC latency Java เป็นประโยชน์อย่างมากโดยรวม แต่อาจทำให้หยุดชั่วคราวได้เล็กน้อยเมื่อเกิดรอบ GC นี่จะดีขึ้นมากเมื่อใช้ JVM แบบความล่าช้าต่ำใหม่ แต่ก็ยังสามารถเป็นปัญหาสำหรับเกมที่มีความต้องการเวลาแฝงที่ต่ำมาก (อาจเป็นนักกีฬาคนแรก) วิธีแก้ปัญหาคือการใช้ไลบรารีเวลาแฝงต่ำเช่นhttp://javolution.org/แต่สิ่งเหล่านี้ดูเหมือนจะถูกกำหนดเป้าหมายเพิ่มเติมที่การซื้อขายความถี่สูงหรือระบบเรียลไทม์มากกว่าเกม
  • การขาดความสามารถในการใช้ประโยชน์จากการเพิ่มประสิทธิภาพระดับต่ำ - ในขณะที่คอมไพเลอร์ Java JIT นั้นยอดเยี่ยมมาก แต่ก็ยังบังคับใช้ข้อ จำกัด บางอย่างที่คุณไม่สามารถหลีกเลี่ยงได้ (ตัวอย่างเช่นการตรวจสอบขอบเขตบนอาร์เรย์) หากคุณจำเป็นต้องเข้าถึงระดับรหัสเครื่องดั้งเดิมเพื่อเพิ่มประสิทธิภาพของสิ่งนี้ออกไปจากนั้นอีกครั้งคุณอาจจะชอบ C / C ++ มากกว่า Java

โปรดทราบว่ายังมีตัวเลือกการปรับใช้ไม่กี่ตัวที่ต้องพิจารณา:

  • Applet - ทำงานในเบราว์เซอร์สะดวกมากสำหรับผู้ใช้อย่างไรก็ตามแอปเพล็ตค่อนข้าง จำกัด ในสิ่งที่พวกเขาสามารถทำได้ด้วยเหตุผลด้านความปลอดภัย โปรดทราบว่าคุณสามารถลงชื่อแอปเพล็ตเพื่อรับสิทธิ์การรักษาความปลอดภัยพิเศษแม้ว่าจะทำให้ผู้ใช้ส่วนใหญ่แจ้งเตือนที่น่ากลัวเล็กน้อย
  • Java Web Start - ดีกว่าสำหรับเกมที่มีความซับซ้อนยิ่งขึ้นซึ่งต้องการการดาวน์โหลดแบบโลคัลและจำเป็นต้องเข้าถึงทรัพยากรระบบในท้องถิ่น นอกจากนี้ยังทำงานในวิธีที่ไม่ขึ้นกับแพลตฟอร์ม อาจเป็นเส้นทางที่ดีที่สุดสำหรับเกมขนาดกลางหรือสิ่งที่ต้องการหลีกเลี่ยงข้อ จำกัด ด้านความปลอดภัยของแอปเพล็ต
  • ดาวน์โหลดตัวติดตั้ง - คุณสามารถเขียนโปรแกรมติดตั้งสำหรับเกม Java ได้เช่นเดียวกับภาษาอื่น มันค่อนข้างทำงานได้มากขึ้นในการกำหนดค่าและทดสอบเนื่องจากตัวติดตั้งมักจะมีคุณสมบัติเฉพาะของแพลตฟอร์ม
  • เว็บ - คุณสามารถเขียนเว็บแอปพลิเคชัน HTML5 และใช้ประโยชน์จากความแข็งแกร่งของ Java ได้อย่างหมดจดบนฝั่งเซิร์ฟเวอร์ มีมูลค่าการพิจารณาสำหรับเกมบนเว็บที่มีผู้เล่นหลายคน

ท้ายที่สุดมันก็คุ้มค่าที่จะพิจารณาภาษา JVM อื่น ๆ - สิ่งเหล่านี้มีประโยชน์ทั้งหมดของแพลตฟอร์ม Java ที่กล่าวถึงข้างต้น แต่บางคนคิดว่าพวกเขาเป็นภาษาที่ดีกว่า Java Scala, Clojure และ Groovy จะเป็นคนที่โดดเด่นที่สุดและพวกเขาสามารถใช้ประโยชน์จากเครื่องมือและไลบรารี Java ที่กล่าวถึงข้างต้น


1
JWS ไม่ได้เพิ่มแอพเล็ตอื่น ๆ นอกเหนือจากการแยกแอปของคุณออกจากเบราว์เซอร์ ในทั้งสองกรณีฉันคิดว่าคุณต้องการลงชื่อรหัสของคุณหากคุณใช้ห้องสมุด OpenGL
Peter Taylor

2
ฉันจะบอกว่าการเข้าถึงระบบในท้องถิ่นนั้นเป็นข้อ จำกัด ของแอปเพล็ตสำหรับเกมร้ายแรงหลายเกมโดยเฉพาะอย่างยิ่งผู้เล่นหลายคน HTML5 นั้นเนี้ยบ แต่ก็ยังคงเป็น babby ด้วยการสนับสนุนที่ขาด ๆ หาย ๆ และบิตที่สำคัญเช่น GL และ Sockets ถูกปิดลงในเบราว์เซอร์จำนวนมากรวมถึงเสียงยังไม่เหมาะสำหรับการใช้เกม
Patrick Hughes

1
@PatrickHughes หากคุณต้องการให้ระบบภายในเครื่องเข้าถึงจาก JWS โดยไม่ต้องมีกล่องโต้ตอบที่น่ากลัวขนาดใหญ่คุณจะต้องลงชื่อรหัสของคุณ - และแอปเพล็ตที่ลงนามแล้วมักจะมีการเข้าถึงระบบภายในด้วยเช่นกัน
Peter Taylor

คุณสามารถใช้Inno Setupเพื่อแจกจ่ายเกม Java ของคุณ
Mahmoud Hossam

1
คุณสามารถเพิ่ม LIBGDX ไปยังรายการแพ็คเกจที่ช่วยคุณในการเขียนโปรแกรมของคุณเอง มีการตั้งค่าและปรับแต่ง JNI สำหรับแพลตฟอร์มต่าง ๆ และแม้แต่ Android และจนถึง OpenGL ES
Patrick Hughes

4

Minecraft และ Blocks ที่ Matter นั้นสร้างขึ้นใน Java ดังนั้นใช่มันดีสำหรับการทำเกม ปัญหาหลักที่คุณจะพบในขณะที่ใช้ Java กำลังย้ายไปยังแพลตฟอร์มมือถือหากคุณเลือกที่จะไปเส้นทางนั้นและเขียนแอปเนทีฟ Android เป็น Java SE ที่มีโครงสร้างแบบแฟรงเกนที่มีไลบรารีแยกต่างหาก Blackberry ของ RIM ใช้ Java ME ในทางทฤษฎี iOS สามารถตั้งโปรแกรมด้วย Java แต่ Objective-C น่าจะเป็นทางเลือกที่ดีกว่าสำหรับแพลตฟอร์มนั้น

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


1
Java บนมือถือ: คอมไพล์หนึ่งครั้งตรวจแก้จุดบกพร่องทุกที่: '(.
deadalnix

0

วิธีที่ชัดเจนและทนน้อยที่สุดคือการใช้คอมโบ HTML5 + javascript แอปพลิเคชันหรือเกมที่ใช้สิ่งนี้จะทำงานในเกือบทุกอุปกรณ์และเบราว์เซอร์

ข้อได้เปรียบ : - คุณจะต้องไม่มีการกำหนดค่าสำหรับการทำให้เกมของคุณทำงานบนแพลตฟอร์มและอุปกรณ์ต่าง ๆ

หมายเหตุ: -ฉันเคยเห็นเกมไม่กี่เกมที่สร้างขึ้นโดยใช้เทคโนโลยีที่กล่าวมาข้างต้น แต่มีขนาดเล็กกว่า แต่ฉันคิดว่าถ้าใครสามารถทำให้เนยออกมาจากนมเนยก็เป็นไปไม่ได้


0

คุณสามารถใช้Scalaและ Scheme Biglooบน Eclipse เพื่อใช้ JVM สำหรับรหัสเครียดหรือแอ็คชั่นแบบขนานในเกม Java ของคุณ

ด้วยการออกแบบรูปแบบและ UML2 คุณสามารถรักษาความปลอดภัยรหัสด้วย OCL ทั้งหมดนี้อยู่ใน Topcased.org

การเรียนรู้เครื่องมือเหล่านี้ต้องใช้เวลา แต่เป็นพื้นหลังของ Java ซึ่งเป็นฐานที่จะผลักคุณที่ด้านบน


-10

คำตอบสั้น ๆ : ไม่

Java ไม่ได้สร้างไบนารีที่ปฏิบัติการได้ แต่ bytecode อย่าง C # ทำ (CLI) เท่านั้นและนี่ไม่ใช่สิ่งที่ดีสำหรับธุรกิจที่จริงจังใน "สภาวะแวดล้อมที่เปิด" ด้วยเหตุผลสองประการ:

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

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

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

สิ่งที่แตกต่างกันเล็กน้อยสำหรับอุปกรณ์มือถือเพราะพวกเขาเป็น "สภาพแวดล้อมที่ปิด" แม้ Android จะปิด pratically พิจารณาข้อเท็จจริงที่ว่าแหล่งที่มาของ ROM โลกแห่งความจริงมักจะไม่สามารถใช้ได้กับสาธารณะ Android อาจได้รับการพิจารณา opensource แต่ 99 % ของ ROMs ในอุปกรณ์จริงไม่ใช่ ในกรณีนี้คุณไม่สามารถโต้แย้งได้มากเกินไปทุกอย่างถูกตั้งค่าไว้แล้วสำหรับคุณและทุกแพลตฟอร์มมีภาษาของตัวเองเหมือนที่ทุกคนรู้

ในที่สุดหากคุณกำลังจะขายผลิตภัณฑ์นี้ในสภาพแวดล้อมที่เปิดฉันสามารถแนะนำภาษาที่สามารถสร้างรหัสคอมไพล์และไบนารี / แอสเซมบลีเท่านั้นในสภาพแวดล้อมที่ปิดการตัดสินใจง่ายกว่าด้วยเหตุผลที่แตกต่างกัน


7
คุณดูเหมือนจะเชื่อว่าไบนารีที่รวบรวมนั้นยากต่อการทำวิศวกรรมย้อนกลับมากกว่าไบนาโคดโค้ด อาจมีความจริงเล็กน้อยในเรื่องนั้น แต่ไม่มาก ในความเป็นจริงผู้คนจำนวนมากสามารถทำงานกับ x86 และ x64 disassembler ได้มากกว่า CLI หรือ Java bytecode และคุณจะประหลาดใจว่าเครื่องมือเช่น IDA Pro นั้นมีประโยชน์มากเพียงใด (ข้อจำกัดความรับผิดชอบ - ฉันไม่ได้ใช้มันตั้งแต่รุ่นฟรี ปีที่แล้ว - ตอนนี้อาจจะง่ายกว่านี้อีก) ไฟล์ bytecode ที่สับสนอาจจะยากที่จะทำวิศวกรรมย้อนกลับและในกรณีใด ๆ คนส่วนใหญ่จะมีเหตุผลเพียงเล็กน้อยที่จะดูแล
Steve314

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

1
ในระดับของ abstraction คำสั่ง JVM อยู่ในระดับต่ำมาก - ไม่แม่นยำเหมือนในฮาร์ดแวร์ แต่โดยทั่วไปแล้วจะถูกลบออกไปจากนามธรรมของเลเยอร์แอพพลิเคชั่น เมื่อจำนวนเลเยอร์ของ abstraction นับอยู่ในไลบรารี Java มาตรฐานหมายความว่ามีเลเยอร์น้อยมากระหว่างแพลตฟอร์มและแอปพลิเคชันสุดท้าย ยกเว้นว่าปกติจะเกิดขึ้นใน C และ C ++ ต่อไป (เหตุใดจึงต้องใส่ซ้ำ libpng เป็นต้น) - คนส่วนใหญ่จะใช้ไลบรารีทั่วไปซึ่งเป็นชุดของแพลตฟอร์มที่รู้จักอย่างกว้างขวางและเครื่องมือย้อนกลับวิศวกรรมที่ดีสามารถจดจำพวกเขาได้
Steve314

3
เพื่อตอบสนองความต้องการรหัสทั้งหมดจะต้องจัดส่งบน FPGA และห่อหุ้มในอีพ็อกซี่ เซอร์ไพรส์แม้กระทั่งแพ็คเกจชิปกล่องดำก็สามารถทำวิศวกรรมย้อนกลับได้ตลอดเวลา จากนั้นแม้ยักษ์ใหญ่อย่าง Intel ก็จะแนะนำบั๊กในแพ็คเกจ CPU ดังนั้นอีพ็อกซี่ของคุณจึงฝังตัวกล่องดำของฮาร์ดแวร์จะยังคงได้รับผลกระทบจากการสัมผัสกับไลบรารีฮาร์ดแวร์ ในที่สุดการโทรเพื่อความปลอดภัยโดยความสับสนก็ไม่ได้ผล Reductio ad absurdum ฉันรู้ แต่ก็เป็นคำตอบเดิม
Patrick Hughes

3
น่าเสียดายที่ฉันไม่มีชื่อเสียงพอที่จะลงคะแนนให้คุณ อาร์กิวเมนต์ของคุณทั้งหมดล้มเหลว มีผู้คนมากมายที่ถอดรหัสถอดรหัสคอมไพล์และแฮ็คเกมที่สร้างใน C, C ++ หรือภาษาใด ๆ ดังนั้นการเป็นแพคเกจไบนารีจะไม่ให้ความปลอดภัยเพิ่มเติมมากนัก นอกจากนี้ถ้าหาก OP เกี่ยวข้องกับเรื่องนี้จะมี Java obfuscators ที่ดีมากอยู่ที่นั่น เกี่ยวกับการควบคุมประสิทธิภาพของเครื่องจักรโปรแกรมเมอร์ C และ C ++ ส่วนใหญ่ไม่มีคุณสมบัตินี้เพียงแค่เขียนโค้ดที่ดีและคอมไพเลอร์จะปรับให้เหมาะสมสิ่งที่จำเป็น และแม้ว่าจะเป็นปัญหาคุณก็สามารถใช้ JNI หรือ JNA ได้
Victor Stafusa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.