Tại sao Java không được sử dụng rộng rãi hơn để phát triển trò chơi? [đóng cửa]


77

Tôi không phải là nhà phát triển trò chơi hay bất cứ điều gì, nhưng tôi biết rằng Java không được sử dụng rộng rãi để phát triển trò chơi. Java phải đủ nhanh cho hầu hết các trò chơi, vậy thì bắt ở đâu? Tôi có thể nghĩ ra một số lý do:

  • Thiếu các nhà phát triển trò chơi có chuyên môn về Java
  • Thiếu khung phát triển trò chơi tốt
  • Các lập trình viên không muốn chấp nhận Java như một ngôn ngữ lập trình trò chơi. Hầu hết chỉ chấp nhận C ++ như vậy?
  • Không hỗ trợ cho bảng điều khiển trò chơi (mặc dù thị trường PC vẫn tồn tại)

Nó tất nhiên có thể là một cái gì đó khác. Ai đó có thể hiểu rõ hơn về doanh nghiệp hơn tôi có thể giải thích tại sao Java không có được động lực khi phát triển trò chơi không?


37
Và bây giờ hãy đợi tất cả các câu trả lời "Java chậm, C ++ là nhanh" mà thực sự chỉ chạm vào bề mặt của vấn đề theo một cách quá rộng và hoàn toàn chính xác. Xin lưu ý rằng những người trả lời theo cách này gần như chắc chắn không phải là nhà phát triển trò chơi chuyên nghiệp.
Ed S.

20
Trong thực tế, Java được sử dụng để phát triển trò chơi; tức là trong thị trường di động. Java, Android.
user281377

21
Tại sao nó nên được sử dụng? Java cung cấp cho nhà phát triển trò chơi những gì mà các ngôn ngữ được sử dụng rộng rãi hơn không có? Java cung cấp một hệ sinh thái vô cùng phong phú cho các nhà phát triển ứng dụng kinh doanh, vượt trội hơn những thiếu sót của nó như một ngôn ngữ, nhưng khi nói đến phát triển trò chơi, nền tảng Java cung cấp các công cụ nhỏ so với một số lựa chọn thay thế.
back2dos

14
Thật thú vị, Minecraft dựa trên Java.
Uri

5
@Coder Có vẻ như mã C ++ đã được tối ưu hóa rất nhiều, nhưng mã Java thì không. Vì vậy, đó là một so sánh không hợp lệ.
Izkata

Câu trả lời:


94

Nhiều lý do:

  • Ngày xưa, bạn cần "truy cập trực tiếp" cho hiệu suất và giao diện người dùng. Điều này có trước các ngôn ngữ VM như Java và C #.
  • Hầu hết các bảng điều khiển (ví dụ: 360, PS3) không có JVM, vì vậy bạn không thể sử dụng lại mã từ phiên bản PC. Việc biên dịch mã C ++ để hỗ trợ các thiết bị khác nhau sẽ dễ dàng hơn nhiều.
  • Hầu hết các công cụ trò chơi chính thống (ví dụ: Unreal) có các ràng buộc C ++. Có một số trình kết nối Java (ví dụ, đối với OpenGL) nhưng không có gì giống như vậy.
  • Đối với chơi game trên PC, DirectX không thực sự có hỗ trợ Java mạnh (nếu có).
  • Các trò chơi dựa trên web chạy bằng JavaScript hoặc Flash. Bạn có thể viết chúng bằng Java mặc dù sử dụng những thứ như GWT.
  • IPhone chạy một biến thể Objective-C.

Ngày nay, Java chủ yếu được sử dụng trong các trò chơi Android, đơn giản vì đây là ngôn ngữ chính cho nền tảng đó.


14
+1 "Hầu hết các bảng điều khiển (ví dụ: 360, PS3) không có JVM, do đó bạn không thể sử dụng lại mã từ phiên bản PC. Việc biên dịch mã C ++ để hỗ trợ các thiết bị khác nhau sẽ dễ dàng hơn nhiều" Nếu thiết bị không có thời gian chạy , bạn sẽ không thấy các trò chơi được phát triển dựa trên thời gian chạy không khả dụng đó. Xbox 360 và điện thoại Windows đã quản lý thời gian chạy .Net, vì vậy việc phát triển trò chơi bằng cách sử dụng chúng là có thể và có thể là một xu hướng đang phát triển. Tuy nhiên, vì thời gian chạy không nằm trên các nền tảng chính khác (PS3 và ở mức độ thấp hơn nhiều, Wii), thật khó để biện minh cho một cơ sở mã hoàn toàn tách biệt. Nó thực sự không phải là một vấn đề hiệu suất.
JustinC

2
Nó được gọi là XNA, hiện là tập hợp con của khung .Net 2.0. Có một số khung thú vị khác trong tự nhiên: MonoXNA, MonoTouch và XnaTouch trong số những khung khác.
JustinC

