Neden Java'da sadece birkaç video oyunu yazılıyor? [kapalı]


171

Java'da neden birçok ticari, 3D video oyunu (rastgele açık kaynaklı 2D olmayanlar) yazılmıyor? Teorik olarak, çok mantıklı: çok sayıda Java kütüphanesi ve yerleşik çöp toplama gibi diğer şeylerin yanı sıra, neredeyse ücretsiz olarak bir üretkenlik artışı ve çapraz platform uygulaması elde edersiniz ( m ikincisinin iyi bir şey olup olmadığından emin değilim). Peki neden nadiren kullanılıyor? Java platformu için yazılmış birkaç popüler ticari oyunu düşünebilirim.

Performans yüzünden mi? Eğer öyleyse, ağır kaldırma işlemlerinin çoğu GPU tarafından yapılmaz mı?



1
Re: mmyers; Bu oyunun 2005'te bile "en iyi grafik" ödülünü kazandığı için biraz şok
yaşıyorum

2
Evet ama çoğu "gerçek oyun" yönetilen .net'de yapılmıyor değil mi? Eski okul c / c ++ ile mi yapılıyorlar?
Hardwareguy

14
Runescape Java ile yazılmış.
GameFreak

44
Minecraft Java ile yazılmıştır!
daGrevis

Yanıtlar:


155

Oyun geliştirme dünyası komik bir dünya: Bir yandan, genellikle yeni fikirleri kabul etmek için hızlılar, diğer yandan, hala taş çağındalar.

Gerçek şu ki, .NET / Java / C / C ++ dışında bir şeye geçişte nadiren bu kadar teşvik var.

Çoğu oyun şirketi, oyun motorunun parçalarını diğer şirketlerden lisanslar. Bu parçalar C ++ ile yazılmıştır ve kaynağa erişebilmenize rağmen, bağlantı kurabilmeniz için bu çok çaba gerektirir (ve elbette lisansın buna izin vermesi gerekir).

Ayrıca, birçok eski kod C ++ 'da zaten var. Önceki projelerin kodları yeniden kullanılabilirse (örneğin, bir devam filmi yazıyorsanız), bu yeni bir dilde yeniden yazmak yerine aynı dile sadık kalmaktan daha önemlidir (daha fazla ütülemek için zaman harcamanız gereken bir ton böcek.

Son olarak, oyunların zaten% 100 C ++ ile yazılması nadirdir - çoğu özel veya mevcut dilleri entegre etmek için betik dilleri kullanılarak yapılır (Lua bu günlerde en popüler olanlardan biridir).

Çöp toplama ile ilgili olarak, bu biraz sorun olabilir. Sorun o kadar fazla değil, nasıl çalıştığı daha fazla - çöp toplayıcının engellememesi GEREKİR (veya en azından sadece çok kısa bir süre için bloke edilmesi garanti edilmelidir), çünkü oyun 10 saniye boyunca donması kabul edilemez. neyin kurtarılabileceğini görmek için ayrılan tüm belleği tarar. Java'nın hafızanın bitmesine yakın olduğunda GC'ing'de biraz boğulma eğiliminde olduğunu biliyorum (ve bazı oyunlar için de olacak).

Yapabileceklerinizde biraz daha kısıtlısınız: çalışma zamanının yükü nedeniyle donanımdan tam olarak yararlanamazsınız. Crysis'in Java ile yazıldığını hayal edin ... Görünen tek fark bu olsa bile, aynı olmayacaktır (ayrıca çalıştırmak için bir Core i7'ye ihtiyacınız olacağından da eminim.).

Bu, bu dillerin oyun geliştirmede yeri olmadığı anlamına gelmez - hayır, sadece araç programlamaya değinmiyorum. Çoğu oyun için, 3D oyunlar da dahil olmak üzere C ++ 'dan aldığınız ekstra performansa ihtiyacınız yoktur ve hepsini sıfırdan yazıyorsanız, XNA gibi bir şey kullanmak mükemmel bir anlam ifade edebilir - aslında, iyi şans olacak.

Ticari oyunlar söz konusu olduğunda - RuneScape sayılır mı? Bu, en başarılı Java oyunu olabilir.


16
Açıkçası Jrys üzerinde Crysis çalıştırmak olmaz; Cehennem, eğer bu oyunu montaj dilinde kodladıysanız, tam ayarlarda çalıştırmak için hala bir süper bilgisayara ihtiyacınız olacak. Mükemmel görüş için +1, teşekkür ederim.
Sasha Chedygov

15
Unreal Tournament 3 veya Crysis ile Runescape'i karşılaştıramazsınız. Grafik kalitesi önemliyse, mümkün olduğunca az ek yüke sahip düşük düzeyli bir dile bağlı kalmanız gerekir. Tabii ki, Indy veya grafiklerin ana satış noktası olmadığı oyunlar için Java, C / C ++ 'a mükemmel bir alternatiftir.
GuiSim

