Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

11

16.01.2012, 22:12

Java hat gerne mal Performanceprobleme bei der Kommunikation mit der Aussenwelt. Besonders JNI ist so richtig langsam. Algorithmen, die innerhalb der VM bleiben, sind eigentlich relativ performant.

Aber trotzdem finde ich, dass C# einige sehr nette Sprachelemente mehr hat als Java (Properties, Events, Delegates, ...). ;)
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

12

16.01.2012, 22:19

@Legend: Worauf basieren deine Aussagen? Ich bin immer interessiert an fundierten Erkenntnissen... LWJGL und Co. komen mir immer ziemlich schnell vor.

@Wirago: Naja das ist auch ohne weiteres möglich schließlich ist es einer Grafikkarte egal ob die Buffer von Java oder C++ gefüllt werden. Bei Physikengines ist das ganze schon ein bisschen anders, aber da Java sehr performant ist, reicht das auch für Spiele. Solange man nicht jedes Quentchen CPU nutzen muss, sollte Java immer eine gute Alternative zu C++ sein. Und zur Not kann man ja immer noch C++ Bilbiotheken per JNI einbinden. Das wird z.B. bei der JME3 gemacht. Dort kann man zum einen JBullet (reiner Java Port von Bullet) und Bullet per JNI einsetzen. In einem Studienprojekt habe ich gute Erfahrungen mit JBullet gemacht, falls du nach einer Physikengine suchst.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Chromanoid« (16.01.2012, 22:35)


Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

13

17.01.2012, 09:44

Wir hatten mal an der Uni im ersten Semester eine Aufgabe dazu. Mandelbrot berechnen mal in C++, mal in Java, mal in Java und die Berechnung war in C++ per JNI angebunden. Allerdings sollte jeder Pixel einzeln von Java aus angestoßen werden, das Interface war also extrem "chatty" und damit besonders schlecht für JNI.

Dann hatte ich letztes Jahr mal probiert Direct2D per JNI an Java anzubinden und hatte irre CPU Auslastungen, für das was gemacht worden war.

Im Netz habe ich dann dazu Aussagen wie z.B. diese hier gefunden:

Zitat


[*]A JNI call is very slow, in the order of .5 to 1.0 microseconds, the equivalent of pages of linear Java code to do a simple method call. You would think there would be a tiny generated machine code thunk to bridge between Java and C. Not so — at least in any JVM (Java Virtual Machine). I know of, Java branches to some general purpose code that interpretively constructs the C parameters. This code is not highly optimised. It seems Sun wants to strongly discourage you from using native methods just for speed. This means you don’t want to hop back and forth between Java and C, but rather to go to C, and stay there a decently long time before returning. This means that you can’t use C to speed up short operations, only long ones, because of the overhead tacked on in getting to C wipes out any savings.



aus http://mindprod.com/jgloss/jni.html
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Saik0

Treue Seele

Beiträge: 171

Beruf: Anwendungsentwickler

  • Private Nachricht senden

14

17.01.2012, 09:53

Man sollte nicht vergessen, dass Java sich durch aus mit OpenGL verwenden lässt. Mir fallen da direkt die JMonkey Engine und die ardor3. Darüber hinaus bieter Java noch eine eigene 3D API an. Ich hab zwar noch nicht viel Erfahrung mit Java und Spieleprogrammierung gemacht aber es ist schwer im Kommen ^^ Der Streit zwischen Java und C++ wird wohl nie aufhören :rolleyes:

15

17.01.2012, 11:53

@Legend: mmh interessant. man müsste mal schauen wie das mittlerweile aussieht. das letzte review der seite ist außerdem schon ein bisschen her. aber sicher ist wohl, dass jede form von kommunikation zwischen einer native anwendung und java gut durchdacht sein muss. einzelne int-ergebnisse o.ä. hin und her schicken sollte da so ziemlich die schlechteste variante sein. ich kenn mich zu wenig mit jni aus, aber ich denke mit directbuffers und co. sollte man bessere kommunikation hinbekommen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Chromanoid« (17.01.2012, 11:58)


16

17.01.2012, 14:55

Boah, danke für die vielen Antworten :)!

Ich brauche eh noch sehr lange, da ich gerade dieses Buch durcharbeite, und erst bei Kapitel 2.6 bin :rolleyes: .