7
Không thể dự đoán hiệu năng với JVM.
Klaim

5
Điểm rất tốt. Tuy nhiên, tôi muốn thêm một thực tế rằng GC có thể gây ra tạm dừng / tải không thể đoán trước. Nếu đây không phải là vấn đề đối với các ứng dụng máy chủ, thì đó là trò chơi thời gian thực. Điều này là ví dụ có thể nhìn thấy trong minecraft.
deadalnix

2
@Klaim Điều đó cũng không thể xảy ra với mallochoặc new, vì vậy nếu đó là mối lo ngại thì bạn sẽ thực hiện gộp chung bất kể điều gì. Không liên quan đến điểm đó, một vấn đề lớn với Java là nó không hỗ trợ các loại giá trị, không giống như C #.
Doval

80

Lý do kỹ thuật:

  • Hầu hết các công cụ trò chơi 3D tốt nhất được viết bằng C / C ++. Đây là một vấn đề lớn, vì hầu hết các nhà phát triển trò chơi không muốn thỏa hiệp trên công cụ 3D của họ, nhưng họ cũng không muốn viết từ đầu. Java có jMonkeyEngine là mã nguồn mở và thực sự rất tốt nhưng nó vẫn chưa thể cạnh tranh với Unreal Engine .
  • Đối với một số trường hợp rất hiếm gặp, có những lợi thế trong việc "gần với kim loại" bằng ngôn ngữ C hoặc ngôn ngữ lắp ráp, đặc biệt để truy cập vào các tính năng phần cứng đặc biệt. Điều này không quá quan trọng hiện nay, nhưng các nhà phát triển game chuyên nghiệp vẫn muốn có tùy chọn .....
  • Java có một rác được thu thập , quản lý thời gian chạy. 99% thời gian này là một lợi thế rất lớn, nó chắc chắn làm cho việc mã hóa dễ dàng hơn và ít bị lỗi hơn và là một trong những lý do lớn khiến Java rất phổ biến. Tuy nhiên, điều này gây ra sự cố trễ thỉnh thoảng cho các trò chơi vì chu kỳ thu gom rác có thể gây ra tạm dừng đáng chú ý. Điều này đang trở thành một vấn đề với các JVM có độ trễ thấp mới hơn, nhưng vẫn là một vấn đề đối với các trò chơi chuyên sâu về đồ họa trong đó việc duy trì FPS cao là rất quan trọng.

Lý do phi kỹ thuật:

  • Các nhà phát triển trò chơi chuyên nghiệp đang đầu tư vào các kỹ năng và công nghệ C / C ++. Điều này tạo ra một lượng quán tính rất lớn .
  • Nhận thức phần lớn không hợp lý rằng Java là chậm. Có thể đúng vào những năm 90, chắc chắn không phải bây giờ - bạn chắc chắn có thể viết một trò chơi 3D thương mại có lợi nhuận bằng Java ( Runescape có ai không? Hay về Minecraft ?)
  • Một nhận thức khá công bằng rằng Java tập trung nhiều hơn vào các ứng dụng kinh doanh và web hơn là chơi game. Điều này có thể thay đổi cùng với sự phát triển của Mobile và nhu cầu phát triển đa nền tảng hơn, nhưng hiện tại chắc chắn là đúng.

Điều thú vị là cũng có một số lý do chính đáng tại sao các nhà phát triển trò chơi nên xem xét Java:

  • Tính di động - khi số lượng nền tảng đích tăng lên, Java ngày càng trở nên hấp dẫn hơn với khả năng tạo ra các nhị phân đa nền tảng thực sự.
  • Hệ sinh thái thư viện - với ngoại lệ rất quan trọng của các công cụ trò chơi 3D, Java có phạm vi thư viện tốt nhất trong mọi nền tảng. Mạng, âm thanh, AI, xử lý hình ảnh, lưu trữ dữ liệu khóa / giá trị, bạn đặt tên cho chủ đề và có thể có một thư viện Java nguồn mở cho nó.
  • Phát triển phía máy chủ - Java là một ngôn ngữ / nền tảng tuyệt vời cho máy chủ và khi nhiều trò chơi kết hợp nhiều yếu tố nhiều người chơi, phía máy chủ sẽ ngày càng trở nên quan trọng hơn. Java trên Linux trông khá hấp dẫn ở đây như là một nền tảng.
  • JVM - có lẽ là môi trường thực thi VM được thiết kế tốt nhất trên Thế giới, với bộ sưu tập rác tuyệt vời, trình biên dịch JIT, hỗ trợ đồng thời, v.v. Nó sẽ trở nên tốt hơn và khi các nhà phát triển trò chơi bắt đầu sử dụng các ngôn ngữ động trong các trò chơi của họ môi trường thời gian chạy tốt nhất có thể.
  • Các ngôn ngữ JVM khác - Java là một công việc khó khăn, nhưng sự đổi mới thực sự đang diễn ra với các ngôn ngữ JVM mới (đặc biệt là Scala, Clojure). Các ngôn ngữ này có được tất cả các lợi thế của nền tảng Java / JVM, cộng với chúng là các ngôn ngữ hiện đại cực kỳ mạnh mẽ.

