Java có khả thi để phát triển trò chơi nghiêm túc không? [đóng cửa]


64

Tôi đã truy quét internet, nhưng không có nhiều tài nguyên để phát triển trò chơi Java, không nhiều như C ++. Trong thực tế, hầu hết các công cụ được viết bằng C ++. Tôi đã thử chơi một trò chơi được làm bằng jMonkeyEngine, nhưng trò chơi rất chậm, đến mức máy tính của tôi bị đóng băng. Tôi không có ứng dụng Java nào khác đang chạy và không có gì quá tốn tài nguyên. Ngược lại, máy tính của tôi có thể chơi hầu hết các trò chơi 3D hiện đại một cách dễ dàng. Nếu tôi tiếp tục học và cải thiện Java bây giờ, và hóa ra sau này tôi bắt buộc phải học C ++, việc chuyển đổi có thể khó khăn.

Java có phải là ngôn ngữ chấp nhận được để phát triển trò chơi nghiêm túc không? Nói một cách nghiêm túc, ý tôi là đồ họa chất lượng cao, không có nhiều độ trễ trên các máy tính hiện đại. Tôi cũng muốn xem xét làm trò chơi cho bảng điều khiển.


25
Không phải minecraft được xây dựng với java? Hay chủ yếu là OpenGL? Oh và kiểm tra C # nếu bạn không được thiết lập 100% trên java, vì nó thật tuyệt vời.
Aralox

7
Tại sao bạn không đến với Trò chuyện Stack Overflow C ++? Chúng tôi yêu thích C ++, chúng tôi nghĩ rằng nó hoàn toàn có thể được sử dụng đúng và chúng tôi biết cách làm điều đó và chúng tôi hoàn toàn vui vẻ chia sẻ.
DeadMG

12
Minecraft là kỹ năng mã hóa của java + LWJGL + Notch, vì vậy, hiệu năng của nó là TERRIBLE.
MLProgrammer-CiM

3
Cho dù trò chơi mã hóa của bạn hay bất cứ điều gì khác, việc tự nhốt mình vào một ngôn ngữ sẽ không giúp ích gì cho bạn trong tương lai. Chi nhánh ra một chút, hoặc C ++ hoặc một cái gì đó khác như Python. Nó mất thời gian, nhưng nó làm cho bạn một dev tốt hơn.
loganfsmyth

4
Bạn sẽ nhận được nhiều thông tin sai lệch vì các cuộc chiến Java / C ++ bùng cháy dữ dội, hãy sẵn sàng hỏi các ví dụ cụ thể trước khi chấp nhận ý kiến ​​và cũng để nghiên cứu thêm về chính bạn =) Có thể nói, tôi đồng ý với @loganfsmyth rằng bạn sẽ cần biết nhiều ngôn ngữ vì chỉ khi đó bạn mới có thể chọn công cụ phù hợp cho bất kỳ nhiệm vụ nào. Trước mắt, nếu bạn chỉ muốn học "lập trình kiểu trò chơi" thì hãy sử dụng những gì bạn thấy thoải mái với (Java) và sau đó học C ++ sau. Heck, sau này bạn có thể thực hiện các đường ống nội dung trong C # và các trò chơi trong Java ME, thật khó để dự đoán =)
Patrick Hughes

Câu trả lời:


54

Có nó, kiểm tra danh sách này cho một bằng chứng. Đó là một số trò chơi được tạo bằng Java bằng Thư viện trò chơi Java nhẹ (LWJGL). Nó là một khung công tác cấp thấp, cung cấp OpenGL cho đồ họa chất lượng cao và OpenAL cho âm thanh. Nó cũng cung cấp API đầu vào. Với những điều này, bạn có thể dễ dàng bắt đầu phát triển trò chơi nghiêm túc trong Java.

Tôi hiện đang viết trò chơi 3D thứ hai của mình như một dự án sở thích bằng Java và tôi chỉ thích nó. Trước đây tôi thường viết các trò chơi của mình bằng C ++, nhưng sau khi chuyển sang Java thì không có gì quay lại. Hỗ trợ nhiều hệ điều hành với Java có thể rất dễ dàng, ví dụ như trò chơi Java trước đây của tôi, mà tôi đã phát triển trong Windows trong một năm, đã làm việc trong Linux ngay lập tức và trong OS X chỉ với một lỗi mà không cần phải biên dịch bất cứ thứ gì trên các nền tảng đó.

