Mengapa hanya beberapa gim video yang ditulis dalam Java? [Tutup]


171

Mengapa tidak banyak komersial, video game 3D (bukan 2D sumber terbuka) yang ditulis dalam Java? Secara teori, ini sangat masuk akal: Anda mendapatkan peningkatan produktivitas dan aplikasi lintas-platform hampir gratis, antara lain, seperti sejumlah besar perpustakaan Jawa, dan pengumpulan sampah bawaan (walaupun saya akui saya ' Saya tidak yakin jika yang terakhir adalah hal yang baik). Jadi mengapa ini jarang digunakan? Saya hanya bisa memikirkan beberapa permainan komersial populer yang ditulis untuk platform Java.

Apakah karena kinerja? Jika demikian, bukankah sebagian besar pengangkatan berat akan dilakukan oleh GPU?



1
Re: mmyers; Saya agak kaget bahwa game ITU memenangkan penghargaan "grafis terbaik", bahkan pada 2005 ...
CloudyMusic

2
Ya tetapi sebagian besar "game sungguhan" tidak dibuat di .net yang dikelola bukan? Mereka dibuat di sekolah lama c / c ++?
Hardwareguy

14
Runescape ditulis dalam java.
GameFreak

44
Minecraft ditulis di Jawa!
daGrevis

Jawaban:


155

Dunia pengembangan game itu lucu: Di satu sisi, mereka sering cepat menerima ide-ide baru, di sisi lain, mereka masih di zaman batu.

Yang benar adalah, jarang ada banyak insentif dalam beralih ke .NET / Java / apa pun selain C / C ++.

Sebagian besar perusahaan game melisensikan bagian-bagian mesin game dari perusahaan lain. Bagian-bagian ini ditulis dalam C ++, dan meskipun Anda mungkin memiliki akses ke sumber sehingga Anda bisa porting, itu membutuhkan banyak upaya (dan tentu saja, lisensi perlu mengizinkannya).

Juga, banyak kode lawas sudah ada di C ++. Jika kode dari proyek sebelumnya dapat digunakan kembali (katakanlah, jika Anda menulis sekuel), itu bahkan lebih berarti bertahan dengan bahasa yang sama, alih-alih menulis ulang dalam bahasa baru (lebih dari itu karena Anda kemungkinan akan memperkenalkan kembali satu ton bug yang Anda harus menghabiskan waktu menyetrika.

Akhirnya, permainan jarang ditulis dalam 100% C ++ - banyak yang dilakukan menggunakan bahasa scripting, apakah itu khusus atau hanya mengintegrasikan bahasa yang ada (Lua menjadi salah satu yang lebih populer saat ini).

Sejauh menyangkut pengumpulan sampah, itu bisa menjadi sedikit masalah. Masalahnya bukan seberapa banyak itu ada, tetapi lebih pada cara kerjanya - pengumpul sampah HARUS non-pemblokiran (atau setidaknya dijamin hanya akan memblokir secara singkat), karena tidak dapat diterima untuk membekukan permainan selama 10 detik sementara itu memindai semua memori yang dialokasikan untuk melihat apa yang bisa dibebaskan. Saya tahu Java cenderung tersedak sedikit di GC'ing ketika hampir kehabisan memori (dan untuk beberapa game di luar sana, itu akan).

Anda juga sedikit lebih dibatasi dalam apa yang dapat Anda lakukan: Anda tidak dapat sepenuhnya mengeksploitasi perangkat keras karena overhead runtime. Bayangkan Crysis ditulis dalam Java ... bahkan jika itu satu-satunya perbedaan yang terlihat, itu tidak akan sama (saya juga cukup yakin Anda akan memerlukan Core i7 untuk menjalankannya.).

Ini tidak berarti bahasa-bahasa ini tidak memiliki tempat dalam pengembangan game - dan tidak, saya tidak hanya merujuk pada pemrograman alat. Untuk sebagian besar gim, Anda tidak perlu sedikit kinerja ekstra yang Anda dapatkan dari C ++, termasuk gim 3D, dan jika Anda menulis semuanya dari awal, masuk akal untuk menggunakan sesuatu seperti XNA - pada kenyataannya, ada peluang bagus itu akan terjadi.

Sejauh menyangkut permainan komersial - apakah RuneScape masuk hitungan? Itu mungkin game Java paling sukses di luar sana.


16
Yah jelas Anda tidak akan menjalankan Crysis di JVM; sial, jika Anda mengkodekan game itu dalam bahasa assembly, Anda masih membutuhkan superkomputer untuk menjalankannya pada pengaturan penuh. Tapi +1 untuk wawasan yang luar biasa, terima kasih.
Sasha Chedygov

15
Anda tidak dapat membandingkan Unreal Tournament 3 atau Crysis dengan Runescape. Jika kualitas grafis menjadi perhatian, Anda harus menggunakan bahasa tingkat rendah dengan sesedikit mungkin biaya overhead. Tentu saja, untuk Indy atau game di mana grafik bukan titik penjualan utama, Java adalah alternatif yang sangat baik untuk C / C ++.
GuiSim

6
@GuiSim: Untuk sebagian besar game, kualitas grafis BUKAN nilai jual utama. Hanya ada beberapa game yang dapat saya pikirkan yang dibuat dengan grafik dalam pikiran (saya sedang memikirkan Crysis, tetapi Half-Life 2 juga, pada saat itu). Saya pikir kebanyakan pengembang game tidak terlalu peduli dengan grafis, asalkan mereka "cukup baik" (alias setara dengan kebanyakan game lain).
Sasha Chedygov

4
Grafik benar-benar tidak ada hubungannya dengan bahasa. Fisika, AI, ya. Grafik, tidak.
JulianR

10
@JulianR akan ada beban kerja yang signifikan untuk menyiapkan dan memelihara adegan yang akan dibuat secara efisien, sehingga bahasa dan overhead bahasa yang terkait tidak masalah untuk grafis.
KSchmidt

95

Saya pikir John Carmack mengatakan yang terbaik dengan:

Masalah terbesar adalah bahwa Jawa sangat lambat. Pada level cpu / memori / display / komunikasi murni, sebagian besar ponsel modern harus menjadi platform game yang jauh lebih baik daripada Game Boy Advanced. Dengan Java, pada sebagian besar ponsel Anda hanya memiliki kekuatan CPU dari PC IBM asli 4,77 mhz, dan kontrol buruk atas semuanya. [... snip ...] Tulis-sekali-lari-di mana saja. Ha. Hahahahaha. Kami hanya menguji pada empat platform saat ini, dan tidak satu pun pasangan memiliki kebiasaan yang sama persis. Semua game komersial di-tweak dan dikompilasi secara individual untuk setiap platform (seringkali 100+). Portabilitas bukan pembenaran untuk kinerja yang buruk.

( sumber )

Memang, dia berbicara tentang platform seluler, tetapi saya telah menemukan masalah serupa dengan Java secara keseluruhan yang berasal dari latar belakang C ++. Saya rindu untuk dapat mengalokasikan memori pada Stack / Heap dengan ketentuan saya sendiri.


60
Kutipan itu berasal dari tahun 2005. Baik teknologi Java maupun daya Cellphone telah jauh meningkat sejak saat itu. Membandingkan game ponsel dengan game PC membandingkan apel dengan jeruk.
Chris Dail

78
John Carmack mengatakannya. Kasus ditutup.
GuiSim

41
Saya merasa tidak nyaman ketika membaca "Java is really slow". Ini seperti mengatakan mobil sport $ 50k lebih lambat dibandingkan dengan mobil sport $ 100k. Tentu, ini lebih lambat, tetapi 90% dari waktu, pekerjaan yang dilakukannya masih besar dan setengah dari biaya;) Tidak ada perang api yang dimaksudkan. Saya setuju bahwa alasan di atas adalah mengapa Crysis dan sejenisnya tidak ditulis di Jawa.
Ross

17
@ Chris Dail, ini menggarisbawahi seluruh masalah dengan kinerja Java. Apakah kinerja Java membaik? Tidak, telepon seluler semakin cepat. Game seharusnya mendorong batas realisme, dan karenanya mendorong batas perangkat keras, dan membuang% 30-% 40 kinerja Anda sebelum Anda bahkan menulis sebaris kode tidak dapat diterima.
cgp

8
Saya menemukan perselisihan ini sangat aneh. Java ME tidak sama dengan Java di Android dan juga tidak sama dengan Java di PC. Java ME biasanya mengandalkan produsen ponsel untuk membuat JVM. Beberapa melakukan pekerjaan dengan baik, beberapa tidak. Tidak heran Carmack mengeluh tentang mereka. Android memiliki VM sendiri yang bukan JVM. Dan ada beberapa masalah serius (dari sudut pandang saya). HotSpot VM Oracle sama sekali berbeda dari kedua kasus. Jika orang membandingkan semua hal ini, satu-satunya hal yang dapat saya simpulkan adalah bahwa mereka tidak tahu apa yang mereka bicarakan.
Malcolm

54

Untuk satu hal, kurangnya operator Java yang kelebihan membuat semua matematika Anda harus berurusan dengan untuk mendapatkan pipa grafis yang bekerja sangat, sangat menjengkelkan dan sulit dibaca.

Semua perkalian matriks dan vektor affine yang perlu Anda tangani jauh lebih mudah diikuti jika mereka berada dalam ekspresi matematika yang terbentuk dengan baik daripada ekspresi berorientasi objek seperti

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

Itu mengerikan. Matematika seharusnya tidak terlihat seperti itu.


19
Saya ingat kembali pada '96 Saya pikir itu, beberapa desainer dari Sun memberikan presentasi tentang Jawa di Berkeley. William Kahan ( en.wikipedia.org/wiki/William_Kahan ) memberi mereka informasi lebih lanjut tentang masalah ini. :)
JP Alioto

13
saya pikir ada alasan bagus untuk tidak membiarkan operator kelebihan dalam bahasa: untuk mencegah orang menggunakannya. itu adalah alat yang ampuh dan sangat keren untuk matematika, tetapi berbahaya untuk yang lainnya. malas seperti coders, mereka cenderung salah menggunakannya untuk memperpendek kode, dan saat orang mulai melakukan peta mengalikan iterable dengan fungsi, atau bahkan ketika semua op aritmatika ditentukan untuk fungsi, pembacaan kode akan mencapai 0. dan ya, saya telah menghabiskan cukup banyak kode porting waktu seperti itu. : -S itu pilihan desain. dan pilihan desain selalu cenderung diperdebatkan.
back2dos

19
Menghukum orang lain untuk beberapa apel buruk? Ini adalah salah satu alasan saya lebih suka C #. Jika saya benar-benar membutuhkan operator kelebihan itu ada di sana.
ChaosPandion

1
Pada dasarnya, overloading operator hanya benar-benar sesuai untuk 2-3 situasi berbeda dalam desain OOP (Vektor, Matriks, bilangan kompleks). Sebagian besar situasi lain, terlalu longgar didefinisikan dan hanya mengarah ke kode ceroboh, sintaks yang lemah, dan dokumentasi yang buruk, bahkan dari orang-orang yang tahu cara menggunakannya. Saya pikir itu sebabnya Sun memilih untuk tidak menggunakannya di Jawa, dan saya pikir itu keputusan yang sah.
bgroenks

1
@ MMJZ: Apa hubungan ekspresi lambda dengan overloading operator?
Sasha Chedygov

26

Saya pikir. NET memiliki (memiliki) banyak masalah yang sama dengan yang dirasakan Java. Microsoft baru saja melakukan pekerjaan yang lebih baik dalam pemasaran untuk pengembang dengan XNA :-)