19
Không, khả năng bảo vệ không tốt hơn trong Java trong thế giới trò chơi video. Hầu hết các bảng điều khiển không có JVM. Vì lý do tính di động, C ++ được ưa chuộng hơn java trong thế giới trò chơi video.
deadalnix

5
Tại sao hệ sinh thái thư viện là phần thưởng cho Java? Các cặp mạng, âm thanh, khóa-giá trị - đó không phải là một điều; ngày nay có sẵn ở mọi nơi Tôi thực sự sẽ tranh luận rằng AI và xử lý hình ảnh được thực hiện dễ dàng hơn nhiều với các thư viện C / C ++ (fann, OpenCV).
MrFox

4
Quan trọng hơn FPS, có lẽ tôi sẽ nhấn mạnh tốc độ khung hình nhất quán . Tôi có thể cho trò chơi của mình chạy ở 100FPS, nhưng nếu một vài trong số các khung đó mất nửa giây, điều đó sẽ không xảy ra. Ngay cả khi GC nhanh, nếu nó gây ra sự bất thường đáng chú ý thì đó vẫn là một vấn đề. (Điều này không nói gì đến hiệu suất của Java nói riêng, chỉ là một vấn đề chung cần ghi nhớ)
Gankro

1
Tôi đã viết một game bắn súng góc nhìn người thứ nhất bằng Java và tôi chưa bao giờ gặp rắc rối với trình thu gom rác ngay cả khi tôi không sử dụng một game có độ trễ thấp. Dù sao, khi bộ nhớ không được phân bổ trên heap Java, tôi phải tự xử lý nó mà không cần bộ thu gom rác và hầu hết dấu chân bộ nhớ của tôi đến từ VBO. Nói cách khác, bộ sưu tập rác không phải là vấn đề vì nó hoạt động khi nó được sử dụng cho mục đích của nó và nó không phụ thuộc vào việc xử lý các đối tượng lớn trên GPU hoặc trên heap riêng (! = Java heap). Đừng đổ lỗi cho một cái đe vì không phải là một phương tiện hiệu quả của việc đánh răng.
gouliej

1
@deadalnix Thế giới trò chơi video không chỉ bao gồm các máy chơi game.
gouliej

27

Được rồi, có rất nhiều thông tin sai trong chủ đề này.

Tôi biết kinh doanh trò chơi cực kỳ tốt, đã ở trong đó 25 năm. Tôi cũng biết Java trong các trò chơi cực kỳ tốt là nhà truyền giáo kỹ thuật Java của Sun và giảng viên chuyên gia lập trình hiệu suất Java.

Về tốc độ tính toán, Java vượt qua C ++ trong nhiều tiêu chuẩn tính toán khoa học hiện nay. Bạn có thể viết mã bệnh lý bằng một trong hai ngôn ngữ hoạt động kém nếu bạn muốn, nhưng trên hết, chúng ngang bằng nhau và đã có từ lâu.

Về mặt sử dụng bộ nhớ, Java có một số chi phí vượt trội. HelloWorld là một chương trình 4K trong java. Nhưng chi phí đó khá vô nghĩa trong các hệ thống nhiều GB ngày nay. Cuối cùng, Java có nhiều thời gian khởi động hơn. Tôi không khuyến nghị sử dụng Java cho các tiện ích thời gian ngắn như các lệnh dòng lệnh Unix. Trong những trường hợp đó, startup sẽ chi phối hiệu suất của bạn. Tuy nhiên, trong một trò chơi, nó khá khó hiểu.

Mã trò chơi Java được viết đúng cách không bị tạm dừng GC. Giống như mã C / C ++, nó yêu cầu một số quản lý bộ nhớ hoạt động nhưng không đến mức C / C ++. Miễn là bạn giữ mức sử dụng bộ nhớ của mình cho các đối tượng tồn tại lâu dài (tồn tại trong toàn bộ cấp độ hoặc trò chơi) và các đối tượng tồn tại rất ngắn (vectơ và như vậy, được truyền xung quanh và nhanh chóng bị phá hủy sau khi tính toán) gc không phải là vấn đề có thể nhìn thấy.

Về mặt truy cập bộ nhớ trực tiếp, Java đã có điều đó trong một thời gian dài; kể từ Java 1.4 dưới dạng Bộ đệm Byte trực tiếp gốc. Việc xử lý bit trong Java có thể hơi khó chịu do thiếu các kiểu số nguyên không dấu nhưng các vòng công việc đều được biết đến và không quá tệ.