6
@GuiSim: Çoğu oyun için grafik kalitesi önemli bir satış noktası DEĞİLDİR. Düşündüğüm sadece bir avuç oyun var (grafikler Crysis'i düşünüyorum, ama Half-Life 2 de o zamanlar). Oyun geliştiricilerinin çoğu, "yeterince iyi" oldukları sürece (diğer oyunların çoğuna eşit olarak) grafikler hakkında bu kadar önemsediğini düşünmüyorum.
Sasha Chedygov

4
Grafiklerin dil ile gerçekten çok az ilgisi var. Fizik, AI, evet. Grafikler, no.
JulianR

10
@JulianR Etkin bir şekilde oluşturulacak bir sahneyi hazırlamak ve sürdürmek için önemli bir iş yükü olabilir, bu nedenle dil ve ilişkili dil yükü grafikler için önemlidir.
KSchmidt

95

Sanırım John Carmack bunu en iyi şekilde söyledi:

En büyük sorun Java'nın gerçekten yavaş olmasıdır. Saf bir işlemci / bellek / ekran / iletişim düzeyinde, çoğu modern cep telefonu Game Boy Advanced'den çok daha iyi oyun platformları olmalıdır. Java ile, çoğu telefonda orijinal 4.77 mhz IBM PC'nin CPU gücü ve her şey üzerinde berbat bir kontrol kalır. [... snip ...] Bir kez-çalıştır-her yerde yaz. Ha. Hahahahaha. Şu anda sadece dört platformda test ediyoruz ve tek bir çiftin tam olarak aynı tuhaflıkları yok. Tüm ticari oyunlar her bir platform için ayrı ayrı düzenlenir ve derlenir. Taşınabilirlik, kötü performans için bir gerekçe değildir.

( kaynak )

Verilmiş, mobil platformlar hakkında konuşuyordu, ancak bir C ++ geçmişinden gelen bir bütün olarak Java ile benzer sorunlar buldum. Yığın / Öbek üzerinde kendi terimlerime bellek tahsis edemiyorum özledim.


61
Bu alıntı 2005'ten geldi. O zamandan beri hem Java teknolojisi hem de Cep telefonu gücü önemli ölçüde iyileşti. Cep telefonu oyunlarını PC oyunlarıyla karşılaştırmak, elmaları portakallarla karşılaştırmaktır.
Chris Dail

78
John Carmack söyledi. Dava kapandı.
GuiSim

41
"Java gerçekten yavaş" ı okuduğumda rahatsız oluyorum. 50 bin dolarlık bir spor otomobilin 100 bin dolarlık bir spor otomobille karşılaştırıldığında yavaş olduğunu söylemek gibi. Tabii, daha yavaş, ama zamanın% 90'ı, yaptığı iş hala harika ve yarı maliyetle;) Alev savaşı amaçlanmamıştır. Yukarıdaki nedenlerin, Crysis ve benzeri oyunların Java'da yazılmamasının nedeni olduğunu kabul ediyorum.
Ross

17
@Chris Dail, Java performansıyla ilgili tüm sorunun altını çiziyor. Java performansı iyileşti mi? Hayır, cep telefonları daha da hızlandı. Oyunların gerçekçiliğin sınırlarını zorlaması ve bu nedenle donanımın sınırlarını zorlaması ve bir kod satırı yazmadan önce performansınızın% 30-% 40'ını atmanız kabul edilemez.
cgp

8
Bu anlaşmazlığı çok garip buluyorum. Java ME, Android'deki Java ile aynı değildir ve PC'deki Java ile aynı değildir. Java ME genellikle bir JVM bulmak için telefon üreticilerine güveniyordu. Bazıları iyi iş çıkardı, bazıları yapmadı. Carmack'in onlar hakkında şikayet etmesine şaşmamalı. Android'in JVM olmayan kendi VM'si var. Ve bazı ciddi sorunları var (benim açımdan). Oracle'ın HotSpot VM'si her iki durumdan da tamamen farklı. Eğer insanlar bütün bunları karşılaştırırlarsa, sonuca varabileceğim tek şey ne hakkında konuştuklarını bilmemeleri.
Malcolm

54

Birincisi, Java'nın operatör aşırı yüklemesi olmaması, çalışan bir grafik hattını almak için uğraşmanız gereken tüm matematiği çok, çok sinir bozucu ve okunması zor hale getirir.

Karşılaşmanız gereken tüm matris çarpımı ve afin vektörleri, nesne odaklı ifadeler yerine iyi biçimlendirilmiş matematiksel ifadelerde varsa takip etmek çok daha kolaydır.

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

Bu sadece korkunç. Matematik öyle görünmemeli.


19
'96'da hatırlıyorum, sanırım öyleydi, Sun'dan bazı tasarımcılar Berkeley'de Java hakkında bir sunum yaptılar. William Kahan ( en.wikipedia.org/wiki/William_Kahan ) bu konuda onlara bir şeyler veriyordu. :)
JP Alioto

