Java có phải là một lựa chọn tốt cho các trò chơi đa nền tảng không? [đóng cửa]


13

Tôi đang tìm cách tạo một trò chơi bằng Java và muốn nó hoạt động trên Windows, Linux và Mac. Tôi khá chắc chắn C # là một lựa chọn tồi cho việc này và tôi không có đủ kinh nghiệm về C hoặc C ++. Tôi muốn tránh xa Flash. Do đó, Java có phải là một lựa chọn tốt cho tôi không? Hầu hết, tôi sử dụng C # và nghĩ rằng Java tương tự nhau, vì vậy tôi cho rằng nó sẽ không khó học. Nhưng nó có đủ nhanh không? Có ngôn ngữ nào phù hợp với nhu cầu của tôi hơn Java không?


8
Phụ thuộc vào phong cách chơi mà bạn đang muốn làm. Tùy thuộc vào phong cách muốn, có thể là HTML5 và một số javascript sẽ hoạt động cho bạn, nếu không phải là java.
Patrick Hughes

Oddlab bán các trò chơi dựa trên Java, ví dụ: Trouble Tribe. Bạn có thể xem chi tiết về công cụ của họ tại lẻlabs.com/t Technology.php

5
Minecraft là một ví dụ tuyệt vời về một trò chơi đa nền tảng được viết bằng Java. Khi chàng trai của chúng ta có bạn bè trong một phiên Minecraft nghiêm túc, họ sẽ chơi nó trên OSX, Windows và Linux.
Kev

Hai năm sau, C # hiện khá tốt cho những thứ như vậy với sự trợ giúp của công cụ Unity và / hoặc Monogame, cả hai đều hỗ trợ iOS, Android và WP8.
Magus

Câu trả lời:


28

Java cực kỳ thích hợp để viết các trò chơi đa nền tảng. Ưu điểm chính:

  • Tính di động - Nói chung, bạn có thể viết một trò chơi Java và hy vọng nó sẽ chạy không thay đổi trên hầu hết các nền tảng. Đây có lẽ là tùy chọn di động nhất của bất kỳ ngôn ngữ nào - C / C ++ là tùy chọn có tính di động cao khác nhưng cần được biên dịch lại cho mỗi nền tảng và trong nhiều trường hợp, các thư viện có các tính năng cụ thể của nền tảng nhằm hạn chế tính di động.
  • Hiệu suất - Mã Java, nếu được viết tốt, sẽ thực hiện khá nhiều cũng như bất kỳ ngôn ngữ nào khác, bao gồm cả C / C ++. Trình biên dịch JVM JIT cực kỳ tốt. Bạn có thể viết một trò chơi chất lượng hàng đầu, thành công trong Java (ví dụ Minecraft).
  • Các thư viện - có rất nhiều thư viện có sẵn cho Java bao gồm hầu hết mọi tính năng bạn có thể muốn trong các trò chơi, từ kết nối mạng đến đồ họa đến âm thanh đến AI. Hầu hết các thư viện Java là nguồn mở.

Quyết định chính bạn sẽ phải đưa ra là khung GUI nào bạn sẽ sử dụng. Có khá nhiều lựa chọn khác nhau nhưng những lựa chọn nổi bật nhất là:

  • jMonkeyEngine - công cụ 3D hoàn chỉnh. Nếu bạn muốn tạo một trò chơi 3D thì đây có lẽ là sự lựa chọn tốt nhất của bạn - chứa nhiều tính năng của công cụ trò chơi như biểu đồ cảnh, tạo địa hình, v.v.
  • LWJGL - một thư viện cấp thấp hơn với quyền truy cập trực tiếp vào OpenGL. Có khả năng hấp dẫn bạn nếu bạn muốn hiệu suất tối đa và đừng ngại viết nhiều động cơ của bạn từ đầu.
  • Xoay - có ưu điểm là cực kỳ di động và được bao gồm trong thời gian chạy Java nên không cần phụ thuộc thêm. Điều này tốt cho các trò chơi 2D không chuyên sâu về đồ họa (trò chơi chiến lược, trò chơi bài, v.v.)
  • Slick - một thư viện trò chơi 2D dựa trên LWJGL. Có thể là tốt nếu bạn muốn viết một trò chơi 2D nhưng vẫn cần hiệu năng đồ họa tốt (trò chơi bắn súng, trò chơi nền tảng cuộn, v.v.)
  • JavaFX - được thiết kế cho các ứng dụng internet phong phú, gần giống như Flash. Có rất nhiều tính năng gọn gàng sẽ tốt cho các trò chơi mặc dù tôi chưa thấy nó được sử dụng nhiều. Đặc biệt, JavaFX 2.0 trông khá hứa hẹn.