Mặc dù Java thực sự của nó chưa bao giờ có ràng buộc Direct3D, nhưng đó là vì các công nghệ Java cố gắng cho tính di động. Nó có các ràng buộc TWO OpenGL (JOGL và LWJGL) và liên kết OpenAL (JOAL) và liên kết đầu vào di động (JInput) liên kết dưới mui xe với DirectInput trên Windows, HID Manager trên OSX và ràng buộc Linux (tôi quên điều đó).

Đúng là không có công cụ trò chơi hoàn chỉnh nào có tính năng Java theo cách nói, Unity, đã giới thiệu C # và đó là một điểm yếu trong không gian độc lập. Mặt khác, có hai APIS cấp độ Kịch bản tốt, hoàn toàn có thể di động trên Windows, OSX và Linux. Cả hai được viết bởi Josh Slack, cái đầu tiên được gọi là động cơ JMonkey và Ardor3D thứ hai.

Áp phích trên cùng là chính xác rằng hai điều lớn nhất cản trở Java phát triển trò chơi là định kiến ​​và tính di động. Sau này là vấn đề lớn nhất. Mặc dù bạn có thể viết một trò chơi Java và gửi nó trên Windows, OSX và Linux, nhưng không bao giờ có máy ảo console. Điều này là do sự bất lực hoàn toàn trong quản lý cấp trung của Sun. Một vài người trong số chúng tôi làm việc trên Java trong các trò chơi thực sự đã thỏa thuận với Sony không dưới 3 lần để có được một máy ảo trên Playstation và cả 3 lần quản lý cấp trung của Sun đã giết chết nó.

Trong khi Sun tán tỉnh các công nghệ của khách hàng, thực tế của vấn đề là quản lý của Sun không bao giờ có sản phẩm tiêu dùng. Đó là lý do tại sao Java với tư cách là ngôn ngữ máy khách từ Sun không bao giờ thành công dưới bất kỳ hình thức nào và tại sao Google và Dalvik (máy ảo giống như java của Android) để biến Java thành một nền tảng thành công ở bất cứ đâu.

Và đó là lý do tại sao tôi viết mã trò chơi trong C # ngày hôm nay. Bởi vì Mono đã đi nơi quản lý của Sun từ chối.


8

Java rất tốt cho logic nghiệp vụ, máy chủ và mã độc lập nền tảng phải chạy đáng tin cậy. Có một số yếu tố khiến Java không thường được sử dụng trong các trò chơi:

  • kiểm tra giới hạn và các cơ chế an toàn khác (chênh lệch hiệu suất cận biên ngày nay)
  • phải chuyển đổi giữa cấu trúc dữ liệu C ++ và cấu trúc dữ liệu Java (không thể sao chép bộ nhớ giữa các bộ đệm)
  • nhiều sách và hướng dẫn đi theo đám đông, vì vậy thật khó để tìm thấy thông tin nhà phát triển trò chơi không phải C ++
  • các thư viện đồ họa cốt lõi (DirectX và OpenGL) và nhiều công cụ sẵn có dựa trên C / C ++
  • nhiều trò chơi cố gắng chạy nhanh nhất có thể để chúng có thể thêm các tính năng hấp dẫn trực quan hơn

Thật không dễ dàng để làm việc với các thư viện C ++ từ các ngôn ngữ mã byte như Java (viết một lớp JNI) và .net (rất nhiều thuộc tính marshalling / unmarshalling, api / architecture). Vì vậy, nó thêm khá nhiều công việc cho lợi ích nhỏ.

Một lưu ý phụ: một số máy chủ trò chơi sử dụng Java.

Bài đăng tương tự ở đây : https://stackoverflow.com/questions/1034458/why-arent-video-games-written-in-java


Bạn không phải tự viết JNI, chỉ cần sử dụng JogAmp hoặc bất kỳ thư viện tương tự nào.
gouliej

Điểm tốt. Tôi đã sử dụng JOGL và JMonkeyEngine trong Java. Nhiều recenlty hơn trong tôi đã sử dụng XNA / MonoGame cho DirectX và OpenTK để OpenGL với nvorbis / naudio / openal trong C #. Và chúng hoạt động tuyệt vời cho các game cỡ nhỏ đến cỡ trung, đặc biệt là khi làm việc với shader. Cải thiện lớn về năng suất so với C ++. Sau đó, vấn đề thực sự duy nhất của bạn cũng giống như bất kỳ ngôn ngữ dựa trên GC nào: ngăn chặn / giảm thiểu GC. Nó sẽ trì hoãn tốc độ khung hình của bạn theo định kỳ, do đó bạn sẽ muốn các mảng có kích thước cố định, phân bổ tĩnh hoặc bộ đệm sống lâu có thể bị ném khi chơi trò chơi bị đình trệ (menu, tải, điện ảnh).
Graeme Wicksted