13
Ben bir dilde operatör aşırı yüklenmesine izin vermemek için iyi bir neden olduğunu düşünüyorum: insanların kullanmak önlemek için. güçlü bir araçtır ve matematik için çok iyidir, ancak diğer her şey için tehlikelidir. kodlayıcılar gibi tembeldirler, kodu kısaltmak için onu yanlış kullanma eğilimindedirler ve insanlar bir işlevi bir yinelenebilir özellikle çarparak bir harita yapmaya başladığında veya işlevler için tüm aritmetik oplar tanımlandığında bile, kod okunabilirliği 0'a ulaşmak üzeredir. ve Evet, kod taşıma gibi önemli miktarda zaman geçirdim böyle. : -S bu bir tasarım seçimi. ve tasarım seçenekleri her zaman tartışmalı olma eğilimindedir.
back2dos

19
Birkaç kötü elma için herkesi cezalandırır mısın? Bu C # tercih nedenlerinden biridir. Gerçekten operatör aşırı yükleme gerekiyorsa orada.
ChaosPandion

1
Temel olarak, operatör aşırı yüklenmesi, OOP tasarımında (Vektörler, Matrisler, Karmaşık sayılar) sadece 2-3 farklı durum için gerçekten uygundur. Diğer durumların çoğu, çok gevşek bir şekilde tanımlanmıştır ve nasıl kullanılacağını bilen kişilerden bile sadece özensiz kod, zayıf sözdizimi ve kötü belgelere yol açar. Bu yüzden Sun'ın Java'da kullanmamayı seçtiğini ve bunun geçerli bir karar olduğunu düşünüyorum.
Mart'ta

1
@MMJZ: Lambda ifadelerinin operatör aşırı yüklenmesi ile ne ilgisi var?
Sasha Chedygov

26

.NET'in Java ile aynı algılanan birçok sorunu olduğunu düşünüyorum. Microsoft, XNA ile geliştiricilere pazarlama konusunda daha iyi bir iş çıkardı :-)


10
XNA, .NET uygulamanızı XBox'a dağıtmayı da mümkün kılar. Java için bu kadar düzgün bir şey görmedim.
StriplingWarrior

Ayrıca Zune'e de dağıtabilirsiniz.
cbeuker

Biraz eski bir soru, ama sadece güncellemek için, şimdi de Windows Phone için XNA oyunları yazabilirsiniz :-)
Joel Martinez

3
@JoelMartinez başka bir güncelleme: Windows Phone 8 için XNA oyunları yazmak mümkün değil.
Tomas Andrle

@TomA Şimdi WP8
Alex Lapa

17

Önce küçük noktalar:

  • Java'dan gelen verimlilik artışı varsayımsaldır. Sözdizimi C ++ ile neredeyse aynıdır, bu yüzden gerçekten sadece bellek yönetimi ve standart kütüphanelerden tasarruf edersiniz. Kütüphaneler oyun geliştiricilere sunacak çok az şey var ve bellek yönetimi çöp toplama nedeniyle tartışmalı bir konudur.

  • çapraz platform "ücretsiz" düşündüğünüz kadar iyi değil çünkü birkaç geliştirici OpenGL'yi kullanmak istiyor ve birkaç temel platform, grafik, ses, ağ vb.

Ama esas olarak, sorun geriye dönük uyumluluktur. Oyun geliştiricileri yalnızca geçiş yolu sorunsuz olduğu için C'den C ++ 'ya ve derlemeden C'ye taşındı. Her biri öncekiyle yakından çalışır ve önceki kodlarının tümü yeni bir dilde, genellikle tek bir derleyici aracılığıyla kullanılabilirdi. Bu nedenle göç istediğiniz kadar yavaş veya hızlıydı. Örneğin, bugün kullanımda olan eski başlıklarımızdan bazıları hala #ifdef WATCOMCve Watcom derleyicisini on yıl veya daha fazla bir süre boyunca burada kimsenin kullanmadığını sanmıyorum. Eski koda büyük bir yatırım var ve her bit sadece gerektiğinde değiştiriliyor. Mevcut kodunuzla yerel olarak birlikte çalışmayan bir dile geçtiyseniz, bitleri ve parçaları bir oyundan diğerine yükseltme ve yükseltme işlemi bu kadar pratik değildir. Evet, C ++ / Java ile birlikte çalışabilirlik mümkündür, ancak basitçe "C'yi biraz C ++ ile" yazmak veya C'ye asm bloklarını gömmekle karşılaştırıldığında çok pratik değildir.

Oyun geliştiricilerinin tercih ettiği dil olarak C ++ 'ın düzgün bir şekilde yerini almak için iki şeyden birini yapması gerekir:

  1. Mevcut eski kodla kolayca birlikte çalışabilir olun, böylece yatırımı koruyun ve mevcut kütüphanelere ve araçlara erişimi koruyun VEYA
  2. Tüm kodunuzu yeniden yazma maliyetinin (veya arayüzleri o dilden kullanılabilen yeniden kullanılabilir bileşenlere yeniden çalışma) maliyetinin daha fazla olduğunu açıkça gösterecek bir verimlilik artışı gösterilebilir.