Những nhược điểm chính của Java khi chơi game thực sự xoay quanh các "trường hợp cạnh" có thể sẽ không ảnh hưởng đến bạn nhưng có liên quan đến một số lớp trò chơi:

  • Tính khả dụng của công cụ 3D - mặc dù các công cụ và công cụ được liệt kê ở trên là tốt, nhưng chúng vẫn không tương xứng với mức độ của công cụ C / C ++ như Unreal Engine được sử dụng bởi các công ty trò chơi chuyên nghiệp. Vì vậy, Java có thể sẽ không phải là lựa chọn đầu tiên của bạn nếu bạn đang cố gắng phát triển một FPS lớn với ngân sách hàng triệu - C / C ++ vẫn chiến thắng ở đây.
  • Bộ sưu tập rác Java độ trễ của GC nói chung là một lợi ích rất lớn, nhưng nó có thể gây ra tạm dừng nhẹ khi chu kỳ GC xảy ra. Điều này đang trở nên tốt hơn nhiều với các JVM mới có độ trễ thấp, nhưng vẫn có thể là một vấn đề đối với các trò chơi có yêu cầu độ trễ rất thấp (có lẽ là game bắn súng góc nhìn người thứ nhất). Một cách giải quyết là sử dụng các thư viện có độ trễ thấp như http://javolution.org/ , tuy nhiên những thư viện này dường như được nhắm mục tiêu nhiều hơn ở các hệ thống giao dịch tần số cao hoặc thời gian thực thay vì các trò chơi.
  • Thiếu khả năng khai thác tối ưu hóa ở mức độ thấp - trong khi trình biên dịch Java JIT cực kỳ tốt, nó vẫn thi hành một số ràng buộc mà bạn không thể tránh (ví dụ: kiểm tra giới hạn trên mảng). Nếu bạn thực sự cần phải có quyền truy cập cấp mã máy riêng để tối ưu hóa loại điều này, thì một lần nữa bạn có thể sẽ thích C / C ++ hơn Java.

Lưu ý rằng cũng có một vài tùy chọn triển khai để xem xét:

  • Applet - chạy trong trình duyệt, rất thuận tiện cho người dùng, tuy nhiên các applet khá hạn chế trong những gì họ có thể làm vì lý do bảo mật. Lưu ý rằng bạn có thể ký các applet để nhận thêm các đặc quyền bảo mật, mặc dù điều này sẽ gây ra một lời nhắc hơi đáng sợ cho hầu hết người dùng.
  • Java Web Start - tốt hơn cho các trò chơi phức tạp hơn cần tải xuống cục bộ đầy đủ và cũng cần truy cập tài nguyên hệ thống cục bộ. Nó cũng hoạt động theo một cách khá độc lập với nền tảng. Có lẽ là con đường tốt nhất cho một trò chơi cỡ trung bình hoặc một cái gì đó cần phải thoát khỏi những hạn chế bảo mật của applet.
  • Tải xuống trình cài đặt - Bạn có thể viết trình cài đặt cho trò chơi Java giống như bất kỳ ngôn ngữ nào khác. Dĩ nhiên, việc cấu hình và kiểm tra sẽ tốn nhiều công sức hơn vì các trình cài đặt có xu hướng có một số tính năng dành riêng cho nền tảng.
  • Web - bạn có thể viết một ứng dụng web HTML5 và tận dụng sức mạnh của Java hoàn toàn ở phía máy chủ. Đáng để xem xét cho một trò chơi web nhiều người chơi.