Mặt khác, với Java, bạn có một vài vấn đề.

  1. Thu gom rác. Như những người khác đã nêu, quản lý bộ nhớ không xác định là một vấn đề, và bạn cần phải viết mã đó trong tâm trí.
  2. Thiếu thư viện của bên thứ 3. Hầu hết các thư viện có sẵn không hỗ trợ Java. Mặt khác, bạn luôn có tùy chọn để gọi các thư viện gốc này từ Java, nhưng còn nhiều việc phải làm như vậy. Ngoài ra còn có các cổng Java hoặc trình bao bọc làm sẵn có sẵn cho các thư viện phổ biến, ví dụ: tôi đang sử dụng JBONS - cổng Java của Thư viện Vật lý Bullet . Mặt khác, Java có một thư viện lớp khổng lồ tích hợp sẵn, giúp giảm nhu cầu về các thư viện bên thứ ba không liên quan đến trò chơi. Việc thiếu thư viện không phải là vấn đề đối với tôi, nhưng tôi có thể tưởng tượng rằng nó có thể dành cho người khác.
  3. Java không được hỗ trợ bởi các máy chơi game phổ biến và không có sự chuyển đổi dễ dàng nào với những người đến từ Java theo như tôi biết. Mặt khác, Android, một nền tảng di động phổ biến, sử dụng một số dạng Java. Đây cũng là một tùy chọn, nhưng không ngoại trừ cùng mã Java để hoạt động cả trên PC và thiết bị Android.
  4. Cộng đồng nhỏ hơn. Hầu hết các lập trình viên trò chơi sử dụng C ++ và theo kinh nghiệm của tôi thường không thích Java. Đừng mong nhận được nhiều sự giúp đỡ từ người khác. Đừng mong đợi có được một công việc phát triển trò chơi mà không có kỹ năng C ++.

40

Không hẳn vậy. Đây là điều - trước hết, có rất ít về các thư viện hiện có cho Java so với hầu hết mọi thứ dành cho C ++.

Thứ hai, Java là ngôn ngữ đơn giản là không cho vay phát triển trò chơi - ý tôi là, ví dụ, nếu bạn đang xử lý bộ đệm GPU thì Java không cung cấp tính năng ngôn ngữ sẽ hỗ trợ bạn đảm bảo chúng được khóa chính xác và mở khóa hoặc xử lý, mà C ++ làm. Thêm vào đó, có vấn đề về hiệu năng - và GC không mang tính quyết định, điều này cực kỳ tệ cho một trò chơi.

Tôi chưa bao giờ quan sát bất kỳ trò chơi không độc lập nào dành thời gian đáng kể bằng ngôn ngữ không được biên dịch thành mã gốc trước khi thực hiện và ngay cả những trò chơi độc lập cũng rất hiếm. Vì vậy, niềm tin của tôi ngay bây giờ là nó không thể được thực hiện.

Ngoài ra, nếu tôi tiếp tục học và cải thiện Java bây giờ, và hóa ra sau này tôi bắt buộc phải học C ++, việc chuyển đổi có khó khăn không?

Vâng, hoàn toàn nó sẽ. Java và C ++ rất khác nhau, mặc dù có sự tương đồng về mặt cú pháp bề ngoài. Kinh nghiệm Java hầu như không có gì khi học C ++.

Gameplay trên đồ họa một lựa chọn khả thi, và bạn có thể thấy nó trong sự thành công của các trò chơi như Terarria và Minecraft. Nhưng nếu bạn có ý định tạo đồ họa srs, thì Java sẽ không thể thực hiện được.


6
+1 kể từ khi anh chỉ định đồ họa nặng, chơi trò chơi nhanh mà không bị lag.
Joshua Drake

1
Java thiếu các kiểu dữ liệu không dấu cũng chống lại nó. Có, bạn có thể làm việc xung quanh nó, nhưng nó không lý tưởng và bạn sẽ sử dụng mã không thực sự phản ánh chính xác dữ liệu cơ bản.
Maximus Minimus