10
XNA juga memungkinkan untuk menggunakan aplikasi .NET Anda ke XBox. Saya belum melihat sesuatu yang sehalus itu untuk Java.
StriplingWarrior

Anda juga dapat menggunakan Zune.
cbeuker

Sedikit pertanyaan yang lebih tua, tetapi hanya untuk memperbarui, Anda sekarang dapat menulis game XNA untuk Windows Phone juga :-)
Joel Martinez

3
@ JoelMartinez pembaruan lain: tidak mungkin menulis game XNA untuk Windows Phone 8.
Tomas Andrle

@TomA Sekarang dimungkinkan untuk menulis game monogame untuk WP8
Alex Lapa

17

Poin minor pertama:

  • setiap peningkatan produktivitas dari Jawa adalah hipotesis. Sintaksnya hampir identik dengan C ++ sehingga Anda benar-benar hanya mengandalkan penghematan dari manajemen memori dan perpustakaan standar. Perpustakaan memiliki sedikit untuk menawarkan pengembang game dan manajemen memori adalah masalah yang diperdebatkan karena pengumpulan sampah.

  • cross-platform "gratis" tidak sebagus yang Anda pikirkan karena beberapa pengembang ingin menggunakan OpenGL dan beberapa platform utama mungkin tidak memiliki implementasi Java yang baik atau pembungkus untuk perpustakaan asli mereka, baik untuk grafik, audio, jaringan, dll.