Tôi đã sử dụng JOGL từ năm 2006 và tôi chưa gặp phải vấn đề này ngay cả trên phần cứng rất thấp trong môi trường máy tính để bàn. Trình thu gom rác không đổ lỗi vì các đối tượng lớn nhất thường nằm trong RAM GPU hoặc trong heap riêng (thường là bộ đệm NIO trực tiếp), trước đây không được quản lý bởi bộ sưu tập rác "thông thường" và sau này Được quản lý trực tiếp bởi bộ sưu tập rác "thông thường" vì nó chăm sóc các đối tượng Java trên heap Java. Tùy thuộc vào nhà phát triển để giải phóng bộ nhớ được phân bổ trên heap riêng.
gouliej

Theo ý kiến ​​khiêm tốn của tôi, vấn đề thay vì xuất phát từ một số "tối ưu hóa" do các lập trình viên tưởng tượng không nằm trong tư duy Java ngăn cản người thu gom rác thực hiện công việc của mình. Nếu bạn giữ một số tài liệu tham khảo mạnh mẽ về một số đối tượng Java vô dụng được liên kết với một số tài nguyên bản địa, trình thu gom rác sẽ không bao giờ xem xét chúng có thể thu hồi được. Phân bổ heap có thể hữu ích trong một số trường hợp nhưng nếu bạn lạm dụng nó, tài nguyên sống lâu của bạn sẽ ở trong bộ nhớ và bạn sẽ không thể tạo các đối tượng mới.
gouliej

Một số lập trình viên trò chơi thích phân bổ bộ đệm khổng lồ ngay từ đầu, tự cắt chúng trong thời gian chạy và tự quản lý bộ nhớ này nhưng có lẽ họ sẽ làm điều tồi tệ hơn là hệ điều hành và sau đó, Java sẽ dành nhiều thời gian để giải phóng không gian để tạo các đối tượng mới. Tránh rò rỉ bộ nhớ không khó hơn trong Java và một giải pháp khả thi hơn chỉ bao gồm theo dõi các đối tượng mà bộ nhớ không được phân bổ trên heap Java để giải phóng chúng vào một thời điểm thích hợp (trong khi tạm dừng, khi chuyển từ cấp độ này sang cấp độ khác , ...), nó không liên quan gì đến người dọn rác.
gouliej

5

Java không đủ nhanh để phát triển trò chơi. Nó chậm hơn nhiều so với sử dụng C ++ / hội, đó là tiêu chuẩn. Đó là cùng một lý do phát triển trò chơi nhiều hơn không được thực hiện bằng C # hoặc VB. Các nhà phát triển trò chơi cần và lập kế hoạch cho mỗi chu kỳ đồng hồ cuối cùng mà họ có thể thực hiện cho những việc như tính toán vật lý, logic AI và tương tác môi trường.

Đối với các trò chơi đơn giản hơn, Java có thể được sử dụng khá hiệu quả. Nếu bạn muốn tạo một bản sao Tetris hoặc Bejeweled hoặc một cái gì đó khác ở mức độ chi tiết đó, thì Java sẽ hoạt động tốt. Nhưng Java không thể tạo ra các trò chơi như Halo, Medal of Honor, Command & Conquer, v.v. và làm cho nó có thể chơi được. Ít nhất là nó tồn tại ngày nay.

Và những lý do bạn liệt kê trong câu hỏi của bạn là hợp lệ là tốt. Ngoại trừ, tôi nghĩ, vì thiếu các nhà phát triển trò chơi có chuyên môn về Java. Nhiều trò chơi trên điện thoại và các thiết bị cầm tay khác được viết bằng Java (bao gồm hầu hết các trò chơi Android) và một số trò chơi khá xuất sắc. Vì vậy, tôi nghĩ rằng có một cơ sở tốt của các nhà phát triển trò chơi có kiến ​​thức Java.

Ý nghĩ đang thay đổi về khả năng sử dụng các ngôn ngữ cấp cao hơn này cho một số trò chơi nâng cao hơn. Chẳng hạn, một trong những trò chơi yêu thích của tôi, Train Simulator của Auran, được viết với các phần lớn bằng C #, và nó hoạt động khá tốt. Vì vậy, cơ sở đang phát triển và sẽ tiếp tục phát triển.


17
Bạn bỏ qua một trong những điểm quan trọng nhất; phần lớn các công cụ và API mà một công cụ sẽ sử dụng được viết bằng C ++ và viết lại chúng để làm việc với Java hoặc bất kỳ ngôn ngữ nào khác sẽ là rất nhiều công việc. Ngoài ra, khái quát của bạn rằng "[Java] chậm hơn nhiều so với sử dụng C ++ / hội " là quá rộng để không chính xác. Hội không được sử dụng thường xuyên như bạn nghĩ trong các trò chơi trên PC vì một trình biên dịch tốt sẽ có khả năng tạo mã hiệu quả hơn so với việc bạn viết trình biên dịch. Tuy nhiên, việc sử dụng tài nguyên xác định và khả năng có được ngay tại phần cứng là bắt buộc.
Ed S.