Aber wenn das wirklich so ist, dass die Möglichkeiten in Java immer mehr im kommen sind, und einige nette SPiele ja auch damit programmiert wurden, bleibe ich vorerst auf jeden Fall dabei :).

Danke!

17

17.01.2012, 15:27

Das freut mich :) Ich wünsche Dir viel Erfolg. Falls Dir das Buch mal langweilig wird, kann ich Dir wie schon geschrieben http://www.programmierkurs-java.de/ (eine Art Vorlesung mit Sprachaufzeichnung siehe z.B. Unterrichtseinheit 1) ans Herz legen. Dort benutzt man für das Erlernen der Grundprinzipien eine Modellwelt, die dann später von der normalen Java-Umgebung abgelöst wird. Der Kurs führt einen so meiner Einschätzung nach ziemlich angenehm durch das Abenteuer Programmieren zu lernen :). Der Kurs sollte auch ohne weiteres zusammen mit Deinem Buch zum Lernen eingesetzt werden können.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Chromanoid« (17.01.2012, 15:32)


18

18.01.2012, 09:33

Ich persönlich komme aus der c++ Ecke und beherrsche die Sprache doch einigermassen. Keine komplett abgedrehten Sachen, aber die Grundlagen sitzen recht sicher.
Aktuell höre ich an der Uni noch Grundlagen der Informatik. Dort wird Erstsemestlern Programmieren mit Hilfe von Java beigebracht.

Insofern habe ich denke ich einen ganz guten Überblick, da ich mit beiden Sprachen nun einige Projekte umgesetzt habe.
Um Programmieren zu lernen ist Java sicherlich eine exzellente Entscheidung. Klare, verständliche Struktur, absolut strikt durchgezogenes OOP(gerade als Neuling lernt man hier einfach guten Stil!), keine Fallstricke, man kann sich aufs Design und die Funktionalität konzentrieren und muss sich nicht übermäßig mit der Sprache ausseinandersetzen. Für vieles gibt es vorgefertigte Funktionen.

Wenn man allerdings von einer anderen Sprache her kommt (bei mir jetzt c++) fallen einem doch etliche Dinge auf. Java macht es den Leuten leicht, aber der Preis dafür gleicht fast schon einer Zensur nach dem Motto "glaub mir, dies und jenes möchtest du nicht so machen, deshalb zeige ich dir garnicht, wie das funktioniert". Ein gutes Beispiel wäre die zwanghafte Aufteilung bei Vererbung mit implements und extends. Ein anderer Punkt der Garbace Collector (darüber mag man vortrefflich streiten, ich für meinen Teil hätte aber irgendwo ganz gern Kontrolle über meinen Speicher).
Insgesmat hat Java für mich einen nicht zu vernachlässigenden Teil "Augenwischerei". Für Anfänger mag das optimal sein, wenn man sich aber mal Gedanken dazu gemacht hat, kommt man sich extrem eingeschränkt vor. (Warum z.B. soll ich keine ArrayLists von nativen Datentypen anlegen dürfen?)

C++ hat für mich den Vorteil ein Bindeglied zu sein zwischen C und den modernen Hochsprachen wie C#, Java, etc. Man bekommt damit eine Freiheit gegeben, mit der man aber auch erstmal umzugehen lernen muss. Gerade aber mit Boost (und der neue c++ standard dann eh) sind einem unheimlich mächtige Werkzeuge an die Hand gegeben und das ganze speicher- und rechenzeiteffizient. Man hat einfach Kontrolle über das was man macht und ist dennoch flexibel (Templates, Vererbung, wildeste Pointerarithmetik, etc).

Der Große Nachteil von c++ sehe ich in seiner damit einhergehenden Komplexität. Man sehe sich allein mal ein einfaches Hello World programm an. Da kommen schon fast sämtliche Sprachfeatures vor. (namespaces, Klassen, Operatorüberladung, um nur ein paar zu nennen) Hier erstmal durchzusteigen, um zu verstehen, was man da genau macht (und bei c++ ist das schlicht überlebensnotwendig, sich zu überlegen, was da passiert, weil die Sprache einfach nicht so viel vergibt, wie z.B. Java) und wie das ganze intern dann umgesetzt wird, dauert eine ganze Weile, in der man vorrangig erstmal nicht kreatives schaffen kann, sondern sich auf seine vier Buchstaben setzten muss und Code zerpflücken, debuggen, auseinanderrupfen und und und muss, um wenigstens mit einem Fuß auf dem Boden zu stehen.