Subjektif olarak, Java'nın bunlardan hiçbiriyle tanışmadığını sanmıyorum. Birisi öncü olacak kadar cesursa, daha üst düzey bir dil 2. ile tanışabilir. (EVE Online muhtemelen Python'un kullanılabilir olmasının en iyi örneğidir, ancak ana Python dilinin bir çatalını, performans için birçok C ++ bileşenini kullanır ve hatta bu, modern terimlerle oldukça iddiasız bir oyun içindir.)


Sadece eklemek istedim, EVE Online 'online' bir uzay simülasyonudur, burada 1000'ler vs 1000'ler oyuncu vs oyuncu savaşları yaygındır, bu da performans açısından zorlu bir senaryo olarak sayılabilir. Hız yoğun bölümleri C / C ++ ile yazılmış olsa da, oyunlarda yüksek düzeyde bir dil (Python) kullanmanın zorlukları hakkında hala ilginç bir çalışma.
Hakan Deryal

Bununla birlikte, çok oyunculu sunucu tarafı oyunlarındaki performansın, tek oyunculu istemci tarafı oyunlarındaki performanstan biraz farklı metriklerle ölçüldüğünü unutmayın - birincisi, daha fazla gecikme olan verim ile ilgilidir.
Kylotan

Evet bu doğru, ancak bu savaşlar ekranda 2000'den fazla gemi, 2000'den fazla mermi (animasyonlu füzeler), patlamalar vb. Her neyse, ayrıntılı cevap için teşekkürler, hala geçerli.
Hakan Deryal

1
C & Java sözdiziminin aynı olduğunu ve bu nedenle performansla bir ilişkisi olduğunu düşünüyorsanız, neler olduğunu gerçekten anlamıyorsunuz. C çalışma zamanında belirli bir işlevin aynı parametrelerle tekrar tekrar çağrıldığına ve parametrelerde bir sapma olduğunda işlev çağrısını korurken tüm işlev çağrısını bir sabitle değiştirmeye nasıl karar verebilir? Çalışma zamanının her zaman daha iyi olduğunu ya da daha kötü olduğunu söylemiyorum, sadece sözdizimiyle hiçbir ilişkisi yok!
Bill K

1
@BillK - yanlış okuduğunuz anlaşılıyor. Sözdiziminden 'performans' değil, sadece 'üretkenlik' referansıyla bahsettim. JIT optimizasyonlarının Java'yı teoride daha hızlı yapabileceği doğrudur, ancak bu pratikte gerçekleşmez, en azından oyun yazılımında olmaz.
Kylotan

12

Ben Sims 3 oynuyorum ve biraz alay yaptım. Grafik motoru C ++, komut dosyası oluşturma ve davranış motoru C # / Mono. C ++, zaman açısından kritik bitler, .interaction, oyun mantığı gibi diğer şeyler için mevcutken AI, nesneye yönelik bir yönetilen dilde.


5
ve Mac sürümü için, her şeyi değiştirilmiş bir Wine sanal makinesinin içine ittiler. Hala düz Java olacağını daha hızlı düşünüyorum :-)
Ben Gotow

10
Wine sanal bir makine değil, Windows çalışma zamanı kitaplıklarının davranışını taklit eden bir çalışma zamanı kitaplığıdır. Bu nedenle adı (Şarap Bir Emülatör Değildir).
Nate CK

2
Bu oyunlarda çok yaygındır, çoğu zaman zaman kritik olmayan bir mantık, genellikle lua veya python gibi bir tür betik dilinde yazılır.
KSchmidt

Yine de vanilya Mono değil. EA'nın çalışması için kendi özel CLR'si üzerinde çalışan özel bir ekibe ihtiyacı vardı.
Crashworks

4
Sadece bir yan not, Sims 3'ün mükemmel bilgisayarlarda bile düşük performans göstermesiyle ünlüdür.
Lotus Notes

12
  • Oyun motorlarının / kütüphanelerinin iyi portları var mı?
  • Birçok C / C ++ geliştiricisi, özellikle Windows'ta (çoğu ticari oyunun yazıldığı) olanlar Visual Studio'ya aşinadır. IDE'lerde bir karşılaştırma yoktur.
  • Genel olarak, Java, sağlam yazım nedeniyle işletmelere satılmıştır ve bellek yönetimi sorunlarına sahip olmadığı algısına sahiptir.
  • Ve evet, Java hala yavaş olduğuna dair bir algıdan muzdarip ve bellek yönetimi zayıf ve oyunlar için muhtemelen göreve uygun değil. Diğer cevapların bazılarında belirtildiği gibi, gerçek zamanlı yüksek performanslı gereksinimlerle uğraşırken çöp toplama işlemi kesmeyecektir. Video oyunları CPU'ları ve GPU'ları sınırlarına kadar zorlar.

1
Kalın metin için +1. İnsanlar, oyununuz 20 fps'de çalışırken, genellikle 20 fps'de donanım bağlı olduğunu fark etmiyorlar. Gerçekten 30 + fps almak istiyorum .. ama yapamaz.
GuiSim

Ben sadece performans açısından sorun sadece GC olduğunu sanmıyorum ... ne de yavaş başlangıç ​​aşaması ile birleştiğinde ... bu genel performans sorunları, ama bu sadece benim.
rogerdpack