@deadmg Là trường hợp bị khóa và mở khóa , bạn đang đề cập đến một số chức năng api DirectX? & Bạn có thể cho tôi biết, có gì tệ khi có GC không xác định.
Quazi Irfan

GC không xác định có thể tương đương với việc bỏ khung hình, nếu bạn gặp phải tình trạng dừng thế giới tạm dừng và nó sẽ khóa mọi thứ lâu hơn thời gian để hiển thị khung. Trong thực tế, điều này không thực sự xảy ra thường xuyên / bao giờ nếu bạn lập kế hoạch sử dụng bộ nhớ của mình, các bộ thu của JVM có thể được cấu hình để tạm dừng thấp (trong giới hạn an toàn cho việc giảm khung hình). Tuy nhiên, đó không phải là một điều thú vị để giải quyết. Cuối cùng, bạn phải trả lại một lượng đáng kể năng suất mà bạn đã đạt được khi rời khỏi C ++.
Michael

2
Một khởi đầu bạn sẽ phải viết lại hoàn toàn.
DeadMG

25

Vì vậy, tôi thực sự nghiêm túc về phát triển trò chơi, liệu Java có còn là một lựa chọn khả thi? Tôi đã thử nhiều lần để học C ++, nhưng tôi không thực sự thích ngôn ngữ này. Tôi thực sự không biết tại sao, nhưng thông thường, bất cứ khi nào tôi cố gắng học, tôi không bao giờ có thể nắm bắt được các chủ đề.

Nếu lý do bạn chọn Java là bạn không thể hiểu C ++, thì các chương trình Java của bạn sẽ không đủ nhanh để có đồ họa chất lượng cao. Sử dụng ngôn ngữ cấp cao hơn là vì nó giúp bạn làm việc hiệu quả hơn, không phải vì bạn không thể hiểu được ngôn ngữ cấp thấp hơn.

Tôi không nghĩ rằng việc viết một trò chơi bằng Java là một ý tưởng hoàn toàn tồi tệ, đặc biệt là nếu trò chơi này đơn giản, nhưng ngay lập tức bạn sẽ gặp phải các vấn đề về hiệu năng trong Java nếu bạn sử dụng nó như một cái nạng.

Vì vậy, trong ngắn hạn, Java có thể được coi trọng, để phát triển trò chơi nghiêm túc. Điều này bao gồm đồ họa nặng, chơi trò chơi nhanh mà không bị lag, và có thể, và dễ dàng chuyển sang bảng điều khiển?

  1. Đồ họa nặng: Có thể, nhưng bạn sẽ làm điều tương tự trong Java / LWJGL giống như bạn đang ở trong C ++ / GL: ghi byte vào bộ đệm GPU và / hoặc sử dụng danh sách hiển thị không dùng nữa như Minecraft. Nếu bạn không hiểu quản lý bộ nhớ, bạn cũng sẽ không làm điều này một cách chính xác.

  2. Chơi trò chơi nhanh mà không bị lag: Không phải là một nhiệm vụ dễ dàng trong bất kỳ ngôn ngữ nào và bạn có nhiều khả năng tự bắn vào chân mình mà không cần suy nghĩ.

  3. Không, Java sẽ không có sẵn trên bảng điều khiển.


Là một câu hỏi phụ, điều gì đã thay thế danh sách hiển thị khi chúng không được dùng nữa?
Suds

@Suds: Đường ống lập trình, tôi tin.
DeadMG


Nền tảng di động có thể được coi là bảng điều khiển. Tôi nhận ra anh ta có lẽ đang nói về ba ông lớn, nhưng Android sử dụng Java và rất nhiều trò chơi được tạo ra cho nó.
Amplify91

1
@ Amplify91 có một vài trò chơi được viết bằng java cho Android. Nhưng hầu hết các trò chơi hay và có lẽ tất cả các trò chơi chuyên sâu về đồ họa hoặc đa nền tảng đều được viết bằng C ++ bằng Android NDK.
Coyote

15

Một lập trình viên có kinh nghiệm thường sẽ biết nhiều ngôn ngữ lập trình - học thêm ngôn ngữ lập trình không quá khó một khi bạn biết rõ một ngôn ngữ. Tuy nhiên, tôi thực sự khuyên bạn nên C ++ không nên là ngôn ngữ đầu tiên của bạn và có lẽ cũng không phải là ngôn ngữ thứ hai.