Tetapi terutama, masalahnya adalah kompatibilitas ke belakang. Pengembang game pindah ke C ++ dari C dan ke C dari perakitan murni karena rute migrasi lancar. Setiap interoperate erat dengan yang sebelumnya, dan semua kode mereka sebelumnya dapat digunakan dalam bahasa baru, sering melalui kompiler tunggal. Karena itu migrasi lambat atau secepat yang Anda suka. Misalnya, beberapa tajuk lama kami yang digunakan saat ini masih memiliki #ifdef WATCOMCdi, dan saya tidak berpikir ada orang yang menggunakan kompiler Watcom di sini dalam satu dekade atau lebih. Ada investasi besar-besaran dalam kode lama dan setiap bit hanya diganti sesuai kebutuhan. Proses mengganti dan meningkatkan potongan-potongan dari satu game ke game berikutnya sama sekali tidak praktis jika Anda mengubah ke bahasa yang tidak asli beroperasi dengan kode yang ada. Ya, interoperabilitas C ++ / Java dimungkinkan, tetapi sangat tidak praktis jika dibandingkan dengan hanya menulis "C dengan sedikit C ++" atau menanamkan blok asm di C.

Untuk benar-benar menggantikan C ++ sebagai bahasa pilihan pengembang game, ia harus melakukan satu dari dua hal:

  1. Mudah dioperasikan dengan kode lawas yang ada, sehingga menjaga investasi dan mempertahankan akses ke perpustakaan dan alat yang ada, ATAU
  2. Menunjukkan peningkatan produktivitas di muka sehingga biaya penulisan ulang semua kode Anda sendiri (atau pengerjaan ulang antarmuka menjadi komponen yang dapat digunakan kembali yang dapat digunakan dari bahasa itu) lebih dari cukup untuk ditanggung.

