Tại sao chỉ có một vài trò chơi video được viết bằng Java? [đóng cửa]


171

Tại sao không có nhiều trò chơi video 3D thương mại (không phải là trò chơi 2D nguồn mở ngẫu nhiên) được viết bằng Java? Về lý thuyết, điều này rất có ý nghĩa: bạn có được tăng năng suất và ứng dụng đa nền tảng gần như miễn phí, trong số những thứ khác, chẳng hạn như số lượng lớn các thư viện Java và bộ sưu tập rác tích hợp (mặc dù tôi thừa nhận tôi ' m không chắc chắn sau này là một điều tốt). Vậy tại sao nó hiếm khi được sử dụng? Tôi chỉ có thể nghĩ về một vài trò chơi thương mại phổ biến được viết cho nền tảng Java.

Có phải vì hiệu suất? Nếu vậy, hầu hết các công việc nặng nhọc sẽ được GPU thực hiện?



1
Re: mmyer; Tôi hơi sốc khi trò chơi THAT đã giành được giải thưởng "đồ họa tốt nhất", ngay cả trong năm 2005 ...
CloudyMusic

2
Vâng, nhưng hầu hết "trò chơi thực tế" không được tạo trong .net phải không? Chúng được làm ở trường cũ c / c ++?
Phần cứng

14
Runescape được viết bằng java.
GameFreak

44
Minecraft được viết bằng Java!
daGrevis

Câu trả lời:


155

Thế giới phát triển trò chơi là một thế giới vui nhộn: Một mặt, họ thường nhanh chóng chấp nhận những ý tưởng mới, mặt khác, họ vẫn đang ở thời kỳ đồ đá.

Sự thật là, hiếm khi có nhiều động lực khi chuyển sang .NET / Java / bất cứ thứ gì khác ngoài C / C ++.

Hầu hết các công ty trò chơi cấp phép các bộ phận của công cụ trò chơi từ các công ty khác. Các phần này được viết bằng C ++ và mặc dù bạn có thể có quyền truy cập vào nguồn để bạn có thể chuyển nó, điều đó cần rất nhiều nỗ lực (và tất nhiên, giấy phép cần phải cho phép nó).

Ngoài ra, rất nhiều mã kế thừa đã tồn tại trong C ++. Nếu mã từ các dự án trước có thể được sử dụng lại (giả sử, nếu bạn đang viết phần tiếp theo), điều đó thậm chí còn được ưu tiên hơn khi gắn bó với cùng một ngôn ngữ, thay vì viết lại bằng ngôn ngữ mới (vì vậy nhiều khả năng bạn sẽ giới thiệu lại một tấn lỗi mà bạn sẽ cần dành thời gian ủi ra.

Cuối cùng, dù sao thì cũng hiếm khi các trò chơi được viết bằng 100% C ++ - rất nhiều việc được thực hiện bằng các ngôn ngữ kịch bản, cho dù chúng là tùy chỉnh hay chỉ tích hợp một ngôn ngữ hiện có (Lua là một trong những ngôn ngữ phổ biến hơn hiện nay).

Theo như thu thập rác, đó có thể là một vấn đề. Vấn đề không phải là nó tồn tại nhiều, nó hoạt động nhiều hơn - công cụ thu gom rác PHẢI không bị chặn (hoặc ít nhất được đảm bảo chỉ chặn rất nhanh), vì đơn giản là không thể chấp nhận trò chơi bị đóng băng trong 10 giây trong khi nó quét tất cả bộ nhớ được phân bổ để xem những gì có thể được giải phóng. Tôi biết Java có xu hướng bị nghẹt thở khá nhiều trong GC'ing khi sắp hết bộ nhớ (và đối với một số trò chơi ngoài đó, nó sẽ như vậy).

Bạn cũng bị hạn chế hơn một chút trong những gì bạn có thể làm: bạn không thể khai thác triệt để phần cứng do chi phí hoạt động. Hãy tưởng tượng Crysis được viết bằng Java ... ngay cả khi đó là điểm khác biệt duy nhất có thể nhìn thấy, nó sẽ không giống nhau (tôi cũng khá chắc chắn rằng bạn cần Core i7 để chạy nó.).

Điều này không có nghĩa là những ngôn ngữ này không có vị trí trong phát triển trò chơi - và không, tôi không chỉ nói đến lập trình công cụ. Đối với hầu hết các trò chơi, bạn không cần thêm một chút hiệu suất mà bạn có được từ C ++, bao gồm các trò chơi 3D và nếu bạn viết tất cả từ đầu, thì có thể sử dụng một thứ gì đó giống như XNA - thực tế, có một cơ hội tốt nó sẽ.

Theo như các trò chơi thương mại - RuneScape có tính không? Đó cũng có thể là trò chơi Java thành công nhất hiện có.


16
Rõ ràng là bạn sẽ không chạy Crysis trên JVM; chết tiệt, nếu bạn mã hóa trò chơi đó bằng ngôn ngữ lắp ráp, bạn vẫn cần một siêu máy tính để chạy nó trên các cài đặt đầy đủ. Nhưng +1 cho cái nhìn sâu sắc tuyệt vời, cảm ơn bạn.
Sasha Chedygov

15
Bạn không thể so sánh Giải đấu thực tế 3 hoặc Crysis với Runescape. Nếu chất lượng đồ họa là một mối quan tâm, bạn cần phải gắn bó với một ngôn ngữ cấp thấp với càng ít chi phí càng tốt. Tất nhiên, đối với Indy hoặc các trò chơi mà đồ họa không phải là điểm bán hàng chính, Java là một sự thay thế tuyệt vời cho C / C ++.
GuiSim

6
@GuiSim: Đối với hầu hết các trò chơi, chất lượng đồ họa KHÔNG phải là điểm bán hàng chính. Chỉ có một số ít các trò chơi mà tôi có thể nghĩ ra được tạo ra với đồ họa trong tâm trí (tôi đang nghĩ về Crysis, nhưng Half-Life 2 cũng vậy). Tôi không nghĩ rằng hầu hết các nhà phát triển trò chơi quan tâm nhiều đến đồ họa, miễn là chúng "đủ tốt" (hay ngang bằng với hầu hết các trò chơi khác).
Sasha Chedygov

4
Đồ họa thực sự có rất ít liên quan đến ngôn ngữ. Vật lý, AI, vâng. Đồ họa, không.
JulianR

10
@JulianR có thể có một khối lượng công việc đáng kể để chuẩn bị và duy trì cảnh được hiển thị hiệu quả, do đó, ngôn ngữ và chi phí ngôn ngữ liên quan không quan trọng đối với đồ họa.
KSchmidt

95

Tôi nghĩ John Carmack đã nói điều đó tốt nhất với:

Vấn đề lớn nhất là Java rất chậm. Ở cấp độ cpu / bộ nhớ / hiển thị / liên lạc thuần túy, hầu hết các điện thoại di động hiện đại nên là nền tảng chơi game tốt hơn đáng kể so với Game Boy Advanced. Với Java, trên hầu hết các điện thoại, bạn chỉ còn lại sức mạnh CPU của máy tính IBM 4,77 mhz ban đầu và khả năng kiểm soát tệ hại đối với mọi thứ. [... snip ...] Viết-một lần-chạy-bất cứ nơi nào. Hà. Hahahahaha. Chúng tôi chỉ đang thử nghiệm trên bốn nền tảng ngay bây giờ và không một cặp nào có cùng một yêu cầu chính xác. Tất cả các trò chơi thương mại được tinh chỉnh và biên dịch riêng cho từng nền tảng (thường là hơn 100). Tính di động không phải là một biện minh cho hiệu suất khủng khiếp.

( nguồn )

Được cho phép, anh ta đã nói về các nền tảng di động, nhưng tôi đã tìm thấy các vấn đề tương tự với Java nói chung đến từ nền tảng C ++. Tôi nhớ việc có thể phân bổ bộ nhớ trên Stack / Heap theo cách riêng của mình.


60
Câu nói đó là từ năm 2005. Cả công nghệ Java và sức mạnh của Điện thoại di động đã được cải thiện đáng kể kể từ đó. So sánh chơi game trên điện thoại di động với chơi game trên PC là so sánh táo với cam.
Chris Tweets

78
John Carmack đã nói điều đó. Trường hợp đóng cửa.
GuiSim

41
Tôi chỉ cảm thấy khó chịu khi đọc "Java rất chậm". Giống như nói một chiếc xe thể thao trị giá 50 nghìn đô la là chậm so với một chiếc xe thể thao 100 nghìn đô la. Chắc chắn, nó chậm hơn, nhưng 90% thời gian, công việc nó làm vẫn rất tuyệt vời và với một nửa chi phí;) Không có ý định chiến tranh ngọn lửa. Tôi đồng ý rằng những lý do trên là lý do tại sao Crysis và các trò chơi giống như không được viết bằng Java.
Ross

17
@Chris Tweets, điều này nhấn mạnh toàn bộ vấn đề với hiệu năng Java. Hiệu suất Java đã được cải thiện chưa? Không, điện thoại di động đã nhanh hơn. Các trò chơi được cho là sẽ đẩy các giới hạn của chủ nghĩa hiện thực và do đó đẩy các giới hạn của phần cứng và ném đi% 30-% 40 hiệu suất của bạn trước khi bạn thậm chí viết một dòng mã là không thể chấp nhận được.
cgp

8
Tôi thấy tranh chấp này rất lạ. Java ME không giống với Java trong Android và cũng không giống với Java trên PC. Java ME thường dựa vào các nhà sản xuất điện thoại để đưa ra JVM. Một số đã làm tốt, một số thì không. Không có gì ngạc nhiên khi Carmack đã phàn nàn về họ. Android có VM riêng không phải là JVM. Và nó có một số vấn đề nghiêm trọng (theo quan điểm của tôi). HotSpot VM của Oracle hoàn toàn khác với cả hai trường hợp. Nếu mọi người so sánh tất cả những điều này, điều duy nhất tôi có thể kết luận là họ không biết họ đang nói về cái gì.
Malcolm

54

Đối với một điều, việc thiếu quá tải toán tử của Java làm cho tất cả các phép toán mà bạn phải xử lý để có được một đường ống đồ họa hoạt động rất, rất khó chịu và khó đọc.

Tất cả các phép nhân ma trận và vectơ affine mà bạn cần xử lý sẽ dễ thực hiện hơn rất nhiều nếu chúng ở trong các biểu thức toán học được định dạng tốt thay vì các biểu thức hướng đối tượng như

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

Điều đó thật tồi tệ. Toán học không nên như thế.


19
Tôi nhớ lại vào năm 96 Tôi nghĩ rằng, một số nhà thiết kế từ Sun đã thuyết trình về Java tại Berkeley. William Kahan ( en.wikipedia.org/wiki/William_Kahan ) đã cho họ biết về vấn đề này. :)
JP Alioto