15
Ai đó thực sự cần phải tạo ra một ví dụ tốt hơn về các khả năng của Java so với Minecraft. Cho đến khi ai đó có thể tạo ra tương đương với WoW hoặc C & C hoặc MOH hoặc Starcraft trong Java hoặc C #, tôi sẽ tiếp tục giữ nguyên những gì tôi đã nói.
BBlake

12
"Hội không được sử dụng thường xuyên như bạn nghĩ trong các trò chơi trên PC bởi vì một trình biên dịch tốt sẽ có khả năng tạo mã hiệu quả hơn so với việc bạn sẽ viết trình biên dịch." Đó là một khái quát khác. Tôi vẫn chưa thấy trình biên dịch có thể tạo ra ngôn ngữ máy IA32 tốt hơn so với một lập trình viên ngôn ngữ lắp ráp IA32 có kinh nghiệm. Trình biên dịch tạo mã cho một máy trừu tượng được ánh xạ lên máy đích. Một lập trình viên ngôn ngữ lắp ráp tận dụng tối đa lợi thế của bộ xử lý cơ bản, bao gồm cả thành ngữ máy.
bit-twiddler

10
Đừng quên sử dụng bộ nhớ. Sử dụng bộ nhớ có lẽ quan trọng hơn tốc độ. Java không được thiết kế để kiểm soát bộ nhớ trực tiếp như C ++ và trình thu gom rác có nghĩa là việc sử dụng bộ nhớ luôn cao hơn đáng kể so với C ++ cho cùng một tác vụ.
Matthew đã đọc

9
Đây không phải là năm 1985. Chúng tôi có hơn 640k bộ nhớ, tốt hơn bộ xử lý 50 mghz và hơn 1,44 mbs dung lượng lưu trữ di động. Thách thức các nhà phát triển trò chơi ngày nay không giống như 25 năm trước. Đi trước và tìm một ví dụ về mã x86 / hoặc ia64 thủ công cho một trò chơi hiện đại. Một số huyền thoại chỉ đơn giản là sai. Thách thức là tính di động và các máy khách cấp thấp sử dụng các môi trường hoạt động tương đối cổ xưa. Mẫu số chung nhỏ nhất so với ngâm ngâm hấp dẫn.
JustinC

5

Trò chơi hiện đại là tất cả về đồ họa 3D xảy ra trong phần cứng mục đích đặc biệt.

Ngay cả vào năm 2002, Jacob Marner đã phát hiện trong báo cáo "Đánh giá Java để phát triển trò chơi" rằng Java khá hữu dụng cho các trò chơi, ngoại trừ các phần phụ thuộc hiệu năng nhất và do sự mạnh mẽ của ngôn ngữ và JVM cơ bản mà nó rẻ hơn để làm theo cách này.

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

Theo ý kiến ​​cá nhân của tôi, với sự tiến bộ đã xảy ra kể từ đó, đặc biệt là trong đồ họa 3D và với các ràng buộc tuyệt vời với OpenGL et al, rằng nhược điểm này ngày nay ít được phát hiện hơn.

Do đó vấn đề phải ở nơi khác. Một lý do có khả năng là kích thước của thời gian chạy Java (ngày nay không còn là vấn đề với các trò chơi đa DVD) và một quán tính khác của mã hiện có. Nó nổi tiếng là dễ vỡ khi bắt đầu làm việc với mã gốc trong Java. Một lý do thứ ba là những gì các nhà phát triển ngôi sao làm các trò chơi quen thuộc. Thứ tư là liệu Java có sẵn trên nền tảng hay không.

Mặc dù vậy, có một điều chắc chắn - hầu hết các trò chơi đều chuyển sang dạng script thay vì ghi tất cả mã C ngay từ đầu và bạn muốn có thời gian chạy tốt nhất bên dưới ngôn ngữ kịch bản của mình. Ngày nay, điều này về cơ bản có nghĩa là CLR hoặc JVM.


1
oddlabs.com/technology.php - "Chúng tôi đã phát triển dựa trên của chúng tôi trên sự kết hợp của LWJGL và Java, cho phép các trò chơi để chạy trên bất kỳ LWJGL hỗ trợ nền tảng mà không sửa đổi và với tốc độ tương đương với mã gốc nền tảng phụ thuộc."

Jake2 vượt trội hơn Quake2 hơn 10 năm trước. Chúng tôi không còn vào năm 2002.
gouliej

4