2
Bu noktada hemfikir olduğumun geçmişte olduğundan daha fazla olduğunu düşünüyorum. JVM'nin optimizasyonu gelişti; ancak, JavaScript ve diğerleri gibi gevşek yazılan dillerdeki performans iyileştirmeleri ışığında, Java'nın karşılaştırmalı performansı oldukça aşılmaz. Java'nın performansı için çok sayıda özür dileyen var. (ancak sonunda algılanan performans önemlidir) ''
cgp

10

Java ve diğer Sanal Makine dillerinin oyunlar için kullanılmamasının en büyük nedenlerinden biri Çöp Toplama'dır. Aynı şey .NET için de geçerli. Çöp toplama uzun bir yol kat etti ve çoğu uygulamada harika çalışıyor. Çöp toplama yapmak için, çöp toplamak için uygulamayı duraklatmanız ve kesmeniz gerekir. Bu toplama sırasında periyodik gecikmeye neden olabilir.

Java, gerçek zamanlı uygulamalar için aynı soruna sahiptir. Görevlerin belirli bir zamanda çalışması gerektiğinde, buna göre çöp toplama gibi otomatik bir göreve sahip olmak zordur.

Java yavaş değil. Java, gerçek zamanlı görevleri yerine getirmede iyi değildir.


1
Bununla birlikte, Java'yı yeni bir ortama taşıyacak kadar gidecekseniz, çöp toplayıcı için kendi zamanlayıcınızı yazabilirsiniz. Bellek her iki şekilde de geri kazanılmalıdır ve gerçek zamanlı bir ortamda, gc'nizi her iki dünyanın en iyilerini ne zaman programlayabileceğinize sahip olabilirsiniz. C / C ++ zaten sizin için bu şeyleri yapmak istediğinizde yapmak istediğiniz şeyleri yapmak için bir mimariye Java bağlantı noktası için pek bir neden yok noktasına geri dönmek zorunda. Java başka yerlerde parlar.
San Jacinto

5
Bu 1990'lar değil. Çöp toplayıcılar artık düşük duraklama için ayarlandığında oldukça iyi.
Tom Hawtin - taktik

8

Bunun büyük bir nedeni, video oyunlarının altındaki donanımları, çoğu zaman, doğrudan bilgi gerektirmesidir ve birçok mimaride gerçekten büyük bir uygulama yoktur. Geliştiricilerin bir oyun sisteminden her ons performansını sıkıştırmasını sağlayan temel donanım mimarisinin bilgisidir. Neden Java'yı bir oyun platformuna taşımak için zaman ayırıyorsunuz ve daha sonra oyunu yazabildiğinizde bu bağlantı noktasının üstüne bir oyun yazıyorsunuz?

edit: Bu bir "hız" veya "doğru kütüphaneler yok" sorun daha fazlası olduğunu söylemek için. Bu iki şey bununla el ele gidiyor, ama daha çok "hücre gibi bir sistemi java kodumu çalıştırmak için nasıl yapabilirim?" Gerçekten boru hatlarını ve vektörleri yönetebilen iyi bir java derleyici yok ihtiyacım gibi .. "


7

Performans sorunu birinci nedendir. Quake motorlarındaki hiper optimize C ++ kodunu gördüğünüzde ( http://www.codemaestro.com/reviews/9 ), sanal bir makineyle zamanlarını boşa harcamazlar.

Tabii bazı .NET oyunları olabilir (hangileri? İlgileniyorum. Gerçekten CPU / GPU yoğun olanlar var mı?), Ama sanırım daha çok insan MS teknolojilerinde uzman olduğundan ve Microsoft'u başlattıklarında takip etti yeni teknolojileri.

Oh ve çapraz platform sadece video oyunları şirketlerinin aklında değil. Linux, pazarın sadece% 1'i, Mac OS ise birkaç% daha fazla. Kesinlikle DirectX gibi sadece Windows teknolojilerini ve kütüphanelerini boşaltmaya değmeyeceğini düşünüyorlar.


3
"çapraz platform sadece video oyunları şirketlerinin aklında değil" - Bu yüzden yapan şirketlere tamamen saygı duyuyorum. :)
Sasha Chedygov

Hem platformlar arası hem de açık kaynak koduna bağlı kaldığı için Carmack'e minnettarım. Çoğu şirketin ne düşündüğünü açıkladım.
Ksempac

1
Bu doğru. Linux'a taşınan çok sayıda popüler video oyunu görmüyorsunuz. :(
Sasha Chedygov

Çapraz platform sadece çapraz işletim sistemi değildir. PS3, Xbox 360, Wii'yi düşünün.
JulianR

"sanal bir makine ile zamanlarını boşa harcamazlar." tr.wikipedia.org/wiki/Quake_III_Arena#Virtual_machine , Carmack oyun mantığı için kendi modelini oluşturdu.
James McMahon

4