13
tôi nghĩ có một lý do chính đáng để không cho phép người vận hành quá tải trong một ngôn ngữ: để ngăn mọi người sử dụng nó. nó là một công cụ mạnh mẽ và rất tuyệt vời cho toán học, nhưng nguy hiểm cho mọi thứ khác. lười biếng như các lập trình viên, họ có xu hướng sử dụng nó để rút ngắn mã và thời điểm mọi người bắt đầu thực hiện một bản đồ nhân với một hàm lặp hoặc ngay cả khi tất cả các op số học được xác định cho các hàm, khả năng đọc mã sắp đạt 0. và vâng, tôi đã dành một lượng đáng kể thời gian chuyển mã như thế. : -S đó là một sự lựa chọn thiết kế. và lựa chọn thiết kế luôn có xu hướng gây tranh cãi.
back2dos

19
Trừng phạt người khác vì một vài quả táo xấu? Đây là một lý do tôi thích C #. Nếu tôi thực sự cần quá tải toán tử thì nó ở đó.
ChaosPandion

1
Về cơ bản, quá tải toán tử chỉ thực sự thích hợp cho 2-3 tình huống khác nhau trong thiết kế OOP (vectơ, ma trận, số phức). Hầu hết các tình huống khác, nó được định nghĩa quá lỏng lẻo và chỉ dẫn đến mã cẩu thả, cú pháp yếu và tài liệu kém, thậm chí từ những người biết cách sử dụng nó. Tôi nghĩ đó là lý do tại sao Sun chọn không sử dụng nó trong Java và tôi nghĩ đó là một quyết định hợp lệ.
bgroenks