Các nhà phát triển trò chơi thích gần gũi với kim loại và thường sẽ viết các vòng lặp chặt chẽ bên trong của họ trong quá trình lắp ráp. Java không cung cấp cùng một mức hiệu suất có thể, cả về tốc độ phù hợp hoặc sử dụng bộ nhớ (chạy JIT đều phải trả phí).


4

Tôi nghĩ rằng yếu tố hạn chế đối với hầu hết mọi người là (thiếu) sự sẵn có của các công cụ trò chơi tốt. Để đi rất xa, chúng ta cần xem xét tại sao những thứ đó không có sẵn.

Tôi sẽ nhìn nó từ hướng khác một lát. Phát triển một công cụ trò chơi (ví dụ) là rất nhiều công việc. Ai sẽ được hưởng lợi đủ từ việc phát triển một để đầu tư thời gian và công sức để làm như vậy?

Hầu hết các ứng cử viên rõ ràng cho phát triển giống như khung trong / cho Java (ví dụ: IBM, Oracle) dường như không có hứng thú với các trò chơi. Các ứng cử viên rõ ràng cho phát triển trò chơi (ví dụ: Id, EA) dường như ít quan tâm đến Java.

Gần như ứng cử viên duy nhất tôi có thể nghĩ về điều đó dường như hoàn toàn hợp lý sẽ là Google. Ngôn ngữ phát triển chủ yếu cho Android là Java, và phát triển trò chơi đáng khích lệ dành cho Android có thể mang lại lợi thế thực sự cho nền tảng này.

Theo như tôi biết, họ chưa làm như vậy (chưa?), Điều này để lại một số giới hạn khá nghiêm trọng cho hầu hết mọi người khác. Không có chút gì để các công cụ trò chơi hiệu năng cao, hiện đại sử dụng phát triển trên Java có nghĩa là khá nhiều công việc phụ, với (rất giống với tôi) sẽ có rất ít lợi ích để tạo ra nhiều lợi ích cho việc làm thêm đó.


Tôi nghĩ rằng bạn đã gặp phải một vấn đề quan trọng với các công cụ trò chơi - Tôi nghĩ đây là lý do lớn nhất khiến Java không theo kịp C / C ++. Tuy nhiên, nguồn mở có thể san bằng sân chơi một chút - Tôi đã rất ấn tượng với jMonkeyEngine ( jmonkeyengine.com ).
mikera

và đừng quên rằng các nhà phát triển trò chơi nói chung cực kỳ bảo thủ (về mặt kỹ thuật) và hầu hết các cửa hàng lớn (có ảnh hưởng) đã tồn tại trong nhiều thập kỷ và là trung tâm C (++) / ASM nên sẽ không đầu tư vào phát triển Java như điều đó có nghĩa là đầu tư lớn về thời gian, tiền bạc và các tài nguyên khác từ trước khi họ có toàn bộ kiến ​​trúc C (++) / ASM sẵn sàng tung ra.
jwenting

1

Câu hỏi ngang tầm với việc hỏi điều gì đó trong các dòng:

Điều gì là tốt hơn để cung cấp năng lượng cho xe của bạn, động cơ thuyền hoặc động cơ phản lực.

Nó liên quan đến khả năng mở rộng, tránh lỗi, tốc độ, chữ ký bộ nhớ, mô-đun và một loạt các thứ. Câu hỏi không nên là về những gì tốt hơn theo tiêu chuẩn ngành, câu hỏi nên là "điều gì tốt hơn cho tôi" như trong những gì bạn biết hoặc bạn hiểu rõ về nó như thế nào. Nếu nó thực hiện công việc thì nó thực hiện công việc, nếu bạn thực sự có thể bán ý tưởng thì nó hoạt động và ai biết bạn thậm chí có thể uốn cong một vài thìa.


0

Java không được tạo ra với mục đích phát triển trò chơi, Java được tạo ra để trở thành một ngôn ngữ "cho web".

Về phát triển trò chơi, Sun không thực sự hỗ trợ Java như một ngôn ngữ phát triển trò chơi khi Microsoft hỗ trợ C #.

Tôi nghĩ rằng việc thiếu các khung phát triển trò chơi hấp dẫn là điều thực sự giết chết Java ở khía cạnh này.


3
Nhưng C ++ cũng không phải là ngôn ngữ trò chơi, mà là ngôn ngữ lập trình hệ thống giống như C. Và Sun thực sự đã nỗ lực với Java như ngôn ngữ trò chơi, tôi nghĩ rằng họ đang hợp tác với Sony để đưa Java lên máy PS3 hoặc một cái gì đó, nhưng nó không bao giờ xảy ra ...
Anto

1
@Phobia: Nhưng nó được thiết kế để lập trình hệ thống.
Anto

1
@Phobia: Tôi đang nói rằng đó ngôn ngữ lập trình có mục đích chung , giống như C ++. Trong câu trả lời của bạn, bạn nói rằng Java không được thiết kế như một ngôn ngữ lập trình trò chơi, nhưng bạn quên rằng C ++ không được thiết kế như vậy.
Anto