Web uygulamalarının neden C veya C ++ ile yazılmadığını da sorabilirsiniz. Java'nın gücü ağ yığınında ve nesne yönelimli tasarımında yatmaktadır. Elbette C ve C ++ da var. Ama daha düşük bir soyutlamada. Bu olumsuz bir şey değil, ama her zaman tekerleği yeniden icat etmek istemiyorsun, değil mi?

Java'nın doğrudan donanım erişimi de yoktur, bu da herhangi bir çerçevenin API'sına takılı kaldığınız anlamına gelir.


Java "JNI" aracılığıyla yerel kodu çağırabilir
Bart van Heukelom

4
... ve hareket halindeyken taşınabilirliği kaybedebilirsiniz!
LiraNuna

1
JNI kullandığınızda gerçekten fazla taşınabilirlik kaybetmezsiniz. Yerel kütüphaneleri hala desteklemek istediğiniz platformlarda derleyebilmeniz şartıyla, temelde kodunuzun tamamını değil, yalnızca% 1'ini portlamanız / yeniden derlemeniz gerekir. Java'nın taşınabilirliğinden hala çok faydalanırsınız.
Mart'ta

4

Performans ve zayıf JVM optimizasyonları hakkındaki yanlış düşünceler tahminim olurdu. C ++ oyunlarının C ++ muadillerinden daha hızlı performans gösteren bazı Java portları olduğu için performans hakkındaki yanlış düşünceler söylüyorum (bkz. Jake 2). Asıl sorun, IMHO, birçok Java programcısının, kullanım kolaylığı ve kodun anlaşılabilirliği / sürdürülebilirliği ile olduğu gibi kanama kenarı performansına çok fazla odaklanmamasıdır. C / C ++ tarafında, aslında biraz daha yüksek seviyeli bir montaj dilinde kodlama yapıyorsunuz ve montaj veya düz makine kodu yazmadan alabileceğiniz kadar donanıma yakın.


"Donanımda yazmadan alabildiğiniz kadar donanıma yakın" ise, kodunuz korkunç olmadığı sürece Java onu yenemez. Donanıma ne kadar yaklaşırsanız o kadar hızlı alabilirsiniz.
Josh Johnson

4

Wikipedia'daki oyun motorlarının listesi, yazıldıkları programlama dili ile birlikte birçok oyun motorunu listeler.

Listelenen birkaç Java oyun motoru vardır.

Bazı bağlantılara tıkladığınızda Java ile yazılmış oyun ve demo örneklerine ulaşabilirsiniz. İşte bir çift:

Bazı oyunlar ve durumlar için Java'nın ödünleşimleri kabul edilebilir.


Oyunların biliyorum mevcut Java ile yazılmış olduğunu. Ancak Minecraft ve Runescape'in yanı sıra, Java platformu için çok az ana akım ticari oyun yazılmıştır. Java'da kaç AAA başlığı yazılmıştır? Ve neden bu kadar az? Dolayısıyla sorum.
Sasha Chedygov

3

.NET, yoğun 3D performansı söz konusu olduğunda Java'nın sahip olduğu aynı sorunlardan bazılarına sahiptir. Microsoft, 3D ağır operasyonlarla ilgili çalışmalarda kütüphanelerin geliştirilmesine çok daha fazla zaman ve para yatırdı.

(... kişisel olarak, DirectX ve .NET arasındaki sihir söz konusu olduğunda bacakları olduğunu düşünüyorum)


2
  1. Java yavaştır, ağır kaldırma işlemlerinin çoğu GPU tarafından yapılmaz. Hepsi çok zaman alan CPU'ya çarpan animasyon, fizik ve yapay zeka var.

  2. Java konsollarda mevcut değildir ve konsollar ticari oyunlar için ana hedeftir. PC'de Java kullanıyorsanız, makul zaman ve bütçe dahilinde konsollara bağlantı kurma yeteneğinizi ortadan kaldırmış olursunuz.

  3. Oyun endüstrisindeki daha deneyimli kodlayıcıların çoğu, Java popüler olmadan çok önce C ve C ++ kullanıyor. Yukarıdaki iki nokta buna katkıda bulunabilir, ancak birçok profesyonel oyun kodlayıcısının Java'yı bu kadar iyi bilmediğini düşünüyorum.

  4. Yukarıdaki orta katman yazılımıyla ilgili bir başkası iyi bir şeydi, bu yüzden cevabımı ekliyorum. Özellikle C / C ++ ile bağlantı kurmak için yazılmış birçok eski kod ve ara katman yazılımı var ve son olarak Java'nın iyi birlikte çalışabilirliğe sahip olmadığını kontrol ettim. Çoğu şirket için Java kullanmak, birçoğu bir şekilde ödenmiş olan çok sayıda kod atmayı içerir.


3
Birçoğunu GPU'ya boşaltmak için JavaCL, JOCL veya APARAPI kullanabilirsiniz.
Mart'ta

2

Aslında, yönetilen kodun 3d oyunlar yapması çok mümkün, sorun arka motorlar. Net ile kısa bir süre için Microsoft tarafından DirectX 9'a Yönetilen DirectX sarıcısı geldi. Bu şimdi XNA olan soyutlamadan önceydi.