Secara subyektif, saya pikir Java tidak memenuhi keduanya. Bahasa tingkat yang lebih tinggi mungkin memenuhi yang ke-2, jika seseorang cukup berani untuk menjadi perintis. (EVE Online mungkin adalah contoh terbaik yang kami miliki tentang Python yang dapat digunakan, tetapi yang menggunakan garpu bahasa Python utama, banyak komponen C ++ untuk kinerja, dan bahkan itu untuk permainan yang cukup ringan dalam istilah modern.)


Hanya ingin menambahkan, EVE Online adalah simulasi ruang 'online', di mana pertempuran pemain vs pemain 1000s vs 1000s adalah umum, yang dapat dihitung sebagai skenario yang menuntut dalam hal kinerja. Meskipun bagian yang intensif kecepatannya ditulis dalam C / C ++, ini masih merupakan studi yang menarik tentang tantangan menggunakan bahasa tingkat tinggi (Python) dalam game.
Hakan Deryal

Namun, ingat bahwa kinerja dalam permainan sisi-server multipemain diukur dengan metrik yang sedikit berbeda dengan kinerja dalam permainan sisi-pemain tunggal-pemain - yang pertama lebih mementingkan throughput, yang terakhir dengan latensi.
Kylotan

Ya itu benar, tetapi pertempuran itu mencakup 2000+ kapal di layar, dengan 2000+ proyektil (rudal, dengan animasi), ledakan dll. Yang membutuhkan kinerja grafis yang berat. Bagaimanapun, terima kasih atas jawaban terinci, itu masih berlaku.
Hakan Deryal

1
Jika Anda berpikir bahwa sintaksis C & Java adalah sama dan karenanya memiliki beberapa hubungan dengan kinerja, Anda benar-benar tidak mengerti apa yang sedang terjadi. Bagaimana mungkin C memutuskan saat runtime bahwa fungsi yang diberikan dipanggil dengan parameter yang sama berulang kali dan mengganti seluruh panggilan fungsi dengan konstanta sambil mempertahankan panggilan fungsi ketika ada penyimpangan dalam parameter? Saya tidak mengatakan runtime selalu lebih baik atau bahkan lebih buruk, hanya saja ia tidak memiliki hubungan apa pun dengan sintaks!
Bill K

1
@ BillK - Anda tampaknya salah membaca. Saya sebutkan sintaks hanya dengan referensi 'produktivitas' - bukan 'kinerja'. Memang benar bahwa optimasi JIT dapat membuat Java lebih cepat dalam teori, tetapi ini tidak terjadi dalam praktiknya, setidaknya tidak dalam perangkat lunak game.
Kylotan

12

Saya sedang bermain Sims 3, dan saya melakukan beberapa pencarian. Mesin grafis adalah C ++, sedangkan mesin scripting dan perilaku adalah C # / Mono. Jadi, sementara C ++ ada untuk bit waktu kritis, hal-hal lain seperti. Interaksi, logika permainan, AI dalam bahasa yang dikelola objek berorientasi.


5
dan kemudian untuk versi Mac, mereka memasukkan semuanya ke dalam mesin virtual Wine yang dimodifikasi. Masih lebih cepat dari itu akan di lurus Java Saya pikir :-)
Ben Gotow

10
Anggur bukan mesin virtual, ini adalah pustaka runtime yang meniru perilaku pustaka runtime Windows. Oleh karena itu namanya (Anggur Bukan Emulator).
Nate CK

2
Ini sangat umum dalam permainan, cukup sering logika yang tidak kritis waktu ditulis dalam beberapa jenis bahasa scripting, umumnya lua atau python.
KSchmidt

Tapi itu bukan vanilla Mono. EA membutuhkan tim khusus yang mengerjakan CLR khusus mereka sendiri secara penuh waktu untuk membuatnya berfungsi.
Crashworks

4
Hanya catatan bahwa Sims 3 terkenal karena kinerjanya buruk bahkan pada komputer yang sangat baik.
Lotus Notes

12
  • Apakah ada port yang bagus untuk mesin game / perpustakaan?
  • Banyak pengembang C / C ++, terutama yang ada di Windows (di mana sebagian besar game komersial ditulis) sudah familiar dengan Visual Studio. Tidak ada perbandingan dalam IDE.
  • Secara umum, Java telah dijual ke bisnis karena pengetikannya padat dan memiliki persepsi tidak memiliki masalah manajemen memori.
  • Dan ya, Java masih menderita persepsi bahwa itu lambat, dan manajemen memorinya buruk, dan untuk game, mungkin tidak cocok untuk tugas itu. Seperti yang dinyatakan dalam beberapa jawaban lain, pengumpulan sampah tidak akan memotongnya ketika Anda berurusan dengan persyaratan kinerja tinggi real-time. Permainan video mendorong CPU dan GPU ke batasnya.

1
+1 untuk teks tebal. Orang-orang tampaknya tidak menyadari bahwa ketika game Anda berjalan pada 20 fps, seringkali perangkat keras terikat pada 20 fps. Benar-benar ingin mendapatkan 30+ fps .. tetapi tidak bisa.
GuiSim

Saya tidak berpikir itu hanya GC yang merupakan masalah kinerja-bijaksana ... atau bahkan yang ditambah dengan fase startup lambat ... itu masalah kinerja umum, tapi itu hanya saya.
rogerdpack