2
@Joe Blow: Từ trang Wikipedia về C: "Mặc dù C được thiết kế để triển khai phần mềm hệ thống , nhưng nó cũng được sử dụng rộng rãi để phát triển phần mềm ứng dụng di động." Tôi nghĩ điều đó khá rõ ràng phải không?
Anto

2
@Phobia Tôi xin lỗi về sở thích cá nhân của bạn nhưng chúng hoàn toàn không liên quan đến cuộc thảo luận. Hơn nữa, tôi không muốn tranh luận rằng ngày nay C ++ được sử dụng hầu như chỉ trong lập trình ứng dụng. Đây không phải là những gì cuộc thảo luận này là về. Yêu cầu của bạn rằng Java được thiết kế dành cho lập trình web. Chà, C ++ được thiết kế với hệ thống lập trình trong tâm trí. Nhà thiết kế của nó cho biết. Kết thúc cuộc thảo luận.
Konrad Rudolph

-1

Dễ dàng hơn để dán C trực tiếp hơn vào các trình điều khiển và phần cứng độc đáo mới. Một lập trình viên trò chơi càng sớm và càng gần với phần cứng, họ càng có thể vượt qua các trò chơi cạnh tranh tốt hơn. Các lập trình viên trò chơi sau này chỉ gắn bó với phương pháp và công cụ tương tự như những trò chơi đã được chứng minh trước đó.

Đối với các trò chơi mà việc tối ưu hóa phần cứng mới nhất ít quan trọng hơn, chẳng hạn như các trò chơi trên điện thoại di động thông thường, sử dụng C theo cách này ít quan trọng hơn là tính di động cao hơn của Java.


-4

Đối với một số người, lý do không liên quan gì đến tốc độ, thư viện hoặc tính khả dụng. Nó chỉ đơn giản là vì ngôn ngữ chính nó. Một số người đơn giản là không thích ngôn ngữ Java. Những người khác thà sử dụng ngôn ngữ lập trình yêu thích của họ thay vì sử dụng Java để tạo trò chơi.


Điều này đọc giống như một bình luận, xem Cách trả lời
gnat

-8

Nó tất nhiên có thể là một cái gì đó khác. Ai đó có thể hiểu rõ hơn về doanh nghiệp hơn tôi có thể giải thích tại sao Java không có được động lực khi phát triển trò chơi không?

Đó là một ngôn ngữ diễn giải, tức là chậm. Bạn đang làm việc với card đồ họa và đồ họa là phần cứng. Một ngôn ngữ tốt để đối phó với phần cứng là gì? Chà, C ++, nó khá thấp, và bạn đối phó với con trỏ và bất cứ điều gì.

Nếu bạn muốn đưa ra đồ họa điên rồ như crysis và bất cứ điều gì bạn sẽ không làm Java cho nó.

Không chỉ vậy, Oracle còn sở hữu Java, ý nghĩ rằng một công ty có thể kiện bạn không táo bạo lắm. Đặc biệt là khi bạn muốn xây dựng trình thông dịch của riêng mình cho JAVA để nhắm mục tiêu chơi trò chơi mà không bị kiện do phân đoạn FUD.


1
Bạn nên nghiêm túc đọc về quá trình biên dịch JIT và xem xét một số điểm chuẩn nơi Java được đặt so với C ++
Anto

1
Ai đã bỏ phiếu này trả lời? Toàn bộ câu hỏi này đang trở nên vô cùng vô lý! Tốt đau buồn.
Fattie

7
@Joe Câu trả lời là sai. Java không được giải thích.
Konrad Rudolph

3
@Anto Quên những điểm chuẩn ngớ ngẩn đó. C ++ bậc độ lớn nhanh hơn so với Java nơi mà nó đếm, xem programmers.stackexchange.com/questions/29109/29136#29136programmers.stackexchange.com/questions/368/13888#13888 .
Konrad Rudolph

1
@Anto Tôi cho là gì khi nhìn vào? Tốc độ? C ++. Sử dụng bộ nhớ? C ++. Nhìn vào minecraft và thử lưu trữ một máy chủ và xem game chiếm bao nhiêu bộ nhớ. Java tiêu thụ nhiều bộ nhớ hơn so với C ++. Làm một trò chơi trực tuyến, tôi sẽ tưởng tượng là khá khó trong Java. Mọi điểm chuẩn tôi từng thấy cho đến nay Java đều tiêu tốn nhiều bộ nhớ hơn, giờ đây có một trò chơi mmorpg trong đó máy chủ trung tâm được mã hóa bằng java nghe có vẻ hay chỉ khi bạn bỏ qua khía cạnh bộ nhớ hoặc thay đổi định nghĩa về MMORPG.
huyền thoại
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.