DirectX api'lere tam erişim verildiği için .Net oyunları bir zevkle çalışır. Bildiğim en iyi örnek, VB.Net'te yazılmış olan www.entombed.co.uk.

Ne yazık ki, Java tarafında, ciddi bir şekilde eksik - esas olarak DirectX'in Java için mevcut olmaması ve oyun programcılarının DirectX api'lerini bilmesi ve anlaması - DirectX'e geri döneceğinizde neden başka bir api öğreneceksiniz?


2

Oyun pazarlaması ticari bir süreçtir; yayıncılar yatırımlarından ölçülebilir düşük riskli getiri ister. Sonuç olarak, odak genellikle tüketicilerin güvenilir bir geri dönüş üretmek için satın alacakları teknoloji istisnaları (istisnalar hariç) - bunlar lens parlaması veya daha yüksek çözünürlük gibi yüzeysel görsel efektler olma eğilimindedir. Bu etkiler güvenilirdir çünkü işlem gücünde artışlar kullanırlar - donanımdan yararlanırlar / Moore yasası artar. Bu, C / C ++ kullanıldığını gösterir - java genellikle bu avantajlardan yararlanmak için donanımdan soyutlanmış demektir.


1

Hızın hala sorun olduğunu tahmin ediyorum. Çapraz platform bir sorun olacak, çünkü kodu yazarken hangi 3B kartın mevcut olduğunu bilmiyor musunuz? Java'nın 3B yeteneklerin otomatik keşfini destekleyecek bir şeyi var mı? Ve bir oyunu wii, xbox ve ps3 arasında taşımayı kolaylaştıracak araçlar olduğunu tahmin ediyorum ama pahalı olacağım.

PS3, mavi ışın desteği ile java'ya sahiptir. Bd-j sitesini kontrol edin.


1

Net platformunda yazılan oyunlar bile, belleğe ve veriyoluna doğrudan erişim gibi hız için genellikle oldukça optimize edilmiştir. .Net, C / C ++ kullanmanıza ve C # gibi daha üst düzey dillerle karıştırmanıza izin verir.

Oyun geliştirme stüdyoları genellikle ürünlerinin düşük seviyeli arayüzlerine erişim sağlayan donanım satıcılarıyla yakın çalışır. Bu, cihaz iletişimi için ASM ve C'yi kullanmanız gereken bir dünya. Sanal bir ortam bu program parçalarını yavaşlatacaktır.

Her neyse, modern 3D oyunlar aslında daha yüksek seviyeli diller kullanıyor. Genellikle, oyun mantığını Lua veya Python gibi dillerde yazılmış bulacaksınız. Ancak, tipik 3D oyunun çekirdeği (G / Ç, iş parçacıkları, görev planlaması) önümüzdeki 25 yıl boyunca düşük seviyeli dillerde yazılacak veya uzun cihazlar kendi başlarına soyutlamaya ve sanallaştırmaya izin vermediği için (gelecek).


1

Önceden varolan / lisanslı kod tabanının, performansın vb. Öğelerinden yararlanma ile ilgili diğer yayınları kabul ediyorum.

Eklemek istediğim bir şey, kötü bir DRM hilesini sanal bir makineden çekmek zor.

Ayrıca proje yöneticilerinin C ++ ile istikrarlı / güvenilir bir kod oluşturabileceklerini düşündükleri bir hubris bileşeni olduğunu düşünüyorum. olduklarından daha akıllısınız.


0

Jagex tarafından Runescape yazılmış, "video oyunu" etiketi özellikle bir on-line oyun olarak geçerli olmayabilir, ama iyi bir takip var.


Üzgünüm, ama bu gerçekten soruma cevap vermiyor.
Sasha Chedygov

2
Ancak sorunun kör ifadesi, Java'da NO oyunlarının yazıldığı varsayımına yol açıyor, sadece birinin nerede olduğunu gösteren başarılı bir durum olduğunu gösteriyor.
Mark Schultheiss

0

Zaten çok konuşuldu, Wiki'de bile nedenlerini bulabilirsiniz ...

  • Oyun motoru ve tüm yoğun şeyler için C / C ++.
  • Oyunda komut dosyası yazmak için Lua veya Python.
  • Java - çok çok kötü performans, büyük bellek kullanımı + Oyun Konsollarında mevcut değildir (Bazı çok basit oyunlar için kullanılır (Evet, Runescape burada sayılır, Battlefield veya Crysis veya başka ne var) çünkü bu programlama dilini bilen birçok programcı).
  • Büyük bellek kullanımı (Bu programlama dilini bilen hemen hemen programcılar olduğu için bazı çok basit oyunlar için kullanılır).

İnsanları Java'nın yavaş olmadığına ikna etmeye çalışan daha fazla Java programcısı duyuyorum, ekranda bir widget çizmek ve widget üzerinde bazı ASCII karakterleri çizmek, ağ üzerinden veri almak ve göndermek için yavaş değil (Ve C / C ++ yerine bu durumlarda (ağ veri manipülasyonu) kullanılması tavsiye edilir ... Ama matematik hesaplamaları, bellek ayırma / manipülasyon ve bu iyi şeylerin çoğu gibi ciddi şeyler söz konusu olduğunda çok yavaş.