1
@MMJZ: Biểu thức lambda có liên quan gì đến quá tải toán tử?
Sasha Chedygov

26

Tôi nghĩ .NET đã có (có) rất nhiều vấn đề tương tự mà Java gặp phải. Microsoft vừa hoàn thành công việc tiếp thị tốt hơn cho các nhà phát triển với XNA :-)


10
XNA cũng cho phép triển khai ứng dụng .NET của bạn lên XBox. Tôi chưa thấy bất cứ điều gì suôn sẻ cho Java.
StriplingWar Warrior

Bạn cũng có thể triển khai lên Zune.
cbeuker

Một câu hỏi cũ hơn, nhưng chỉ cần cập nhật, giờ đây bạn cũng có thể viết trò chơi XNA cho Windows Phone :-)
Joel Martinez

3
@JoelMartinez một bản cập nhật khác: không thể viết các trò chơi XNA cho Windows Phone 8.
Tomas Andrle

@TomA Hiện tại có thể viết trò chơi monogame cho WP8
Alex Lapa

17

Điểm nhỏ đầu tiên:

  • bất kỳ tăng năng suất từ ​​Java là giả thuyết. Cú pháp gần giống với C ++, vì vậy bạn thực sự chỉ cần tiết kiệm tiền từ quản lý bộ nhớ và thư viện chuẩn. Các thư viện có rất ít để cung cấp cho các nhà phát triển trò chơi và quản lý bộ nhớ là một vấn đề gây tranh cãi do bộ sưu tập rác.

  • đa nền tảng "miễn phí" không tốt như bạn nghĩ vì ít nhà phát triển muốn sử dụng OpenGL và một số nền tảng chính có thể thiếu triển khai Java hoặc trình bao bọc tốt cho thư viện gốc của họ, cho dù là đồ họa, âm thanh, mạng, v.v.

Nhưng chủ yếu, vấn đề là tương thích ngược. Các nhà phát triển trò chơi đã chuyển sang C ++ từ C và sang C từ lắp ráp hoàn toàn vì tuyến di chuyển trơn tru. Mỗi mã tương tác chặt chẽ với trước đó và tất cả các mã trước đó của chúng đều có thể sử dụng được bằng ngôn ngữ mới, thường thông qua một trình biên dịch duy nhất. Do đó, di chuyển chậm hoặc nhanh như bạn muốn. Ví dụ: một số tiêu đề cũ của chúng tôi đang sử dụng ngày nay vẫn có #ifdef WATCOMCvà tôi không nghĩ có ai đã sử dụng trình biên dịch Watcom ở đây trong một thập kỷ trở lên. Có một sự đầu tư lớn vào mã cũ và mỗi bit chỉ được thay thế khi cần thiết. Quá trình thay thế và nâng cấp các bit và miếng từ trò chơi này sang trò chơi tiếp theo gần như không thực tế nếu bạn đổi sang ngôn ngữ không thực sự tương tác với mã hiện tại của bạn. Có, khả năng tương tác C ++ / Java là có thể, nhưng rất không thực tế khi so sánh với việc chỉ viết "C với một chút C ++" hoặc nhúng các khối asm trong C.

Để thay thế chính xác C ++ như ngôn ngữ lựa chọn của nhà phát triển trò chơi, nó phải thực hiện một trong hai điều sau:

  1. Dễ dàng tương tác với mã kế thừa hiện có, do đó bảo toàn đầu tư và duy trì quyền truy cập vào các thư viện và công cụ hiện có, HOẶC
  2. Hiển thị rõ ràng phía trước đủ để tăng năng suất rằng chi phí viết lại tất cả mã của riêng bạn (hoặc làm lại các giao diện thành các thành phần có thể sử dụng lại từ ngôn ngữ đó) sẽ được chi trả nhiều hơn.

Theo chủ quan, tôi không nghĩ Java gặp một trong hai. Một ngôn ngữ cấp cao hơn có thể đáp ứng thứ 2, nếu ai đó đủ can đảm để trở thành người tiên phong. (EVE Online có lẽ là ví dụ tốt nhất mà Python có thể sử dụng được, nhưng nó sử dụng một nhánh của ngôn ngữ Python chính, nhiều thành phần C ++ để thực hiện và thậm chí đó là một trò chơi khá đơn giản trong điều kiện hiện đại.)