Cuối cùng, cũng đáng để xem xét một số ngôn ngữ JVM khác - những ngôn ngữ này có tất cả các lợi ích của nền tảng Java được liệt kê ở trên, nhưng một số coi chúng là ngôn ngữ tốt hơn chính Java. Scala, Clojure và Groovy sẽ là những người nổi bật nhất và tất cả họ đều có thể sử dụng các công cụ và thư viện Java được liệt kê ở trên.


1
JWS không thực sự bổ sung nhiều hơn các applet ngoài việc tách ứng dụng của bạn khỏi trình duyệt. Trong cả hai trường hợp, tôi nghĩ bạn sẽ muốn ký mã của mình nếu bạn đang sử dụng thư viện OpenGL.
Peter Taylor

2
Tôi muốn nói rằng quyền truy cập hệ thống cục bộ là một "rất nhiều" vượt quá giới hạn của applet đối với nhiều trò chơi nghiêm trọng, đặc biệt là nhiều người chơi. HTML5 gọn gàng, nhưng nó vẫn là một babby nhỏ với sự hỗ trợ đáng chú ý và các bit quan trọng như GL và Sockets đã tắt trên nhiều trình duyệt, cộng với âm thanh chưa phù hợp để sử dụng trò chơi.
Patrick Hughes

1
@PatrickHughes, nếu bạn muốn truy cập hệ thống cục bộ từ JWS mà không cần các hộp thoại đáng sợ, bạn sẽ cần phải ký mã của mình - và một applet đã ký thường cũng sẽ có quyền truy cập hệ thống cục bộ.
Peter Taylor

Bạn cũng có thể sử dụng Cài đặt Inno để phân phối các trò chơi Java của mình.
Mahmoud Hossam

1
Bạn có thể thêm LIBGDX vào danh sách các gói giúp bạn viết công cụ của riêng bạn; nó có các thiết lập và tối ưu hóa JNI cho các nền tảng khác nhau và thậm chí cả Android và xuống OpenGL ES.
Patrick Hughes

4

Cả Minecraft và Blocks mà Matter đều được xây dựng bằng Java, vì vậy, nó rất tốt để làm game. Vấn đề chính bạn sẽ gặp phải khi sử dụng Java là chuyển sang nền tảng di động nếu bạn chọn đi theo tuyến đường đó và viết một ứng dụng gốc. Android là một loại Java SE thẳng thắn với một thư viện riêng. Blackberry của RIM sử dụng Java ME. Về lý thuyết, iOS có thể được lập trình bằng Java mặc dù Objective-C có thể là lựa chọn tốt hơn cho nền tảng đó.

Java khá giống với C #. Tôi thường thấy mã C # có thể hiểu được mặc dù chỉ biết Java. Họ có một triết lý thiết kế khác nhau nhưng theo như có thể triển khai rộng rãi với rắc rối tối thiểu cả hai đều phù hợp với dự luật. C # không phải là một lựa chọn tồi cho các trò chơi bởi dù việc triển khai trên thiết bị di động của bạn sẽ khó khăn hơn và việc triển khai lên các nền tảng không có cửa sổ sẽ tốn nhiều thời gian hơn hoặc khó khăn hơn tùy thuộc vào thư viện bên ngoài cụ thể nào và do đó bạn sẽ sử dụng.


1
Java trên thiết bị di động: biên dịch một lần, gỡ lỗi ở mọi nơi: '(.
Deadalnix