Letztendlich denke ich kommt man mit beiden Möglichkeiten ans Ziel, die zwei Fragen, die sich mir aber dabei stellen sind :
a) Wie schnell?
und, was vermutlich deutlich wichtiger ist:
b) Was habe ich dabei gelernt?

Was für ein Ziel man vor Augen hat, muss aber wie immer jeder selbst wissen.
In diesem Sinne,

Laguna
Portfolio runvs.io | Gamejolt | itch.io | PEWN | Twitter

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

19

18.01.2012, 10:27

@Laguna:
danke für diesen guten Vergleich der Sprachen Java und C++
zu den von dir genannten Nachteilen von Java möchte ich aber noch ein paar Anmerkungen bringen:

die Trennung der Vererbung mittels extends und implements ist notwendig, da in Java keine Mehrfachvererbung verwendet wird, aber dafür Schnittstellen definiert werden können, mit deren Hilfe indirekt Mehrfachvererbung möglich ist (extends für Klassen, implements für Schnittstellen)
dies wird so auch in C# gehandhabt
ich halte dies nicht für eine schlechte Lösung, allerdings habe ich auch noch nicht mit Mehrfachvererbung gearbeitet

Garbage Collector:
C++ ist in der Hinsicht tendenziell besser, dass dort der Speicher selbst verwaltet werden kann und dadurch die Ressourcen schonend eingesetzt werden können
dies erfordert allerdings auch sehr viel Erfahrung, da es sonst zu Fehleranfällig ist (ich spreche dabei nicht aus eigener Erfahrung)
der Garbage Collector bringt den Vorteil, dass man sich um die Speicherverwaltung keine Gedanken mehr machen muss und, wie du schon geschrieben hast, man sich auf das Design und die Funktionalität konzentrieren kann

ArrayLists:
es ist nicht so, dass man das nicht darf - es geht einfach nicht
das hängt aber auch damit zusammen (denke ich zumindest), dass man die primitiven Datentypen in Java nicht Polymorph verwenden kann bzw. weil man auf ihnen nicht die grundlegensten Methoden (toString(), ...) anwenden kann, die durch Object gegeben sind
die einzige alternative wäre, auf die entsprechenden Klassen, wie Integer, Byte und Float zurück zu greifen


Java hat aber auch noch ein paar Defizite, die du noch nicht genannt hast:
es gibt keine Operatorenüberladung (bei den primitiven Datentypen hat man den gesammten Umfang an Operatoren und nur bei Zeichenketten zumindest noch zusätzlich das + - gerade bei BigInteger macht sich dieses Defizit bemerkbar)
es gibt keine Funktionszeiger bzw. Delegates (es kann also keine CallBack-Methode übergeben werden, sondern es muss ein Objekt einer bestimmten Klasse/einer bestimmten Schnittstelle übergeben werden)


der Vorteil von Java ist also, dass es einfach zu erlernen und verwenden und eine schnellere Programmierung möglich ist
der Vorteil von C++ ist vor allem, dass die Programme tendenziell Sparsamer im Verbrauch von Arbeitsspeicher und Rechenleistung sind
deshalb wird Java eingesetzt, wenn die Kosten für Anwendungen gering gehalten werden sollen und eine gute Wartbarkeit gegeben sein soll und C++ in Bereichen, in denen in jedem Fall die Performance wichtig ist (würde ich zumindest so sagen)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

20

18.01.2012, 10:46

Insgesmat hat Java für mich einen nicht zu vernachlässigenden Teil "Augenwischerei". Für Anfänger mag das optimal sein, wenn man sich aber mal Gedanken dazu gemacht hat, kommt man sich extrem eingeschränkt vor.

Diese Einschränkungen haben jedoch auch für erfahrene Entwickler und komplexe Projekte Vorteile, vor allem wenn es darum geht verschiedene 3rd Party Bibliotheken zu integrieren.
Als ich in Java programmiert habe war es oft kein Problem einfach eine vorhandene Bibliothek einzubinden und ohne einen einzigen Blick in ein Tutorial, die Webseite oder die Dokumentation direkt zu verwenden. Das geht in C++ so gut wie nie, in C# nur manchmal.
Das ist denke ich das Resultat der sehr einschränkenden Sprache, man ist quasi gezwungen Bibliotheken nach einem kleinen Satz an standard Pattern zu entwerfen da es einfach kaum andere Möglichkeiten gibt.

Werbeanzeige