Chỉ muốn thêm vào, EVE Online là một mô phỏng không gian 'trực tuyến', trong đó các trận đấu giữa người chơi và 1000 người chơi là phổ biến, có thể được tính là một kịch bản đòi hỏi khắt khe về hiệu suất. Mặc dù các phần chuyên sâu về tốc độ được viết bằng C / C ++, đây vẫn là một nghiên cứu thú vị về những thách thức của việc sử dụng ngôn ngữ cấp cao (Python) trong các trò chơi.
Hakan Deryal

Tuy nhiên, hãy nhớ rằng hiệu suất trong các trò chơi phía máy chủ nhiều người chơi được đo bằng các số liệu hơi khác nhau so với hiệu suất trong các trò chơi phía máy khách một người chơi - trước đây quan tâm nhiều hơn đến thông lượng, sau này có độ trễ.
Kylotan

Đúng, nhưng các trận chiến bao gồm hơn 2000 tàu trên màn hình, với hơn 2000 tên lửa (tên lửa, có hình động), vụ nổ, v.v ... đòi hỏi một số hiệu năng đồ họa nặng. Dù sao, cảm ơn câu trả lời chi tiết, nó vẫn đúng.
Hakan Deryal

1
Nếu bạn nghĩ rằng cú pháp C & Java giống nhau và do đó có một số mối quan hệ với hiệu suất thì bạn thực sự không hiểu điều gì đang xảy ra. Làm thế nào C có thể quyết định trong thời gian chạy rằng một hàm đã cho đang được gọi với cùng một tham số và thay thế toàn bộ lệnh gọi bằng một hằng số trong khi giữ lại lệnh gọi hàm khi có sự sai lệch trong các tham số? Tôi không nói rằng thời gian chạy luôn tốt hơn hoặc tệ hơn, chỉ là nó không có mối quan hệ nào với cú pháp!
Bill K

1
@BillK - bạn có vẻ đã đọc sai. Tôi chỉ đề cập cú pháp với tham chiếu đến 'năng suất' - không phải là 'hiệu suất'. Đúng là tối ưu hóa JIT có thể làm cho Java nhanh hơn về mặt lý thuyết, nhưng điều này không xảy ra trong thực tế, ít nhất là không có trong phần mềm trò chơi.
Kylotan

12

Tôi đang chơi Sims 3 và tôi đã chọc ngoáy. Công cụ đồ họa là C ++, trong khi công cụ kịch bản và hành vi là C # / Mono. Vì vậy, trong khi C ++ dành cho các bit quan trọng về thời gian, các thứ khác như .interaction, logic game, AI nằm trong ngôn ngữ được quản lý theo hướng đối tượng.


5
và sau đó cho phiên bản Mac, họ chuyển toàn bộ thứ bên trong một máy ảo Wine đã được sửa đổi. Vẫn nhanh hơn so với Java, tôi nghĩ :-)
Ben Gotow

10
Wine không phải là một máy ảo, nó là một thư viện thời gian chạy mô phỏng hành vi của các thư viện thời gian chạy Windows. Do đó tên (Wine Is Not a Emulator).
Nate CK

2
Điều này rất phổ biến trong các trò chơi, thường là logic không quan trọng về thời gian được viết bằng một số ngôn ngữ kịch bản, thường là lua hoặc python.
KSchmidt

Đó không phải là vani Mono, mặc dù. EA cần một nhóm đặc biệt làm việc trên toàn thời gian CLR tùy chỉnh của riêng họ để làm cho nó hoạt động.
Crashworks

4
Chỉ cần lưu ý một chút rằng Sims 3 nổi tiếng là hoạt động kém hiệu quả ngay cả trên các máy tính xuất sắc.
Lotus Notes

12
  • Có bất kỳ cổng tốt của công cụ / thư viện chơi game?
  • Nhiều nhà phát triển C / C ++, đặc biệt là các nhà phát triển trên Windows (nơi hầu hết các trò chơi thương mại được viết) đều quen thuộc với Visual Studio. Không có so sánh trong IDE.
  • Nói chung, Java đã được bán cho các doanh nghiệp vì nó đánh máy vững chắc và nó có nhận thức về việc không gặp vấn đề về quản lý bộ nhớ.
  • Và đúng vậy, Java vẫn phải chịu một nhận thức rằng nó chậm và quản lý bộ nhớ kém, và đối với các trò chơi, nó có lẽ không phù hợp với nhiệm vụ. Như đã nêu trong một số câu trả lời khác, bộ sưu tập rác sẽ không cắt giảm khi bạn xử lý các yêu cầu hiệu suất cao theo thời gian thực. Trò chơi video đẩy CPU và GPU đến giới hạn của chúng.

1
+1 cho văn bản in đậm. Mọi người dường như không nhận ra rằng khi trò chơi của bạn chạy ở tốc độ 20 khung hình / giây, thì phần cứng thường bị ràng buộc ở mức 20 khung hình / giây. Nó thực sự muốn đạt được hơn 30 khung hình / giây .. nhưng không thể.
GuiSim

Tôi không nghĩ rằng đó chỉ là vấn đề về hiệu năng, mặc dù ... cũng không phải là kết hợp với giai đoạn khởi động chậm ... đó là vấn đề hiệu suất chung, nhưng đó chỉ là tôi.
rogerdpack

