Java, çapraz platform oyunları için iyi bir seçim mi? [kapalı]


13

Java'da bir oyun oluşturmak istiyorum ve Windows, Linux ve Mac üzerinde çalışmasını istiyorum. C # bunun için kötü bir seçim olduğundan eminim ve C veya C ++ yeterli deneyimim yok. Flash'tan uzak durmak istiyorum. Bu nedenle Java benim için iyi bir seçim mi? Çoğunlukla, C # kullanıyorum ve Java'nın benzer olduğunu düşünüyorum, bu yüzden öğrenmesi zor olmayacağını düşünüyorum. Ama yeterince hızlı mı? İhtiyacım için Java'dan daha uygun bir dil var mı?


8
Yapmak istediğiniz oyun tarzına bağlıdır. İstenen stile bağlı olarak HTML5 ve bazı javascriptlerin java olmasa bile sizin için çalışması olabilir.
Patrick Hughes

Oddlab Java tabanlı oyunlar satmaktadır, örneğin Tribal Trouble. Motorlarının detaylarını oddlabs.com/technology.php

5
Minecraft, Java ile yazılmış çapraz platform oyununa harika bir örnektir. Delikanlımızın ciddi bir Minecraft oturumu için dostları olduğunda OSX, Windows ve Linux'ta oynarlar.
Kev

İki yıl sonra, C #, her ikisi de iOS, Android ve WP8'i de destekleyen Unity motoru ve / veya Monogame yardımıyla bu tür şeyler için oldukça iyi.
Magus

Yanıtlar:


28

Java, platformlar arası oyunlar yazmak için son derece uygundur. Ana avantajlar:

  • Taşınabilirlik - Genel olarak, bir Java oyunu yazabilir ve çoğu platformda değişmeden çalışmasını bekleyebilirsiniz. Muhtemelen herhangi bir dilin en taşınabilir seçeneği - C / C ++ diğer son derece taşınabilir bir seçenektir, ancak her platform için yeniden derlenmesi gerekir ve çoğu durumda kütüphanelerin taşınabilirliği sınırlayan platforma özgü özellikleri vardır.
  • Performans - Java kodu, iyi yazılmışsa, C / C ++ da dahil olmak üzere diğer tüm diller kadar iyi performans gösterir. JVM JIT derleyici son derece iyi. Java'da en kaliteli, başarılı bir oyun yazabilirsiniz (örneğin Minecraft).
  • Kütüphaneler - Java için, ağdan grafiklere ve sese kadar yapay zekaya kadar oyunlarda isteyebileceğiniz hemen hemen her özelliği kapsayan çok çeşitli kütüphaneler vardır. Çoğu Java kütüphanesi açık kaynaklıdır.

Almak zorunda olduğunuz temel karar hangi GUI çerçevesini kullanacağınızdır. Birkaç farklı seçenek var, ancak en göze çarpan seçenekler:

  • jMonkeyEngine - tam teşekküllü 3D motor. Bir 3D oyun yapmak istiyorsanız, bu muhtemelen en iyi seçimdir - sahne grafikleri, arazi üretimi vb.Gibi birçok oyun motoru özelliği içerir.
  • LWJGL - OpenGL'ye doğrudan erişimi olan daha düşük seviyeli bir kütüphane. Maksimum performans istiyorsanız ve motorunuzun çoğunu sıfırdan yazmayı düşünmüyorsanız, size cazip gelebilir.
  • Salıncak - son derece portatif olma avantajına sahiptir ve Java çalışma zamanına dahildir, bu nedenle ekstra bir bağımlılığa ihtiyaç duymaz. Grafik olarak yoğun olmayan 2D oyunlar (strateji oyunları, kart oyunları vb.) İçin iyidir
  • Slick - LWJGL tabanlı bir 2D oyun kütüphanesi. Bir 2D oyun yazmak istiyorsanız, ancak yine de iyi grafik performansına ihtiyacınız varsa (shoot-em-up, scroll platform oyunları vb.)
  • JavaFX - kabaca Flash gibi zengin internet uygulamaları için tasarlanmıştır. Henüz çok fazla kullanılmadığını görmememe rağmen oyunlar için iyi olacak bir sürü düzgün özelliği var. Özellikle JavaFX 2.0 oldukça umut verici görünüyor.