Đó là bởi vì C ++ nhận được rất nhiều hiệu quả từ việc không thực hiện bất kỳ kiểm tra lỗi thời gian chạy đáng kể nào. Ví dụ, việc truy cập một phần tử ở cuối một mảng trong Java sẽ luôn đưa ra một ngoại lệ cho người lập trình biết chính xác những gì sai. Trong C ++, bạn có thể gặp may mắn và nó sẽ bị sập ngay lập tức, nhưng rất thường xuyên, nó sẽ âm thầm làm mất một số dữ liệu khác và lỗi sẽ không xuất hiện cho đến sau này .

Tôi khuyên bạn nên gắn bó với Java ngay bây giờ (hoặc chuyển sang C # nếu bạn thích điều đó). Điều đó sẽ cho phép bạn hoàn thành công việc nhanh hơn so với sử dụng C ++ và hiệu suất trên PC không phải là vấn đề.

Hãy suy nghĩ về việc học C ++ sau khi bạn hoàn thành một vài dự án bằng các ngôn ngữ an toàn hơn. C ++ là những gì bạn sẽ cần cho hầu hết các công việc phát triển trò chơi chuyên nghiệp.

Lưu ý rằng ngoại trừ C # / XNA nhận được một trò chơi mà bạn đã viết trên bảng điều khiển ở mức tối thiểu yêu cầu bạn phải thành lập công ty, với một văn phòng và có ngân sách lớn dành cho phần cứng phát triển và các chi phí khác.


Điều này cũng đặc biệt đúng bởi vì các ngôn ngữ khác ngoài C ++ sẽ mang lại cho bạn cảm giác hoàn thành. C ++ có thể mất hàng trăm giờ cho những gì có thể cảm thấy như không có gì. Học các ngôn ngữ khác trước tiên cho phép bạn bị ướt chân.
Darkenor

Nhận xét của bạn về việc xử lý thiếu lỗi thực sự là về C (và còn được gọi là mã C ++ thực sự là C). C ++ có các thư viện chuẩn (và thư viện mẫu chuẩn) có khả năng xử lý lỗi tốt hơn nhiều so với những gì bạn mô tả. C ++ cũng có các thư viện do nhà cung cấp cung cấp (như MFC) cung cấp khả năng xử lý lỗi tốt.
Jasper

9

Tuyên bố từ chối trách nhiệm: Điều này không trả lời chính xác câu hỏi của bạn. Tuy nhiên, tôi đã cố gắng (nói ngắn gọn) một số điểm có thể khiến bạn quan tâm.

Lý do mà bạn thấy rất nhiều về C ++ là vì C ++ vẫn là tiêu chuẩn công nghiệp - ngôn ngữ phổ biến nhất cho bảng điều khiển, v.v.

Java không được sử dụng thường xuyên. Minecraft là một trò chơi khá phổ biến làm cho nó trở nên lớn với Java; nhưng nó không phải là đồ họa tuyệt vời. Hiệp sĩ xoắn ốc không phải là xấu - cũng được làm bằng Java, với đồ họa quan trọng.

Nếu bạn thích Java, C # rất giống cú pháp, với ưu điểm là nó có thể tương tác với C ++ - vì vậy những thứ cấp thấp có thể được thực hiện trong C ++ nếu cần thiết. Unity có thể sử dụng C # để viết kịch bản và XNA là một lựa chọn tuyệt vời.

Một lần nữa, Java không được sử dụng rộng rãi. Nếu bạn thích phong cách và cú pháp, tôi nghĩ bạn sẽ thấy C # là một trải nghiệm mã hóa rất giống nhau, rất dễ chịu.

Tôi hy vọng giấc mơ của bạn thực hiện được, đó là rất nhiều niềm vui trên đường đi :)