2
Saya pikir pada titik ini saya lebih cenderung setuju daripada di masa lalu. Optimalisasi JVM telah meningkat; Namun, mengingat peningkatan kinerja untuk bahasa yang diketik secara longgar seperti JavaScript dan lainnya, kinerja Java sebagai perbandingan cukup dapat dimaafkan. Ada banyak pembela untuk kinerja Jawa. (tetapi kinerja yang dirasakan pada akhirnya adalah yang terpenting) '
cgp

10

Salah satu alasan terbesar Java dan bahasa Mesin Virtual lainnya tidak digunakan untuk game adalah karena Pengumpulan Sampah. Hal yang sama berlaku untuk .NET. Pengumpulan sampah telah datang jauh dan bekerja sangat baik di sebagian besar jenis aplikasi. Untuk melakukan pengumpulan sampah, Anda perlu menjeda dan menghentikan aplikasi untuk mengumpulkan sampah. Ini dapat menyebabkan kelambatan berkala ketika pengumpulan terjadi.

Java memiliki masalah yang sama untuk aplikasi realtime. Ketika tugas harus dijalankan pada waktu tertentu, sulit untuk memiliki tugas otomatis seperti pengumpulan sampah.

Bukannya Java lambat. Java tidak pandai menangani tugas waktu nyata.


1
Anda dapat, bagaimanapun, menulis penjadwal Anda sendiri untuk pengumpul sampah jika Anda akan pergi sejauh port Java ke lingkungan baru. Memori harus direklamasi, dan dalam lingkungan waktu nyata, Anda dapat memiliki pilihan kapan harus menjadwalkan gc ... terbaik dari kedua dunia. Saya harus kembali ke titik bahwa tidak ada banyak alasan untuk port Java ke arsitektur untuk melakukan hal-hal yang Anda inginkan ketika C / C ++ sudah melakukan hal-hal itu untuk Anda. Java bersinar di tempat lain.
San Jacinto

5
Ini bukan tahun 1990-an. Pengumpul sampah sekarang cukup baik ketika disetel untuk jeda rendah.
Tom Hawtin - tackline

8

Alasan besar adalah bahwa video game memerlukan pengetahuan langsung tentang perangkat keras di bawahnya, sering kali, dan memang tidak ada implementasi yang bagus untuk banyak arsitektur. Ini adalah pengetahuan tentang arsitektur perangkat keras yang mendasari yang memungkinkan pengembang untuk memeras setiap ons kinerja dari sistem game. Mengapa Anda meluangkan waktu untuk port Java ke platform game, dan kemudian menulis game di atas port itu ketika Anda hanya bisa menulis game?

sunting: ini untuk mengatakan bahwa ini lebih dari masalah "kecepatan" atau "tidak memiliki perpustakaan yang tepat". Kedua hal itu berjalan seiring dengan ini, tetapi ini lebih merupakan masalah "bagaimana cara membuat sistem seperti sel menjalankan kode java saya? Sebenarnya tidak ada kompiler java yang baik yang dapat mengelola pipa dan vektor seperti yang saya butuhkan .. "


7

Masalah kinerja adalah alasan pertama. Ketika Anda melihat jenis kode C ++ hiper yang dioptimalkan yang ada di mesin Quake ( http://www.codemaestro.com/reviews/9 ), Anda tahu mereka tidak akan membuang-buang waktu dengan mesin virtual.

Tentu mungkin ada beberapa game .NET (yang mana? Saya tertarik. Apakah ada beberapa yang benar-benar intensif CPU / GPU?), Tapi saya rasa itu lebih karena banyak orang ahli dalam teknologi MS dan mengikuti Microsoft ketika mereka meluncurkan teknologi baru mereka.

Oh dan lintas-platform tidak ada dalam pikiran perusahaan video game. Linux hanya sekitar 1% dari pasar, Mac OS beberapa% lebih banyak. Mereka pasti berpikir itu tidak layak membuang teknologi dan librairia Windows saja seperti DirectX.


3
"lintas-platform tidak ada di benak perusahaan-perusahaan video game" - Itulah sebabnya saya sepenuhnya menghormati perusahaan yang melakukannya. :)
Sasha Chedygov

Saya benar-benar berterima kasih kepada Carmack karena begitu berkomitmen pada cross-platform dan open-source. Saya hanya menyatakan apa yang dipikirkan sebagian besar perusahaan.
Ksempac