Oyun için Java'nın ana dezavantajları gerçekten sizi etkilemeyecek, ancak bazı oyun sınıfları için geçerli olan "uç durumlar" etrafındadır:

  • 3D motor kullanılabilirliği - yukarıda listelenen araçlar ve motorlar iyi olsa da, profesyonel oyun şirketleri tarafından kullanılan Unreal Engine gibi C / C ++ motorlarının seviyesine kadar hala yüksek değildir. Eğer milyonlarca bütçeyle büyük bir FPS geliştirmeye çalışıyorsanız, Java muhtemelen ilk tercihiniz olmayacak - C / C ++ hala burada kazanıyor.
  • GC gecikmesi Java çöp toplama genel olarak büyük bir avantajdır, ancak GC döngüleri meydana geldiğinde hafif duraklamalara neden olabilir. Bu, yeni düşük gecikmeli JVM'lerle çok daha iyi hale geliyor, ancak yine de çok düşük gecikme gereksinimleri olan oyunlar için bir sorun olabilir (belki de birinci şahıs nişancı oyunları). Çözüm, http://javolution.org/ gibi düşük gecikmeli kitaplıkların kullanılmasıdır , ancak bunlar oyunlardan ziyade yüksek frekanslı ticaret veya gerçek zamanlı sistemlerde daha fazla hedeflenmiş gibi görünmektedir.
  • Düşük düzeyli optimizasyonlardan yararlanamama yeteneği - Java JIT derleyicisi inanılmaz derecede iyi olsa da, hala kaçınamayacağınız bazı kısıtlamaları zorlar (örneğin, dizileri kontrol etmek). Bu tür şeyleri optimize etmek için gerçekten yerel makine kodu düzeyinde erişim almanız gerekiyorsa, yine de Java üzerinden C / C ++ tercih edersiniz.

Dikkate alınması gereken birkaç dağıtım seçeneği olduğunu unutmayın:

  • Uygulama - kullanıcılar için çok uygun bir tarayıcıda çalışır, ancak uygulamalar güvenlik nedeniyle yapabilecekleri ile sınırlıdır. Ek güvenlik ayrıcalıkları almak için uygulamaları imzalayabileceğinizi unutmayın, ancak bu çoğu kullanıcı için biraz korkutucu bir soruna neden olacaktır.
  • Java Web Start - tam yerel indirme gerektiren ve aynı zamanda yerel sistem kaynaklarına erişmesi gereken daha karmaşık oyunlar için daha iyi. Aynı zamanda platformdan oldukça bağımsız bir şekilde çalışır. Muhtemelen orta ölçekli bir oyun veya uygulama güvenlik kısıtlamalarından kaçmak için en iyi yol.
  • Yükleyici indirme - Bir Java oyunu için başka bir dil için olduğu gibi bir yükleyici yazabilirsiniz. Kurucuların platforma özgü bazı özelliklere sahip olma eğilimi gösterdiğinden, elbette yapılandırmak ve test etmek biraz daha fazla iş.
  • Web - HTML5 web uygulaması yazabilir ve Java'nın gücünü yalnızca sunucu tarafında kullanabilirsiniz. Çok oyunculu bir web oyunu için düşünmeye değer.

Son olarak, diğer JVM dillerinden bazılarını da düşünmeye değer - bunlar yukarıda listelenen Java platformunun tüm avantajlarına sahiptir, ancak bazıları bunları Java'nın kendisinden daha iyi diller olarak kabul eder. Scala, Clojure ve Groovy en önde gelenleri olacak ve hepsi yukarıda listelenen Java araçlarını ve kütüphanelerini kullanabilirler.


1
JWS, uygulamanızı tarayıcıdan ayırmaktan başka uygulamalara fazla bir şey eklemiyor. Her iki durumda da bir OpenGL kütüphanesi kullanıyorsanız kodunuzu imzalamak isteyeceğinizi düşünüyorum.
Peter Taylor

2
Yerel sistem erişiminin, özellikle çok oyunculu olmak üzere birçok ciddi oyun için uygulama kısıtlamaları üzerinde gerçekten büyük bir "çok" olduğunu söyleyebilirim. HTML5 düzgün, ancak hala sivilceli desteği ve GL ve Sockets gibi önemli bitleri olan birçok tarayıcıda çılgın bir bebek, ayrıca ses henüz oyun kullanımı için uygun değil.
Patrick Hughes