8
Rất nhiều và rất không chính xác trong bài viết này. Đồ họa "xấu" của Minecraft không liên quan (nhiều) đến ngôn ngữ. Hiệu suất kém của MC có liên quan trực tiếp đến việc Java là ngôn ngữ xấu cho các trò chơi vì các vấn đề về hiệu năng HUGE và LWJGL là một thư viện không phù hợp cho các dự án mã hóa lớn vì lý do tương tự. Nhưng yếu tố lớn nhất là mã hóa và triển khai kém của Notch, đang được sửa chữa ... từ từ. C # cung cấp cho bạn tất cả các bộ nhớ được quản lý mà không gặp phải hầu hết các vấn đề về hiệu năng Java. Nhược điểm là C # tập trung nhiều vào Microsoft cho cả trò chơi và ứng dụng.
MLProgrammer-CiM

2
@EfEs: Tôi ghét phải chia sẻ nó với bạn, nhưng bộ nhớ được quản lý rất tệ cho các trò chơi và những người viết mã trò chơi trong XNA phải dành nhiều thời gian hơn để quản lý bộ nhớ so với những người viết mã trong C ++. Bản chất không xác định của GC có nghĩa là bạn phải tập hợp thực tế mọi thứ và tránh phân bổ như bệnh dịch - không phải là cách ngôn ngữ được sử dụng.
DeadMG

Câu trả lời này không có nghĩa là chính xác 100%; Tôi chỉ trích dẫn các ví dụ tôi biết mơ hồ về. Hãy thoải mái với DV.
tro999

2
@DeadMG Tôi biết C ++ là con đường để đi, tôi chỉ cố gắng giải thích rằng C # tốt hơn Java cho các trò chơi.
MLProgrammer-CiM

5
Là một nhà phát triển C # lâu năm (không phải nhà phát triển trò chơi nghĩ) Tôi tin rằng việc quản lý bộ nhớ và bộ nhớ là vấn đề lớn đối với bất kỳ hệ thống nào được thiết kế tồi. Những người có tư duy và cách phát triển C / C ++ mà tôi biết, hầu như không háo hức với bộ nhớ được quản lý, các mẫu thiết kế và kiến ​​trúc phải được sử dụng và tận dụng chúng trong một ngôn ngữ như Java / C #. Điều tôi đang cố nói, không phải là các kỹ thuật hay sản phẩm C / C ++ là xấu, mà là ngay cả khi bạn sử dụng các ngôn ngữ đơn giản hơn về mặt cú pháp (như Java và C #), bạn vẫn cần nhiều kinh nghiệm để thiết kế trò chơi của mình đúng. đường.
Ivaylo Slavov

3

Điều này không trả lời câu hỏi của bạn; các vấn đề đồ họa và giao diện điều khiển dường như là điều bạn rất cần xem xét. Ngoài ra GC ảnh hưởng đến hiệu suất. Nhưng những gì tôi viết về:

Nếu bạn đang viết các chương trình OO lớn, phức tạp, bạn sẽ viết chúng nhanh hơn 5 lần so với C ++. Ngoài ra, bảo trì sẽ dễ dàng hơn rất nhiều. Tôi đã chuyển đổi, (phải thừa nhận cho phần mềm không phải là trò chơi) và năng suất của tôi tăng vọt. C #, một lựa chọn tốt khác, khó học hơn Java vì có nhiều hơn thế. Khi bạn biết điều đó, bạn có thể viết mã thậm chí nhanh hơn trong Java; nó cung cấp cho bạn rất nhiều thủ thuật. Tuy nhiên, tôi thấy những thủ thuật đó có thể làm cho việc bảo trì khó khăn. Và sau đó có tài liệu Java, giúp với các thư viện Mặt trời mã cũ của riêng bạn. C # không có gì khá giống nó.

Tôi đã làm một trò chơi lông lớn ở Java và thấy ngôn ngữ hoàn hảo, nhưng đồ họa của tôi rất cơ bản và nó không phải là một game bắn súng trong đó một phần mười giây là vĩnh cửu đối với người chơi. Ngoài ra, tôi hy vọng sẽ bổ sung rất nhiều vào nó sau này, trong khi tôi nghĩ rằng hầu hết mọi người chỉ đi và viết một trò chơi hoàn toàn mới.


3

Nhìn kìa, câu trả lời đơn giản cho "Java có khả thi cho nhà phát triển trò chơi không" là một điều hiển nhiên. Bạn có thể sử dụng bất kỳ ngôn ngữ lập trình để làm trò chơi. Điều đó không có nghĩa là bạn nên .