2
Tôi nghĩ rằng tại thời điểm này tôi có nhiều khả năng đồng ý hơn trong quá khứ. Tối ưu hóa JVM đã được cải thiện; tuy nhiên, trong bối cảnh các cải tiến hiệu suất đối với các ngôn ngữ được gõ lỏng lẻo như JavaScript và các ngôn ngữ khác, so sánh hiệu năng của Java là không thể sử dụng được. Có rất nhiều người xin lỗi về hiệu năng của Java. (nhưng hiệu suất nhận thức cuối cùng mới là vấn đề) '
cgp

10

Một trong những lý do lớn nhất khiến Java và các ngôn ngữ Máy ảo khác không được sử dụng cho các trò chơi là do Bộ sưu tập rác. Điều tương tự cũng xảy ra với .NET. Bộ sưu tập rác đã đi một chặng đường dài và hoạt động tuyệt vời trong hầu hết các loại ứng dụng. Để thực hiện thu gom rác, bạn cần tạm dừng và ngắt ứng dụng để thu gom rác. Điều này có thể gây ra độ trễ định kỳ khi thu thập xảy ra.

Java có cùng một vấn đề cho các ứng dụng thời gian thực. Khi các tác vụ phải chạy tại một thời điểm cụ thể, thật khó để có một tác vụ tự động như bộ sưu tập rác tôn trọng điều đó.

Không phải là Java chậm. Đó là Java không giỏi xử lý các tác vụ thời gian thực.


1
Tuy nhiên, bạn có thể viết trình lập lịch biểu của riêng mình cho trình thu gom rác nếu bạn sẽ đi xa tới mức chuyển Java sang một môi trường mới. Bộ nhớ phải được lấy lại bằng bất kỳ cách nào, và trong môi trường thời gian thực, bạn có thể có tùy chọn khi nào lên lịch gc ... tốt nhất của cả hai thế giới. Tôi phải quay trở lại vấn đề không có nhiều lý do để chuyển Java sang một kiến ​​trúc để làm những việc bạn muốn nó làm khi C / C ++ đã làm những việc đó cho bạn. Java tỏa sáng ở những nơi khác.
San Jacinto

5
Đây không phải là những năm 1990. Bây giờ người thu gom rác khá tốt khi điều chỉnh tạm dừng thấp.
Tom Hawtin - tackline

8

Một lý do lớn là các trò chơi video đòi hỏi kiến ​​thức trực tiếp về phần cứng bên dưới, thường xuyên và thực sự không có triển khai tuyệt vời cho nhiều kiến ​​trúc. Đó là kiến ​​thức về kiến ​​trúc phần cứng cơ bản cho phép các nhà phát triển vắt kiệt từng ounce hiệu năng ra khỏi hệ thống chơi game. Tại sao bạn lại dành thời gian để chuyển Java sang nền tảng chơi trò chơi và sau đó viết một trò chơi lên trên cổng đó khi bạn chỉ có thể viết trò chơi?

chỉnh sửa: điều này có nghĩa là nó không chỉ là vấn đề "tốc độ" hay "không có thư viện phù hợp". Hai thứ đó song hành với nhau, nhưng vấn đề là "làm cách nào để tạo một hệ thống như tế bào chạy mã java của tôi? Thực sự không có trình biên dịch java tốt nào có thể quản lý các đường ống và vectơ như tôi cần .. "


7

Vấn đề hiệu suất là lý do đầu tiên. Khi bạn thấy loại mã C ++ được tối ưu hóa siêu cao trong các công cụ Quake ( http://www.codemaestro.com/reviews/9 ), bạn biết rằng họ sẽ không lãng phí thời gian của mình với một máy ảo.

Chắc chắn có thể có một số trò chơi .NET (trò chơi nào? Tôi quan tâm. Có một số trò chơi thực sự sử dụng nhiều CPU / GPU không?), Nhưng tôi đoán nó nhiều hơn bởi vì nhiều người là chuyên gia về công nghệ MS và đã theo dõi Microsoft khi họ tung ra công nghệ mới của họ.

Oh và đa nền tảng không phải là trong suy nghĩ của các công ty trò chơi video. Linux chỉ chiếm khoảng 1% thị trường, Mac OS thêm vài%. Họ chắc chắn nghĩ rằng không đáng để từ bỏ các công nghệ và những lời nói dối chỉ dành cho Windows như DirectX.


3
"Đa nền tảng không nằm trong suy nghĩ của các công ty trò chơi video" - Đó là lý do tại sao tôi hoàn toàn tôn trọng các công ty làm việc đó. :)
Sasha Chedygov

Tôi chắc chắn biết ơn Carmack vì đã cam kết với cả nền tảng chéo và nguồn mở. Tôi chỉ đơn giản nói những gì hầu hết các công ty nghĩ.
Ksempac