1
@PatrickHughes, büyük korkutucu diyaloglar olmadan JWS'den yerel sistem erişimini istiyorsanız, kodunuzu imzalamanız gerekir - ve imzalı bir uygulama genellikle yerel sistem erişimine de sahip olacaktır.
Peter Taylor

Java oyunlarınızı dağıtmak için Inno Setup'ı da kullanabilirsiniz .
Mahmoud Hossam

1
Kendi motorunuzu yazmanıza yardımcı olan paketler listesine LIBGDX ekleyebilirsiniz; çeşitli platformlar ve hatta Android ve OpenGL ES'ye kadar kurulumlar ve JNI optimizasyonları vardır.
Patrick Hughes

4

Önemli olan Minecraft ve Bloklar Java ile oluşturulmuştur, bu yüzden evet oyun yapmak için çok iyidir. Java kullanırken karşılaşacağınız ana sorun, bu rotaya gidip yerel bir uygulama yazmayı seçerseniz mobil platformlara taşımaktır. Android, ayrı bir kütüphaneye sahip bir tür frankensteined Java SE. RIM'den Blackberry Java ME kullanıyor. Objective-C muhtemelen bu platform için daha iyi bir seçim olacaktır, ancak iOS teorik olarak Java ile programlanabilir.

Java, C # 'a oldukça benzer. Sadece Java bilmesine rağmen genellikle C # kodunu anlaşılır buluyorum. Farklı bir tasarım felsefesine sahipler, ancak asgari güçlükle geniş çapta konuşlandırılabildikleri sürece her ikisi de faturaya uyuyor. C #, mobil dağıtımınız daha zor olacak ve pencereler dışındaki platformlara dağıtmak, hangi harici kütüphaneleri kullandığınıza bağlı olarak daha fazla zaman alıcı veya zor olacaktır.


1
Mobil cihazlarda Java: bir kez derleyin, her yerde hata
ayıklayın

0

En belirgin ve en az dirençli yol HTML5 + javascript combo kullanmaktır. Bunu kullanarak yapılan herhangi bir uygulama veya oyun hemen hemen her cihazda ve tarayıcıda çalışır.

Avantajı : - Oyununuzu çeşitli platformlarda ve cihazlarda çalıştırmak için sıfır yapılandırmaya ihtiyacınız olacak.

NOT: - Yukarıda belirtilen teknolojileri kullanarak oluşturulan birkaç oyun gördüm, ancak boyları daha küçüktü. Ama sanırım biri sütten tereyağı yapabilirse peynir imkansız değil


0

Sen kullanabilirsiniz Scala ve Şema Bigloo Java oyunun içinde stresli kodu veya paralel olarak gelişen eylem için JVM kullanmak Eclipse üzerinde.

Desen Tasarımı ve UML2 ile, OCL ile de kodu güvence altına alabilirsiniz, hepsi Topcased.org'da.

Bu araçlara hakim olmak zaman alır, ancak Java'nın arka planıdır, sizi en üste itecektir.


-10

Kısa cevap: hayır.

Java ikili bir çalıştırılabilir dosya oluşturmaz, yalnızca C # 'ın (CLI) yaptığı gibi bayt kodu oluşturur ve bu, iki ana nedenden ötürü "açık ortamlarda" ciddi işler için iyi bir şey değildir:

  • tersine çevirmede tuzağa düşme olasılığı çok yüksektir, özellikle Java gibi eski ve gerçekten iyi bilinen dillerde
  • makine performansları üzerinde tam kontrole sahip değilsiniz, Java durumunda JVM tam kontrolü ele almakta büyük rol oynar.

Tabii ki her dilin kendi kütüphaneleri var ama her dil için büyük miktarda olması nedeniyle bu gerçek bir sorun değil ve bu konunun amacı olduğunu düşünmüyorum.

Belki profesyonel düzeyde, tüm C # ifadelerini gerçek bir dünya makinesi için montaj koduna çevirebilen bir dev-Kit gibi kuralı kırabilecek bir şey bulabilirsiniz, ancak bu tür bir yaklaşım kartlarda değilse pratik olarak zorlanırsınız Ürününüzü açık bir ortamda satmayı amaçladığınızda, yalnızca C ve C ++ 'ı geliştirmeniz için düşünün.