Có lẽ chính những điều khiến bạn tắt từ C ++ (quản lý bộ nhớ cấp thấp, không có trình thu gom rác, phải chú ý đến các con trỏ, cấu trúc như các mảng, v.v.) là những điều mà bạn nên học nếu bạn muốn khai thác tài nguyên của máy tính một cách hiệu quả nhất . Trò chơi của bạn sẽ chạy tốt nhất nếu bạn khai thác tài nguyên của máy tính một cách hiệu quả nhất.

Java thực hiện một số điều (chẳng hạn như kiểm tra giới hạn mảng) chỉ làm cho nó chạy chậm hơn. Trong mã ví dụ tiếng ồn Perlin Java được tối ưu hóa này , tác giả đã nhận xét "(truy cập mảng chậm hơn rất nhiều so với truy cập thành viên)". Đây là loại điều khá phản cảm trực quan đến từ nền C ++. Nhưng trong Java, những thứ như vậy là.

Tôi nói dừng việc tránh đạn, học C ++ và sử dụng nó.


1

Bạn nên làm điều đó bằng ngôn ngữ mà bạn biết rõ nhất cho đến khi bạn có thể có được một nền giáo dục chính thức (Cử nhân Khoa học?) Về Khoa học Máy tính, nhấn mạnh vào thiết kế trò chơi. Bạn có thể có thể sử dụng trò chơi của mình để nhận học bổng, đặc biệt nếu bạn có thể nói "Tôi đã làm điều này mà không cần đào tạo chính thức về Java"

Các JVM hiện đại, thậm chí là một từ Oracle, có nhiều, nhiều tính năng để giải quyết các mối quan tâm mà mọi người đã đưa ra ở đây. Bạn có thể sử dụng các công cụ thu gom rác khác nhau để có hành vi thu gom rác xác định hơn. Tôi không có nhiều kinh nghiệm với các thư viện 3D - chỉ một chút với Java3D - nhưng dường như không có ai ở đây phàn nàn về chúng. Phân tích thoát bây giờ cho phép khóa điện và phân bổ nhanh hơn / không đáng kể các đối tượng có thời gian tồn tại rất ngắn.

Vấn đề là, cho dù bạn chọn Java của C ++, bạn sẽ phải học cách sử dụng đồng thời đúng cách và hiểu rõ về quản lý bộ nhớ. Rốt cuộc, bạn có thể dễ dàng bắt vít với mallocnhư bạn có thể với new. Tôi không biết các công cụ này như thế nào đối với C ++, nhưng các công cụ định hình cho Java khá dễ sử dụng, miễn phí và được tích hợp với IDE. Bạn có thể sử dụng chúng để theo dõi các vấn đề hiệu suất và tìm hiểu .


5
Giáo dục chính quy trong CS rất đáng giá cho các kỹ năng lập trình thực tế trong bất kỳ ngành học nào. Tôi sẽ biết, tôi đang học năm thứ ba.
DeadMG

4
Chắc chắn không đồng ý với DeadMG. Sau khi tốt nghiệp và chọn các khóa học tôi thích, CS đã tăng khả năng phát triển trò chơi của tôi từ 10% đến 100%. Nó không dạy tôi về giao diện người dùng, biểu tượng, v.v. nhưng thực tế, mã hóa thực sự.
tro999

2
@ tro999: Sau đó, bạn đã gặp may mắn. Khóa học của tôi là vô giá trị và tôi biết rằng có nhiều người khác cũng cảm thấy như vậy.
DeadMG

2
@DeadMG thật khó để nhìn thấy khi bạn học. Khi bạn làm việc vài năm F / T và học các kỹ năng miễn phí khác, bạn sẽ thấy. Tôi đã làm. Nhưng có lẽ tôi chỉ chú ý rất nhiều và cố gắng áp dụng mọi thứ vào sở thích phát triển trò chơi của mình.
tro999

1
Tôi muốn nói rằng nó phụ thuộc vào trường học và giáo sư. Tôi đã có một vài lớp lập trình tuyệt vời nơi tôi học được một tấn; và tôi đã có một vài nơi mà tôi thực sự cảm thấy mình bị mất kiến ​​thức khi tham dự. Đó là tất cả về việc có một giáo sư tốt hay không. IMO.
Nate
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.