0

Cách rõ ràng nhất và ít kháng cự nhất là sử dụng kết hợp HTML5 + javascript. Bất kỳ ứng dụng hoặc trò chơi nào được thực hiện bằng cách này sẽ chạy trên hầu hết mọi thiết bị và trình duyệt.

Ưu điểm : - Bạn sẽ cần cấu hình bằng 0 để trò chơi của bạn chạy trên nhiều nền tảng và thiết bị khác nhau.

LƯU Ý: - Tôi đã thấy một số trò chơi được xây dựng bằng các công nghệ nói trên nhưng chúng nhỏ hơn về tầm vóc. Nhưng, tôi cho rằng nếu người ta có thể làm bơ ra khỏi sữa thì phô mai không phải là không thể


0

Bạn có thể sử dụng Scala và Scheme Bigloo trên Eclipse để sử dụng JVM cho mã được nhấn mạnh hoặc hành động song song trong trò chơi Java của bạn.

Với Thiết kế mẫu và UML2, bạn cũng có thể bảo mật mã bằng OCL, tất cả đều nằm trong Topcasing.org.

Nắm vững các công cụ đó cần có thời gian, nhưng chúng là nền tảng của Java, cơ sở sẽ đẩy bạn lên hàng đầu.


-10

Câu trả lời ngắn gọn: không.

Java không tạo ra một tệp thực thi nhị phân mà chỉ có mã byte như C # (CLI) và đây không phải là một điều tốt cho doanh nghiệp nghiêm túc trong "môi trường mở" vì hai lý do chính:

  • xác suất bị mắc kẹt trong việc tham gia ngược là rất cao, đặc biệt là với các ngôn ngữ cũ và thực sự nổi tiếng như Java
  • bạn không có toàn quyền kiểm soát các hiệu năng của máy, trong trường hợp Java, JVM đóng vai trò lớn trong việc kiểm soát hoàn toàn.

Tất nhiên mỗi ngôn ngữ đều có thư viện riêng nhưng do số lượng lớn chúng cho mỗi ngôn ngữ nên đây không phải là vấn đề thực sự và tôi không nghĩ đó là mục đích của chủ đề này.

Có thể ở cấp độ chuyên nghiệp, bạn có thể tìm thấy thứ gì đó có thể phá vỡ quy tắc như dev-Kit có thể dịch tất cả các câu lệnh C # thành mã lắp ráp cho một cỗ máy trong thế giới thực, nhưng nếu cách tiếp cận này không nằm trong các thẻ bạn buộc phải sử dụng chỉ xem xét C và C ++ cho sự phát triển của bạn khi bạn định bán sản phẩm của mình trong môi trường mở.

Các thiết bị di động có một chút khác biệt bởi vì chúng là "môi trường khép kín", ngay cả Android cũng bị đóng cửa một cách thận trọng vì thực tế là nguồn ROM thế giới thực thường không có sẵn cho công chúng, Android có thể được coi là mã nguồn mở nhưng 99 % ROM trên thiết bị thực tế không có. Trong trường hợp này, bạn không thể tranh luận quá nhiều, mọi thứ đã được đặt cho bạn và mọi nền tảng đều có ngôn ngữ riêng như mọi người đều biết.

Cuối cùng, nếu bạn định bán sản phẩm này trong môi trường mở, tôi chỉ có thể đề xuất các ngôn ngữ có thể tạo mã được biên dịch và mã nhị phân / lắp ráp, trong môi trường kín, quyết định dễ thực hiện hơn vì những lý do khác nhau.