Mobil cihazlar için işler biraz farklı çünkü gerçek ortam ROM'larının kaynağının genellikle halka açık olmadığı göz önüne alındığında Android bile pratik olarak kapalı, Android açık kaynak olarak kabul edilebilir, ancak 99 Gerçek cihazlardaki ROM'ların% 'si değil. Bu durumda çok fazla tartışamazsınız, her şey sizin için zaten ayarlanmıştır ve herkesin bildiği gibi her platformun kendi dili vardır.

Sonunda bu ürünleri açık bir ortamda satacaksanız, sadece derlenmiş ve ikili / montaj kodu üretebilen diller önerebilirim, kapalı ortamlarda kararın farklı nedenlerle yapılması daha kolaydır.


7
Derlenmiş ikili dosyaların mühendisleri tersine çevirmelerinin bayt kodlu ikili dosyalardan daha zor olduğuna inanıyorsunuz. Bunda küçük bir gerçek olabilir, ama çok değil. Aslında muhtemelen CLI veya Java bayt kodu ile karşılaştırıldığında x86 ve x64 sökücü ile daha fazla kişi çalışabilir ve IDA Pro gibi bir aracın ne kadar yararlı olabileceğine şaşıracaksınız (feragat - Ücretsiz sürümden beri kullanmadım. yıllar önce - muhtemelen şimdi daha da kolay). Gizlenmiş bir baytkod dosyasını tersine çevirmek daha da zor olabilir ve her durumda, çoğu kişinin bakım için çok az nedeni olacaktır.
Steve314

2
Neden bakım için çok az sebep var? Kaç kişi kendi düşük seviye özel oyun motorlarını yazıyor? Ve bunu yapsanız bile, birinin yasal olarak kullanmak yerine birisini çalmayı tercih etmesi (tersine mühendislik gerektirmesi, herhangi bir belge içermemesi vb.) Olasılıkları nelerdir? iyi belgelenmiş ücretsiz açık kaynaklı motor? Tam programın korsanlığı, kod fikirlerini çalmak için tersine mühendislikten çok daha büyük bir endişe kaynağıdır ve korsanlar yerel derlenmiş kod tarafından en ufak bir caydırılmış gibi görünmemektedir.
Steve314

1
Soyutlama seviyelerinde, JVM talimatları son derece düşük seviyededir - tam olarak donanımda olduğu gibi değil, temel olarak uygulama katmanı soyutlamasından çok uzaktadır. Soyutlama katmanlarının sayısı standart Java kitaplıklarında olduğunda, yani platform ve son uygulama arasında gerçekten çok az katman vardır. Normalde C ve C ++ 'da normalde olması dışında (neden libpng'i yeniden icat eder) - çoğu insan yaygın olarak bilinen bir dizi platformu etkili bir şekilde oluşturan ortak kütüphaneleri kullanır ve iyi ters mühendislik araçları bunları tanıyabilir.
Steve314

3
Gereksinimleri karşılamak için tüm kodların FPGA üzerinde gönderilmesi ve epoksi ile kaplanması gerekir. Sürpriz, kara kutu çip paketleri bile her zaman tersine mühendislikle yapılabilir ve üretilebilir. Daha sonra Intel gibi güçlü devler bile CPU paketlerinde hatalar içeriyor, böylece epoksi gömülü, donanım kara kutunuz hala donanım kitaplıklarına maruz kalıyor. Sonunda belirsizliğe göre güvenlik çağrısı işe yaramıyor. Reductio ad absurdum, biliyorum, ama orijinal cevap da öyle.
Patrick Hughes

3
Maalesef seni küçümsemek için yeterli üne sahip değilim. Tüm argümanlarınız başarısız oldu. Orada insanlar, C, C ++ veya herhangi bir dilde üretilen oyunları çözme, decompiling ve hackleme insanlar var, bu yüzden ikili bir paket olmak çok daha fazla güvenlik sağlamaz. Dahası, eğer OP bu konuda endişe duyuyorsa, orada çok fazla iyi java obfuscator var. Makine performansının tam kontrolü hakkında, C ve C ++ programcılarının çoğunda da bu yoktur, sadece iyi kod yazın ve derleyici neye ihtiyaç duyulduğunu optimize eder. Ve bu bir sorun olsa bile, JNI veya JNA kullanabilirsiniz.
Victor Stafusa
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.