C / C ++ dilini ve derleyici özelliklerini kullanırsanız neler yapabileceğini gösterdikleri MIT sitesinde bir makaleyi hatırlıyorum: Bir matris çarpanı (2 matris), Java'da 1 uygulama ve C / C ++ 'da 1 uygulama, C / C ++ özellikleri ve uygun derleyici optimizasyonları etkinleştirildiğinde, C / C ++ uygulaması Java uygulamasından ~ 296 260 kat daha hızlıydı.

Umarım insanlar neden oyunlarda Java yerine C / C ++ kullanırlar, Java'da Crysis'i hayal ederler, bu dünyada bunun üstesinden gelebilecek herhangi bir bilgisayar olmaz ... + Çöp toplama, sadece bir görüntüyü yok eden Widget'lar için çalışır ama yine de orada önbelleğe alınmış ve temizlenmesi gerekiyor, ancak oyunlar için değil, her çöp toplama aktivasyonunda daha fazla gecikme olacak.

Edit : Birisi makale istedi çünkü, burada, ben bunu elde etmek için web arşivinde arama, umarım memnun ... MIT Vaka Çalışması

Ve eklemek için, hayır, oyun için Java hala korkunç bir fikir. Sadece birkaç gün önce isim vermeyeceğim büyük bir şirket, oyun istemcisini Java'dan C ++ 'a yeniden yazmaya başladı çünkü çok basit bir oyun (Grafikler açısından) güçlü nVidia GT 5xx ve 6xx nesil video kartlarına sahip i7 Dizüstü Bilgisayarları geciktiriyor ve ısıtıyordu ( Sadece nVidia değil, buradaki nokta, Max oyunlarını işleyebilen ve bu oyunun üstesinden gelemeyen bu güçlü kartların) ve bellek tüketiminin ~ 2.5 - 2.6 GB Ram olması. Böyle basit grafikler için bir makine canavarı gerekir.


10
Modern Java çalışma zamanı ve sanal makine hakkında çok az şey biliyorsunuz. Bahsettiğiniz makale, on yıl önce veya daha fazlasından muhtemelen daha fazla, elbette hiç kimse bilmiyor çünkü alıntı yapmadınız. Java algınız eski.
bgroenks

2
Tamam, bu çalışma büyük ölçekli matris çarpımı için verilere erişmek için 2 boyutlu dizi erişimi kullanıldığında Java'nın C'yi kaybettiğini kanıtlıyor. Evet bunu da tahmin ederdim. Ve eğer bu gerçekten sizin için bir problemse, şüpheliyim, bu yüzden JNI'nız var. Diziler için ek yükü kontrol eden sınırlar bu durumda toplanır, ancak Java kodu sonuçları önemli ölçüde iyileştirmek için optimize edilmiş olabilir. Benzer şekilde, "daha hızlı derleme = üretilen en iyi kod değil" diye belirttiği zaman JIT anlayışını sorgularım. Aksini kanıtlamak için IBM spesifikasyonlarını okuyun.
Mart'ta boğuşma

3
Java, oyun geliştirme için kötü bir seçim DEĞİLDİR. Java'yı çalıştıran birçok başarılı oyun var. Genellikle, en iyi sonuçları almak için yerel koddan (özellikle LWJGL ve benzeri) biraz yardıma ihtiyacınız vardır. Ancak sadece% 100 yerine kodumun% 1'ini birleştirmek ve yeniden derlemek zorunda kalırsam, bu bana çok şey gibi geliyor.
Mart'ta boğuşma

1
@bgroenks "% 100" - C / C ++ hakkında hiçbir fikriniz yok gibi görünüyor ... Ve bir oyun yaparken her zaman bir çapraz platform kütüphanesi (SDL ve bir grup diğerleri) veya çerçeve (örneğin Qt) kullanabilirsiniz. Örneğin: EA, sahip oldukları her oyun için Qt kullanır ... Qt, Java'dan daha fazla çapraz platformdur ve yerel koda derler.
Lilian A. Moraru

2
Qt'niz olduğunda Java'daki noktayı gerçekten görmüyorum. Qt kodunu Java kodundan daha açık, anlaşılması ve bakımı daha kolay buluyorum. Arkadaşlarımın neden C ++ 'dan bu kadar korktuklarını sorduğumda, bana her zaman işaretçilerden nefret ettiklerini ve hafızayı dağıttığından emin olduklarını söylüyorlar. Birçok insan C ++ paylaşılan_ptr hakkında bilmiyorum gibi görünüyor ... Benim için Qt ve C # .NET / C ++ .NET yazmak için en güzel. Java kodu genellikle istisna işleme ile çok şişirilmiş, genellikle eski kütüphaneleri vardır (Çoğunlukla sadece sunucu tarafında ama geri kalanında iyi yapıyor ...) ve sıklıkla eski belgeler.
Lilian A. Moraru
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.