7
Bạn dường như tin rằng các nhị phân được biên dịch khó tạo ra kỹ thuật đảo ngược hơn các nhị phân mã byte. Có thể có một chút sự thật trong đó, nhưng không nhiều. Trên thực tế, có lẽ nhiều người có thể làm việc với trình phân tách x86 và x64 hơn so với mã byte CLI hoặc Java và bạn sẽ ngạc nhiên về việc một công cụ như IDA Pro có thể hữu ích như thế nào (từ chối trách nhiệm - Tôi đã không sử dụng nó vì phiên bản miễn phí khá nhiều năm trước - bây giờ có lẽ còn dễ hơn nữa). Một tập tin mã byte bị xáo trộn thậm chí có thể khó hơn để thiết kế ngược và, trong mọi trường hợp, hầu hết mọi người sẽ có ít lý do để quan tâm.
Steve314

2
Tại sao ít lý do để quan tâm? Chà, có bao nhiêu người viết công cụ trò chơi độc quyền cấp thấp của riêng họ? Và ngay cả khi bạn làm điều đó, tỷ lệ mà ai đó thà lấy cắp của bạn (cần kỹ thuật đảo ngược, không có bất kỳ loại tài liệu nào, v.v. - rất nhiều thời gian lãng phí ở đó, bất kể ngôn ngữ phát triển là gì) thay vì sử dụng hợp pháp tài liệu nguồn mở miễn phí tốt? Vi phạm bản quyền của toàn bộ chương trình là mối quan tâm thực sự có khả năng cao hơn nhiều so với kỹ thuật đảo ngược để đánh cắp các ý tưởng mã, và những tên cướp biển dường như không bị cản trở một chút bởi mã được biên dịch riêng.
Steve314

1
Về mức độ trừu tượng hóa, các lệnh JVM ở mức cực kỳ thấp - không chính xác như trong phần cứng, nhưng về cơ bản chỉ là loại bỏ khỏi sự trừu tượng của lớp ứng dụng. Trong đó các lớp số lượng trừu tượng nằm trong các thư viện Java tiêu chuẩn, có nghĩa là thực sự có vài lớp giữa nền tảng và ứng dụng cuối cùng. Ngoại trừ điều đó thường xảy ra trong C và C ++ (tại sao lại phát minh lại libpng, v.v.) - hầu hết mọi người sẽ sử dụng các thư viện phổ biến tạo thành một tập hợp các nền tảng được biết đến rộng rãi và các công cụ kỹ thuật đảo ngược tốt có thể nhận ra chúng.
Steve314

3
Để đáp ứng các yêu cầu, tất cả các mã sẽ phải xuất xưởng trên đồ họa và được bọc trong epoxy. Thật ngạc nhiên, ngay cả các gói chip hộp đen cũng có thể và được thiết kế ngược mọi lúc. Sau đó, ngay cả những gã khổng lồ hùng mạnh như Intel cũng giới thiệu các lỗi trong các gói CPU của họ, do đó, hộp đen phần cứng được nhúng epoxy của bạn vẫn sẽ bị ảnh hưởng khi tiếp xúc với các thư viện phần cứng. Cuối cùng, cuộc gọi đến bảo mật bằng cách tối nghĩa, không hoạt động. Reductio ad absurdum, tôi biết, nhưng đó là câu trả lời ban đầu.
Patrick Hughes

3
Thật không may, tôi không có đủ danh tiếng để hạ bệ bạn. Tất cả các lập luận của bạn đều thất bại. Có những người giải mã, dịch ngược và hack các trò chơi được sản xuất bằng C, C ++ hoặc bất kỳ ngôn ngữ nào, vì vậy, là một gói nhị phân sẽ không cung cấp bảo mật bổ sung. Hơn nữa, nếu OP quan tâm đến vấn đề này, có rất nhiều trình giải mã java rất tốt ngoài kia. Về kiểm soát hoàn toàn hiệu năng của máy, hầu hết các lập trình viên C và C ++ đều không có điều này, chỉ cần viết mã tốt và trình biên dịch sẽ tối ưu hóa những gì cần thiết. Và ngay cả khi đó là một vấn đề, bạn có thể sử dụng JNI hoặc JNA.
Victor Stafusa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.