1
Đúng. Bạn không thấy nhiều trò chơi video phổ biến được chuyển sang Linux. :(
Sasha Chedygov

Đa nền tảng không chỉ là hệ điều hành chéo. Hãy nghĩ về PS3, Xbox 360, Wii.
JulianR

"Họ sẽ không lãng phí thời gian của họ với một máy ảo." vi.wikipedia.org/wiki/Quake_III_Arena#Virtual_machine , Carmack tự xây dựng cho logic trò chơi.
James McMahon

4

Bạn cũng có thể hỏi tại sao các ứng dụng web không được viết bằng C hoặc C ++. Sức mạnh của Java nằm ở ngăn xếp mạng và thiết kế hướng đối tượng. Tất nhiên C và C ++ cũng có điều đó. Nhưng trên một sự trừu tượng thấp hơn. Điều đó không có gì tiêu cực, nhưng bạn không muốn phát minh lại bánh xe mỗi lần, phải không?

Java cũng không có quyền truy cập phần cứng trực tiếp, điều đó có nghĩa là bạn bị mắc kẹt với API của bất kỳ khung công tác nào.


Java có thể gọi mã gốc thông qua "JNI"
Bart van Heukelom

4
... và mất tính di động trong khi bạn đang ở đó!
LiraNuna

1
Bạn thực sự không mất nhiều tính di động khi bạn sử dụng JNI. Với điều kiện bạn vẫn có thể biên dịch các thư viện riêng trên các nền tảng bạn muốn hỗ trợ, về cơ bản, điều đó chỉ có nghĩa là bạn chỉ phải chuyển / biên dịch lại 1% mã của bạn chứ không phải tất cả mã. Bạn vẫn nhận được rất nhiều lợi ích từ tính di động của Java.
bgroenks

4

Những quan niệm sai lầm về hiệu năng và tối ưu hóa JVM kém sẽ là phỏng đoán của tôi. Tôi nói những quan niệm sai lầm về hiệu năng bởi vì có một số cổng Java của trò chơi C ++ hoạt động nhanh hơn so với các đối tác C ++ của họ (xem Jake 2). Vấn đề thực sự, IMHO, là nhiều lập trình viên Java không tập trung quá nhiều vào hiệu năng vượt trội vì chúng dễ sử dụng và dễ hiểu / khả năng duy trì mã. Về phía C / C ++, về cơ bản, bạn đang mã hóa bằng ngôn ngữ lắp ráp cấp độ cao hơn một chút và nó gần với phần cứng như bạn có thể nhận được mà không cần viết mã lắp ráp hoặc mã máy thẳng.


Nếu nó "gần với phần cứng như bạn có thể nhận được mà không cần phải lắp ráp", thì Java sẽ không thể đánh bại nó, trừ khi mã hóa của bạn rất tệ. Bạn càng đến gần với phần cứng, bạn sẽ càng có thể nhận được nhanh hơn.
Josh Johnson

4

Danh sách các công cụ trò chơi trên Wikipedia liệt kê nhiều công cụ trò chơi cùng với ngôn ngữ lập trình mà chúng được viết.

Có một số công cụ trò chơi Java được liệt kê.

Nhấp vào một số liên kết sẽ dẫn bạn đến các ví dụ về trò chơi và bản demo được viết bằng Java. Đây là một cặp vợ chồng:

Đối với một số trò chơi và tình huống nhất định, sự đánh đổi của Java có thể được chấp nhận.


Tôi biết các trò chơi tồn tại được viết bằng Java. Nhưng bên cạnh Minecraft và Runescape, rất ít trò chơi thương mại chính được viết cho nền tảng Java. Có bao nhiêu tiêu đề AAA được viết bằng Java? Và tại sao rất ít? Do đó câu hỏi của tôi.
Sasha Chedygov

3

.NET chắc chắn có một số vấn đề tương tự như Java khi nói đến hiệu năng 3D mãnh liệt. Microsoft cũng đã đầu tư nhiều thời gian và tiền bạc hơn cho việc phát triển các thư viện khi làm việc với các hoạt động nặng 3D.

(... Cá nhân, tôi cũng nghĩ rằng họ đã hợp tác khi nói đến phép màu giữa DirectX và .NET)


2
  1. Java chậm, hầu hết các công việc nặng không được xử lý bởi GPU. Vẫn còn hoạt hình, vật lý và AI tấn công CPU, tất cả đều rất tốn thời gian.

  2. Java không tồn tại trên các bảng điều khiển và bảng điều khiển là mục tiêu chính cho các trò chơi thương mại. Nếu bạn sử dụng Java trên PC, bạn sẽ loại bỏ khả năng chuyển sang bảng điều khiển trong thời gian và ngân sách hợp lý.

  3. Nhiều lập trình viên có kinh nghiệm hơn trong ngành công nghiệp trò chơi đã sử dụng C và C ++ từ lâu trước khi Java trở nên phổ biến. Hai điểm trên có thể góp phần vào điều này, nhưng tôi hy vọng rằng nhiều lập trình viên trò chơi chuyên nghiệp chỉ không thực sự hiểu rõ về Java.

  4. Quan điểm của người khác về phần mềm trung gian ở trên là một điểm tốt, vì vậy tôi đang thêm nó vào câu trả lời của mình. Có rất nhiều mã kế thừa và phần mềm trung gian được viết riêng để liên kết với C / C ++ và cuối cùng tôi đã kiểm tra Java không có khả năng tương tác tốt. Sử dụng Java cho hầu hết các công ty sẽ liên quan đến việc đưa ra rất nhiều mã, phần lớn trong số đó đã được trả bằng cách này hay cách khác.


3
Bạn có thể sử dụng JavaCL, JOCL hoặc APARAPI để giảm tải rất nhiều thứ cho GPU.
bgroenks

2

Trên thực tế, rất có thể mã được quản lý để làm trò chơi 3d, vấn đề là các công cụ trở lại. Với .Net, trong một khoảng thời gian ngắn, đã có một trình bao bọc DirectX được quản lý cho DirectX 9 của Microsoft. Điều này là trước khi trừu tượng mà bây giờ là XNA.

Được cấp toàn quyền truy cập vào DirectX api's, các trò chơi .Net hoạt động tốt. Ví dụ tốt nhất mà tôi biết là www.entombed.co.uk, được viết bằng VB.Net.

Thật không may, về phía Java, nó thiếu trầm trọng - chủ yếu là vì lý do DirectX không có sẵn cho Java và các lập trình viên trò chơi biết và hiểu api DirectX - tại sao lại tìm hiểu một api khác khi bạn sẽ quay trở lại DirectX?


2

Tiếp thị trò chơi là một quá trình thương mại; các nhà xuất bản muốn lợi nhuận rủi ro thấp có thể định lượng cho khoản đầu tư của họ. Do đó, trọng tâm thường tập trung vào các mánh lới công nghệ (ngoại trừ) mà người tiêu dùng sẽ mua để tạo ra lợi nhuận đáng tin cậy - những xu hướng này là hiệu ứng hình ảnh bề ngoài như lóa ống kính hoặc độ phân giải cao hơn. Những hiệu ứng này đáng tin cậy vì đơn giản là chúng sử dụng tăng sức mạnh xử lý - chúng khai thác phần cứng / định luật Moore tăng. điều này ngụ ý sử dụng C / C ++ - java thường quá trừu tượng từ phần cứng để khai thác những lợi ích này.


1

Tôi đoán rằng tốc độ vẫn là vấn đề. Nền tảng chéo sẽ là một vấn đề phải không vì bạn không biết thẻ 3d nào có sẵn khi bạn viết mã? Java có gì để hỗ trợ tự động phát hiện các khả năng 3d không? Và tôi đoán rằng có những công cụ để dễ dàng chuyển một trò chơi giữa wii, xbox và ps3, nhưng tôi sẽ đặt cược đắt tiền.

Các ps3 có java, thông qua hỗ trợ tia xanh. Kiểm tra trang web bd-j.


1

Ngay cả các trò chơi được viết trên nền tảng .Net thường được tối ưu hóa cao về tốc độ như truy cập trực tiếp vào bộ nhớ và xe buýt. .Net cho phép sử dụng C / C ++ và trộn nó với các ngôn ngữ cấp cao hơn như C #.

Các studio phát triển trò chơi thường làm việc gần gũi với các nhà cung cấp phần cứng, cung cấp quyền truy cập vào các giao diện cấp thấp của các sản phẩm của họ. Đây là một thế giới, nơi bạn phải sử dụng ASM và C để liên lạc với thiết bị. Một môi trường ảo sẽ làm chậm các phần chương trình này.

Dù sao, các trò chơi 3D hiện đại trên thực tế sử dụng các ngôn ngữ cấp cao hơn. Thông thường, bạn sẽ tìm thấy logic trò chơi được viết bằng các ngôn ngữ như Lua hoặc Python. Nhưng cốt lõi (I / O, chủ đề, lập lịch tác vụ) của trò chơi 3D thông thường sẽ được viết bằng ngôn ngữ cấp thấp trong 25 năm tới hoặc vì các thiết bị dài không cho phép trừu tượng hóa và ảo hóa bởi chính chúng (sẽ xuất hiện).


1

Tôi đồng ý với các bài viết khác về việc tận dụng các yếu tố của một cơ sở mã có sẵn / được cấp phép, hiệu suất, v.v.

Một điều tôi muốn nói thêm là thật khó để thực hiện các thủ thuật DRM khó chịu thông qua một máy ảo.

Ngoài ra tôi nghĩ có một thành phần trung tâm trong đó các nhà quản lý dự án nghĩ rằng họ có thể tạo mã ổn định / đáng tin cậy bằng C ++ với tất cả các đặc quyền như có quyền kiểm soát tuyệt đối đối với các công cụ và tài nguyên của họ, NHƯNG không có tất cả các tiêu cực làm phức tạp và làm giảm sự cạnh tranh của họ vì "chúng tôi" lại thông minh hơn họ ".


0

Runescape của Jagex được viết bằng Java, thẻ "trò chơi video" có thể không áp dụng cụ thể nó là một trò chơi trực tuyến, nhưng nó có một số lượng khá.


Xin lỗi, nhưng điều này thực sự không trả lời câu hỏi của tôi.
Sasha Chedygov

2
Nhưng tuyên bố mù quáng của câu hỏi dẫn đến giả định rằng KHÔNG có trò chơi nào được viết bằng Java, chỉ nêu ra trường hợp thành công của một người.
Mark Schultheiss

0

Nó đã được nói về nó rất nhiều rồi, bạn có thể tìm thấy ngay cả trên Wiki những lý do ...

  • C / C ++ cho công cụ trò chơi và tất cả những thứ chuyên sâu.
  • Lua hoặc Python để viết kịch bản trong trò chơi.
  • Java - hiệu năng rất rất tệ, sử dụng bộ nhớ lớn + không có trên Game console (Nó được sử dụng cho một số trò chơi rất đơn giản (Có, Runescape tính ở đây, không phải Battlefield hay Crysis hay những gì khác ở đó) chỉ vì có rất nhiều lập trình viên biết ngôn ngữ lập trình này).
  • C # - sử dụng bộ nhớ lớn (Nó được sử dụng cho một số trò chơi rất đơn giản chỉ vì có khá nhiều lập trình viên biết ngôn ngữ lập trình này).

Và tôi nghe ngày càng nhiều lập trình viên Java cố gắng thuyết phục mọi người rằng Java không chậm, không chậm để vẽ một widget trên màn hình và vẽ một số ký tự ASCII trên widget, để nhận và gửi dữ liệu qua mạng (Và đó là nên sử dụng nó trong trường hợp này (thao tác dữ liệu mạng) thay vì C / C ++) ... Nhưng thật chậm khi nói đến những thứ nghiêm trọng như tính toán, phân bổ / xử lý bộ nhớ và rất nhiều thứ hay ho này.

Tôi nhớ một bài viết trên trang MIT, nơi họ chỉ ra C / C ++ có thể làm gì nếu bạn sử dụng các tính năng của ngôn ngữ và trình biên dịch: Một hệ số nhân ma trận (2 ma trận), 1 triển khai trong Java và 1 triển khai trong C / C ++, với các tính năng C / C ++ và tối ưu hóa trình biên dịch phù hợp được kích hoạt, việc triển khai C / C ++ nhanh hơn ~ 296 260 lần so với triển khai Java.

Tôi hy vọng bạn đã hiểu tại sao mọi người sử dụng C / C ++ thay vì Java trong các trò chơi, hãy tưởng tượng Crysis trong Java, sẽ không có máy tính nào trên thế giới này có thể xử lý ... + Bộ sưu tập rác hoạt động tốt với Widgets vừa phá hủy hình ảnh nhưng nó vẫn được lưu trong bộ nhớ cache và cần được dọn dẹp nhưng không phải cho các trò chơi, chắc chắn, bạn sẽ có nhiều độ trễ hơn trên mỗi lần kích hoạt bộ sưu tập rác.

Chỉnh sửa : Bởi vì ai đó đã yêu cầu bài viết, ở đây, tôi đã tìm kiếm trong kho lưu trữ web để có được điều đó, tôi hy vọng bạn hài lòng ... Nghiên cứu trường hợp MIT

Và để thêm, không, Java để chơi game vẫn là một ý tưởng tồi tệ. Chỉ vài ngày trước, một công ty lớn mà tôi đã không nêu tên đã bắt đầu viết lại ứng dụng khách trò chơi của họ từ Java sang C ++ vì một trò chơi rất đơn giản (về mặt Đồ họa) đã bị lag và làm nóng Máy tính xách tay i7 với thẻ video thế hệ nVidia GT 5xx và 6xx mạnh mẽ ( Không chỉ nVidia, vấn đề ở đây là các thẻ mạnh mẽ này có thể xử lý trên các cài đặt Max hầu hết các trò chơi mới và không thể xử lý trò chơi này) và mức tiêu thụ bộ nhớ là ~ 2,5 - 2,6 GB Ram. Đối với đồ họa đơn giản như vậy, nó cần một con thú của một cỗ máy.


10
Bạn rõ ràng biết rất ít về thời gian chạy Java và máy ảo hiện đại. Bài viết bạn đề cập nhiều khả năng từ một thập kỷ trước trở lên, tất nhiên không ai có thể biết vì bạn đã không trích dẫn nó. Nhận thức của bạn về Java đã lỗi thời.
bgroenks

2
Ok để nghiên cứu chứng minh rằng đối với phép nhân ma trận quy mô lớn, Java sẽ mất C khi truy cập mảng 2 chiều đang được sử dụng để truy cập dữ liệu. Vâng, tôi cũng đã đoán được điều đó. Và nếu đó thực sự là một vấn đề đối với bạn, mà tôi nghi ngờ nó sẽ là, đó là lý do tại sao bạn có JNI. Các giới hạn kiểm tra chi phí cho các mảng sẽ tăng thêm trong tình huống đó, mặc dù mã Java của anh ta có thể đã được tối ưu hóa để cải thiện đáng kể kết quả. Tương tự như vậy, tôi đặt câu hỏi về sự hiểu biết của anh ấy về JIT khi anh ấy nói, "biên dịch nhanh hơn = không phải là mã tốt nhất được tạo ra." Đi đọc đặc tả của IBM để chứng minh khác.
bgroenks

3
Java KHÔNG phải là một lựa chọn tồi cho phát triển trò chơi. Có rất nhiều trò chơi thành công chạy Java. Thông thường, bạn cần một chút trợ giúp từ mã gốc (đặc biệt là với LWJGL và như vậy) để thực sự có được kết quả tốt nhất. Nhưng nếu tôi chỉ phải chuyển và biên dịch lại 1% mã của mình chứ không phải 100%, điều đó nghe có vẻ rất tuyệt vời đối với tôi.
bgroenks

1
@bgroenks "100%" - có vẻ như bạn không biết gì về C / C ++ ... Và khi tạo trò chơi, bạn luôn có thể sử dụng thư viện đa nền tảng (SDL và một nhóm người khác) hoặc khung (ví dụ Qt). Ví dụ: EA sử dụng Qt cho tất cả các trò chơi mà họ có ... Qt là CÁCH nhiều nền tảng hơn Java và nó biên dịch thành mã gốc.
Lilian A. Moraru

2
Tôi không thực sự thấy điểm trong Java khi bạn có Qt. Tôi thấy mã Qt rõ ràng hơn, dễ hiểu và dễ bảo trì hơn mã Java. Khi tôi hỏi bạn bè tại sao họ rất sợ C ++, họ luôn nói với tôi rằng họ ghét con trỏ và đảm bảo giải phóng bộ nhớ. Có vẻ như nhiều người không biết về shared_ptr trong C ++ ... Đối với tôi, Qt và C # .NET / C ++ .NET là thứ tốt nhất để viết. Mã Java thường rất khó xử lý ngoại lệ, thường là các thư viện lỗi thời (Nó hoạt động tốt chủ yếu chỉ ở phía máy chủ nhưng phần còn lại ...) và tài liệu thường xuyên lỗi thời.
Lilian A. Moraru 16/03/13
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.