1
Itu benar. Anda tidak melihat banyak gim video populer yang di-porting ke Linux. :(
Sasha Chedygov

Cross-platform bukan hanya lintas OS. Pikirkan PS3, Xbox 360, Wii.
JulianR

"Mereka tidak akan membuang waktu mereka dengan mesin virtual." en.wikipedia.org/wiki/Quake_III_Arena#Virtual_machine , Carmack membuat sendiri untuk logika permainan.
James McMahon

4

Anda dapat bertanya mengapa aplikasi web tidak ditulis dalam C atau C ++ juga. Kekuatan Java terletak pada tumpukan jaringan dan desain berorientasi objek. Tentu saja C dan C ++ memilikinya juga. Tetapi pada abstraksi yang lebih rendah. Itu tidak ada yang negatif, tetapi Anda tidak ingin menemukan kembali roda setiap kali, bukan?

Java juga tidak memiliki akses perangkat keras langsung, yang berarti Anda terjebak dengan API kerangka kerja apa pun.


Java dapat memanggil kode asli melalui "JNI"
Bart van Heukelom

4
... dan kehilangan portabilitas saat Anda melakukannya!
LiraNuna

1
Anda benar-benar tidak kehilangan banyak portabilitas ketika Anda menggunakan JNI. Asalkan Anda masih dapat mengkompilasi pustaka asli pada platform yang ingin Anda dukung, itu pada dasarnya hanya berarti Anda hanya perlu mem-port / mengkompilasi ulang 1% kode Anda daripada semuanya. Anda masih mendapatkan banyak manfaat dari portabilitas Java.
bgroenks

4

Kesalahpahaman tentang kinerja dan optimalisasi JVM yang buruk akan menjadi dugaan saya. Saya mengatakan kesalahpahaman tentang kinerja karena ada beberapa port Java dari game C ++ yang berkinerja lebih cepat daripada rekan C ++ mereka (lihat Jake 2). Masalah sebenarnya, IMHO, adalah bahwa banyak programmer Java tidak terlalu fokus pada kinerja yang berdarah karena mereka dengan mudah digunakan dan dapat dimengerti / dipelihara kode. Pada sisi C / C ++ hal-hal yang pada dasarnya Anda koding dalam bahasa assembly level yang sedikit lebih tinggi dan sedekat mungkin dengan perangkat keras yang Anda dapat tanpa menulis dalam kode assembly atau mesin lurus.


Jika "hampir sedekat mungkin dengan perangkat keras yang Anda dapat tanpa menulis dalam perakitan", maka Java tidak akan bisa mengalahkannya, kecuali jika pengkodean Anda buruk. Semakin dekat Anda dengan perangkat keras, semakin cepat Anda bisa mendapatkannya.
Josh Johnson

4

Daftar mesin game di Wikipedia mencantumkan banyak mesin game beserta bahasa pemrogramannya.

Ada beberapa mesin game Java yang terdaftar.

Mengklik beberapa tautan akan mengarahkan Anda ke contoh permainan dan demo yang ditulis dalam Java. Inilah pasangan:

Untuk permainan dan situasi tertentu, trade-off Java mungkin dapat diterima.


Saya tahu ada game yang ditulis di Jawa. Tapi selain Minecraft dan Runescape, sangat sedikit game komersial mainstream yang ditulis untuk platform Java. Berapa banyak judul AAA ditulis di Jawa? Dan mengapa sangat sedikit? Karena itu pertanyaanku.
Sasha Chedygov

3

.NET jelas memiliki beberapa masalah yang sama dengan yang dimiliki Java dalam hal kinerja 3D yang intens. Microsoft juga telah menginvestasikan lebih banyak waktu dan uang dalam pengembangan perpustakaan ketika datang untuk bekerja dengan operasi berat 3D.

(... secara pribadi, saya juga berpikir mereka memiliki kaki ketika datang ke keajaiban antara DirectX dan .NET)


2
  1. Java lambat, sebagian besar pengangkatan berat tidak ditangani oleh GPU. Masih ada animasi, fisika, dan AI yang mengenai CPU, yang semuanya sangat memakan waktu.

  2. Java tidak ada di konsol, dan konsol adalah target utama untuk gim komersial. Jika Anda menggunakan Java pada PC, Anda menghilangkan kemampuan Anda untuk port ke konsol dalam waktu dan anggaran yang wajar.

  3. Banyak coders yang lebih berpengalaman dalam industri game telah menggunakan C dan C ++ jauh sebelum Java menjadi populer. Dua poin di atas dapat berkontribusi pada hal ini, tetapi saya berharap bahwa banyak coders game profesional tidak begitu mengenal Java.

  4. Poin orang lain tentang middleware di atas adalah bagus, jadi saya menambahkannya ke jawaban saya. Ada banyak kode lama dan middleware yang ditulis khusus untuk dihubungkan dengan C / C ++, dan terakhir saya memeriksa Java tidak memiliki interoperabilitas yang baik. Menggunakan Java untuk sebagian besar perusahaan akan melibatkan membuang banyak kode, banyak yang telah dibayar dengan satu atau lain cara.


3
Anda dapat menggunakan JavaCL, JOCL, atau APARAPI untuk melepas banyak hal ke GPU.
bgroenks

2

Sebenarnya, sangat mungkin bagi kode yang dikelola untuk melakukan game 3d, masalahnya adalah mesin belakang. Dengan .Net, untuk jangka waktu singkat, ada pembungkus Managed DirectX ke DirectX 9 oleh Microsoft. Ini sebelum abstraksi yang sekarang XNA.

Diberikan akses total ke DirectX api, .Net games dapat digunakan. Contoh terbaik yang saya tahu adalah www.entombed.co.uk, yang ditulis dalam VB.Net.

Sayangnya, di sisi Java, ini benar-benar kurang - terutama karena alasan DirectX tidak tersedia untuk Java, dan programmer game tahu dan memahami api DirectX - mengapa belajar api lagi ketika Anda akan kembali ke DirectX?


2

Pemasaran game adalah proses komersial; penerbit menginginkan hasil risiko rendah yang dapat diukur dari investasi mereka. Sebagai konsekuensinya, fokus biasanya pada tipuan teknologi (dengan pengecualian) yang akan dibeli konsumen untuk menghasilkan pengembalian yang andal - ini cenderung efek visual yang dangkal seperti silau lensa atau resolusi yang lebih tinggi. Efek ini dapat diandalkan karena mereka hanya menggunakan peningkatan kekuatan pemrosesan - mereka mengeksploitasi perangkat keras / hukum Moore meningkat. ini berarti menggunakan C / C ++ - java biasanya terlalu abstrak dari perangkat keras untuk mengeksploitasi manfaat ini.


1

Saya kira kecepatan masih menjadi masalah. Cross platform akan menjadi masalah bukan karena Anda tidak tahu kartu 3d apa yang tersedia saat Anda menulis kode? Apakah java punya sesuatu untuk mendukung penemuan otomatis kemampuan 3d? Dan saya kira ada alat untuk memudahkan porting game antara wii, xbox, dan ps3, tapi mahal saya berani bertaruh.

PS3 memiliki java, melalui dukungan sinar biru. Periksa situs bd-j.


1

Bahkan game yang ditulis pada platform .Net sering sangat dioptimalkan untuk kecepatan seperti akses langsung ke memori dan bus. .Net memungkinkan untuk menggunakan C / C ++ dan mencampurnya dengan bahasa tingkat yang lebih tinggi seperti C #.

Studio pengembangan game sering bekerja berdekatan dengan vendor perangkat keras, yang memang memberikan akses ke antarmuka tingkat rendah dari produk mereka. Ini adalah dunia, di mana Anda harus menggunakan ASM dan C untuk komunikasi perangkat. Lingkungan virtual akan memperlambat bagian-bagian program ini.

Bagaimanapun, game 3D modern sebenarnya menggunakan bahasa tingkat yang lebih tinggi. Seringkali, Anda akan menemukan logika permainan yang ditulis dalam bahasa seperti Lua atau Python. Tetapi inti (I / O, utas, penjadwalan tugas) dari game 3D tipikal akan ditulis dalam bahasa tingkat rendah selama 25 tahun ke depan atau selama perangkat tidak memungkinkan abstraksi dan virtualisasi sendiri (yang akan datang).


1

Saya setuju dengan posting lain tentang memanfaatkan elemen basis kode yang sudah ada / berlisensi, kinerja, dll.

Satu hal yang ingin saya tambahkan adalah sulit untuk menarik trik DRM jahat melalui mesin virtual.

Juga saya pikir ada komponen keangkuhan di mana manajer proyek berpikir mereka dapat membuat kode yang stabil / dapat diandalkan dengan C ++ dengan semua fasilitas seperti memiliki kendali mutlak atas alat dan sumber daya mereka, TETAPI tanpa semua negatif yang menyulitkan dan meredam persaingan mereka karena "kami" lebih pintar dari mereka ".


0

Runescape oleh Jagex ditulis dalam Java, tag "video game" mungkin tidak secara khusus menerapkannya sebagai game on-line, tetapi memiliki pengikut yang layak.


Maaf, ini sama sekali tidak menjawab pertanyaan saya.
Sasha Chedygov

2
Tetapi pernyataan buta dari pertanyaan itu mengarah pada asumsi bahwa TIDAK ada permainan yang ditulis di Jawa, hanya menunjukkan kasus yang berhasil di mana seseorang berada.
Mark Schultheiss

0

Sudah banyak dibicarakan, Anda dapat menemukan di Wiki alasannya ...

  • C / C ++ untuk mesin game dan semua hal intensif.
  • Lua atau Python untuk skrip dalam game.
  • Java - kinerja sangat-sangat buruk, penggunaan memori besar + itu tidak tersedia di Konsol Game (Ini digunakan untuk beberapa game yang sangat sederhana (Ya, Runescape diperhitungkan di sini, ini bukan Battlefield atau Crysis atau apa lagi yang ada) hanya karena ada banyak programmer yang tahu bahasa pemrograman ini).
  • C # - penggunaan memori besar (Ini digunakan untuk beberapa game yang sangat sederhana hanya karena ada cukup banyak programmer yang tahu bahasa pemrograman ini).

Dan saya mendengar semakin banyak programmer Java yang mencoba meyakinkan orang bahwa Java tidak lambat, tidak lambat untuk menggambar widget di layar dan menggambar beberapa karakter ASCII pada widget, untuk menerima dan mengirim data melalui jaringan (Dan itu adalah direkomendasikan untuk menggunakannya dalam kasus ini (manipulasi data jaringan) alih-alih C / C ++) ... Tetapi sangat lambat ketika menyangkut hal-hal serius seperti perhitungan matematika, alokasi memori / manipulasi dan banyak hal bagus ini.

Saya ingat sebuah artikel di situs MIT di mana mereka menunjukkan apa yang dapat dilakukan C / C ++ jika Anda menggunakan fitur bahasa dan kompiler: Pengganda matriks (2 matriks), 1 implementasi di Jawa dan 1 implementasi di C / C ++, dengan fitur C / C ++ dan optimisasi kompiler yang tepat diaktifkan, implementasi C / C ++ ~ 296 260 kali lebih cepat daripada implementasi Java.

Saya harap Anda mengerti sekarang mengapa orang menggunakan C / C ++ daripada Java dalam game, bayangkan Crysis di Jawa, tidak akan ada komputer di dunia ini yang bisa menangani itu ... + Pengumpulan sampah berfungsi dengan baik untuk Widget yang hanya menghancurkan gambar tetapi masih di-cache di sana dan perlu dibersihkan tetapi tidak untuk game, pasti, Anda akan memiliki lebih banyak keterlambatan pada setiap aktivasi pengumpulan sampah.

Sunting : Karena seseorang meminta artikel itu, di sini, saya mencari di arsip web untuk mendapatkannya, saya harap Anda puas ... Studi Kasus MIT

Dan untuk menambahkan, tidak, Java untuk gaming masih merupakan ide yang buruk. Hanya beberapa hari yang lalu sebuah perusahaan besar yang saya tidak akan menyebutkan namanya mulai menulis ulang klien game mereka dari Jawa ke C ++ karena permainan yang sangat sederhana (Dalam hal Grafik) tertinggal dan memanaskan Laptop i7 dengan kartu video nVidia GT 5xx dan 6xx generasi yang kuat ( tidak hanya nVidia, intinya di sini adalah bahwa kartu yang kuat ini dapat menangani pengaturan Max sebagian besar game baru dan tidak dapat menangani game ini) dan konsumsi memori ~ 2.5 - 2.6 GB Ram. Untuk grafik sederhana seperti itu dibutuhkan binatang mesin.


10
Anda jelas tahu sedikit tentang Java runtime dan mesin virtual modern. Artikel yang Anda sebutkan lebih dari kemungkinan satu dekade yang lalu atau lebih, tentu saja tidak ada yang tahu karena Anda tidak mengutipnya. Persepsi Anda tentang Java sudah ketinggalan zaman.
bgroenks

2
Ok sehingga penelitian membuktikan bahwa untuk perkalian matriks skala besar, Java kehilangan ke C ketika akses array 2 dimensi digunakan untuk mengakses data. Ya saya pasti sudah menebaknya juga. Dan jika itu benar-benar masalah bagi Anda, yang saya ragu, itulah mengapa Anda memiliki JNI. Batas memeriksa overhead untuk array tidak menambah dalam situasi itu, meskipun kode Java-nya bisa dioptimalkan untuk secara signifikan meningkatkan hasil. Demikian juga, saya mempertanyakan pemahamannya tentang JIT ketika ia menyatakan, "kompilasi lebih cepat = bukan kode terbaik yang dihasilkan." Baca spesifikasi IBM untuk membuktikan sebaliknya.
bgroenks

3
Java BUKAN pilihan yang buruk untuk pengembangan game. Ada banyak game sukses di luar sana yang menjalankan Java. Biasanya, Anda perlu sedikit bantuan dari kode asli (terutama dengan LWJGL dan semacamnya) untuk benar-benar mendapatkan hasil terbaik. Tetapi jika saya hanya perlu mem-port dan mengkompilasi ulang 1% dari kode saya daripada 100%, itu terdengar sangat bagus bagi saya.
bgroenks

1
@ bgroenks "100%" - sepertinya Anda tidak tahu tentang C / C ++ ... Dan saat membuat game Anda selalu dapat menggunakan perpustakaan lintas platform (SDL dan banyak lainnya) atau kerangka kerja (misalnya Qt). Sebagai contoh: EA menggunakan Qt untuk benar-benar setiap permainan yang mereka miliki ... Qt adalah WAY lebih lintas-platform dari Jawa dan mengkompilasi ke kode asli.
Lilian A. Moraru

2
Saya tidak benar-benar melihat titik di Jawa ketika Anda memiliki Qt. Saya menemukan kode Qt lebih jelas, lebih mudah dipahami dan dipelihara daripada kode Java. Ketika saya bertanya kepada teman-teman saya mengapa mereka begitu takut dengan C ++, mereka selalu memberi tahu saya bahwa mereka membenci pointer dan memastikan untuk membatalkan alokasi memori. Sepertinya banyak orang tidak tahu tentang shared_ptr di C ++ ... Bagi saya, Qt dan C # .NET / C ++. NET adalah yang terbaik untuk ditulis. Kode Java biasanya sangat membengkak dengan penanganan pengecualian, biasanya perpustakaan sudah ketinggalan zaman (Ini baik sebagian besar hanya di sisi server tetapi sisanya ...) dan dokumentasi sering usang.
Lilian A. Moraru
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.