Unterschiede C++/C#
-
Oh du geheiligtes C++, du bist das schnellste auf Erden
Java ist eine Sprache, und eine Sprache ist weder "schnell" noch "langsam".
Wenn jetzt Intel einen Javacompiler rausbringen würde wären die damit generierten Executables wohl nur unwesentlich langsamer als von dem Intel C++ Compiler.
Wird denn nicht immer damit Argumentiert dass C++ "platformübergreifend" sei?
Und wer programmiert denn wirklcih damit komplett plattformübergreifend? Die Leute werden sicherlich bestätigen dass die ganzen "Wrapper" auch viel von der Perfomance nehmen. Ich bezweifele sehr dass ein durchschnittlicher C++ Programmierer ohne gute, optimierende Compiler (Intels, gcc usw) und (fast genauso wichtig) schnelle, optimierte Libs eine flotte Executable produziert. Ich hab nämlich schon genug VC++ 6.0 "Auswüchse" im Debugger gesehen und das ist nicht das schlimmste was es gibt. Nicht "C++" ist superschnell (nein, kein Flame ) sondern es ist so weit verbreitet dass sich viele die "Mühe" machen angepasste, bessere Compiler rauszubringen (Intel - macht Geld damit,direkt und indirekt)
oder Libs zu optimieren. Wenn jetzt sich jemand Java annehmen würde und dafür einen "richtigen" Compiler mti allem drumherum schreiben, eventuell die Libs verbessern und besser an die Plattformen anpassen würde dann würde da vieles von der "C+++ Schnelligkeit" schwinden. Und überhaupt, wenn man von schnelligkeit spricht: dann müsste man auch immer C oder Assembly nehmen. Und ja: wenn mans kann, dann schlägt man in Asm immer noch jeden Compiler Jedenfalls ist mir keine Mersenne-Twister Implementierung in C++ bekannt die nur 18 Ticks braucht.Halt ich auch für ein gerücht... es sind eben völlig andere ziele und zugänge.. c++ ist meiner mienung nach noch ne etage tiefer als java. Sieht man doch schon daran wie eingeschränkt es ist im gegensatz von c++. Ich kann mir nicht wirklich vorstellen das sie einen COmpiler entwickeln der java c++ bei richtiger anwendung überholen lässt. Ich hab schon codes gesehen wo mithilfe von templates und inline der compiler von c++ dazu gebracht wurde code zu erstellen der !besser! ist als die gleiche funktion in asm. Jetzt werden einige aufheulen und sagen das es das nicht gibt... tja doch da der compiler hier so optimiert hat das er alles zusammengefast hat und am ende inlined und es dann nurmehr sachen wie add register,value1 add register value2 usw. sind. Das kann man mit einer asm funktion so malnicht realisieren (es sei denn mann schreibt hier in dem beispiel jede vektoraddition von hand und keine funktion dafür...) Um aufs thema zurück zukommen: sowas ist in java absolut unmöglich, ist aber auch nicht wirklich das ziel.
Am schluss noch meine bescheidene meinung zu games und so... ich finde sie sollten nicht in java sein da das einfach verschwendung von resourcen ist... ich mein dann brauch ich ein 2.5 ghz system um pong zuspielen, wo fürht das hin (für die flamer: das war übertrieben, klar
) Spiele sollten verflucht gut optimiert sein und alles rausholen.. dass das nicht der fall ist (auch nicht bei c++ spielen) ist mir klar aber das muss sich einfach ändern. Und java ist einfach ungeeignet dafür... sry. aber es gibt viele andre anwendungsbereiche wo java durchaus sogar die bessere wahl ist.
cu Manuelh87
-
Manuelh87 schrieb:
Um aufs thema zurück zukommen: sowas ist in java absolut unmöglich
Warum?
-
Gregor@Home schrieb:
Wenn du mit Java Spiele programmieren möchtest, dann wirst du dazu in erster Linie einen OpenGL-Wrapper wie JOGL oder die LWJGL nehmen. Hierzu mußt du wissen, dass OpenGL über diese Wrapper von Java aus praktisch genauso zu nutzen ist, wie von C++ aus. Du kannst also letztendlich ein OpenGL-Buch nehmen, welches auf C++ basiert und dieses für Java nutzen. Den Transfer von C++ zu Java mußt du da schon schaffen, das sollte aber auch nicht so schwer sein.
Na ja, da kann ich auch gleich in C++ programmieren.
Ich habe mir mittlerweile C++-Grundkenntnisse angeignet.
Mittlerweile freunde ich mich mit dieser Sprache immer mehr an.
Ich muß auch sagen das was ich an 3D in Java gesehen habe (z.B. Tribal Trouble, erstellt mit LWJGL ) hat mich nicht so überzeugt.
Wenn ich die Grafik als das zur Zeit machbare unter Java in 3D ansehe, so liegt die doch um ein paar Jahre hinter dem heute in C++ möglichen.
Ich habe zwar angenommen das Java etwas langsamer ist als C++, aber der Unterschied ist doch relativ groß.Gregor@Home schrieb:
Explizite "Java für Spiele"-Bücher wirst du kaum finden, weil Java im Spielesektor einfach noch nicht so populär ist.
In Deutschland leider nicht.
-
Annakin schrieb:
Gregor@Home schrieb:
Explizite "Java für Spiele"-Bücher wirst du kaum finden, weil Java im Spielesektor einfach noch nicht so populär ist.
In Deutschland leider nicht.
Wo denn?
-
Walli schrieb:
Annakin schrieb:
Gregor@Home schrieb:
Explizite "Java für Spiele"-Bücher wirst du kaum finden, weil Java im Spielesektor einfach noch nicht so populär ist.
In Deutschland leider nicht.
Wo denn?
Siehe andere Antwort von mir in diesem Thread
-
Gregor@Home schrieb:
Warum?
Sag mal hast du verstanden was ich dir da geschrieben hab?? Kannst du in java mit inline und templates arbeiten?? Ich glaube nicht und daher geht das nicht. Das ist nicht so einfach vorzustellen was dieser code macht den ich da erwähnt habe aber es ist so das es am ende alles (mit optimierung) meist in einem register ist und die serie von + operatoren alles zusammengefasst wird und am ende ersetzt der compiler alles mit add register, value1 add register, value2 usw. kein funktionsaufruf. kein register sichern alles völlig direkt und sowas geht in java nicht! Das ist unmöglich da die sprache meines wissens keine templates und kein inline anbietet (bei inline bin ich mir jetzt gar nicht so sicher aber verbessert mich falls es doch möglich ist). Du schaffst es nicht so einen code zu schreiben das geht nunmal nur in c++. aber wenn du kein asm kennst kannst du dir das auch nicht vorstellen. Es hat mich auch sehr verblüfft das es möglich ist so besseren code zu erreichen als bei der verwendung von asm... aber es ist nunmal so. Aber ich sag ja nicht java ist scheiße es ist halt nur für andere bereiche gedacht...
-
Manuelh87 schrieb:
Sag mal hast du verstanden was ich dir da geschrieben hab?? Kannst du in java mit inline und templates arbeiten?? Ich glaube nicht und daher geht das nicht.
Null Ahnung. Natürlich kann derJIT-Compiler inlinen, man muss deshalb nicht jeden Funktionsaufruf von Hand ausschreiben. Vielleicht solltest du dir mal bewusst machen, dass ein JIT-Compiler genau das auch kann, was ein statischer Compiler kann und sogar noch ein bisschen mehr, weil er zur Laufzeit Informationen kriegt, die ein statischer Compiler nicht kriegt.
Das einzige Problem, dass der JITer hat, ist, dass er sich nicht ewig Zeit lassen kann zum Compilieren. Er hat aber eh schon enormen Zeitgewinn dadurch, dass er den Code nicht mehr parsen muss, sondern nur noch optimieren.Ich hab schon codes gesehen wo mithilfe von templates und inline der compiler von c++ dazu gebracht wurde code zu erstellen der !besser! ist als die gleiche funktion in asm. Jetzt werden einige aufheulen und sagen das es das nicht gibt... tja doch da der compiler hier so optimiert hat das er alles zusammengefast hat und am ende inlined und es dann nurmehr sachen wie add register,value1 add register value2 usw. sind. Das kann man mit einer asm funktion so malnicht realisieren (es sei denn mann schreibt hier in dem beispiel jede vektoraddition von hand und keine funktion dafür...)
Du scheinst ja von inlining ziemlich begeistert zu sein. Das muss dich unglaublich vom Hocker hauen. Find ich gut, inlining ist manchmal ne feine Sache. Woher du allerdings die Erkenntnis nimmst, dass das nur ein C++-Compiler kann, ist mir ein Rätsel.
Und was ist bitte an Templates so toll? Was ist denn daran so wahnsinnig unmöglich? Es gibt gar nichts einfacheres als Templates. Das ist einfach nur ein unglaublich primitiver Makro-Prozessor. Es gibt gar nichts primitiveres als Textersetzungen. Wenn man die Generics gerade nicht brauchen kann, dann erstellt man sich halt notfalls über ein entsprechendes Plugin in seiner IDE Templates. Schön ist es nicht, weil es dafür keinen direkten Support auf Sprachebene gibt und man eben ein Tool braucht, was die Textersetzungen vornimmt. Aber "unmöglich" ist schon eine starke Bezeichnung dafür.
-
Manuelh87 schrieb:
Du schaffst es nicht so einen code zu schreiben das geht nunmal nur in c++. aber wenn du kein asm kennst kannst du dir das auch nicht vorstellen. Es hat mich auch sehr verblüfft das es möglich ist so besseren code zu erreichen als bei der verwendung von asm... aber es ist nunmal so.
Aha, die heutigen Compiler können also schon mit Supercodes umgehen? Na, dann ist klar, dass man den Code mit reinem asm unter keinen Umständen schneller bekommen kann als mit diversen Template-Techniken. Danke für die Aufklärung
!
-
Das kann man mit einer asm funktion so malnicht realisieren (es sei denn mann schreibt hier in dem beispiel jede vektoraddition von hand und keine funktion dafür...)
nur um das nicht "leer" stehn zu lassen: es gibt Assembler die MACROS anbieten
die Dinger kann man als "inliner/templates" missbrauchen so dass man sich einen Call spart(weil es vom Assembler vor der Assemblierung erstetzt wird). Abgesehen davon ob es wirklich viel bringt sich einen Call oder Jmp zu sparen - denn in der Assembly weiß man welche Register man sichern sollte und wenn man dazu die nötigen Dokumentationen durchliest (z.B Pentium Optimisation von Intel) dann steht man schon mal nicht schlechter da als ein Intelcompiler. Diverse SIMD Technicken lassen sich auch anwenden und sind noch ein stück schneller als normale Addition. Und Templates nutze ich öfters - die IDE RadASM bietet diese an
Du schaffst es nicht so einen code zu schreiben das geht nunmal nur in c++
wie schon erwähnt: "Oh du heiliges C++ !" Naja, was anderes sollte man in einem C++ Forum auch nicht erwarten
Nur, die meisten die davon rumschreien (die Vorteile von C++ ) haben diese meistens noch gar nicht gebraucht
-
Ich schließe mich mal Optimizers Aussage an.
Manuelh87: Vielleicht solltest du dich mal etwas genauer mit der Hotspot JVM beschäftigen. Hier ein entsprechender Link mit ein paar Informationen:
-
Annakin schrieb:
Ich muß auch sagen das was ich an 3D in Java gesehen habe (z.B. Tribal Trouble, erstellt mit LWJGL ) hat mich nicht so überzeugt.
Wenn ich die Grafik als das zur Zeit machbare unter Java in 3D ansehe, so liegt die doch um ein paar Jahre hinter dem heute in C++ möglichen.
Ich habe zwar angenommen das Java etwas langsamer ist als C++, aber der Unterschied ist doch relativ groß.Das kannst du nicht so direkt mit einem Domm 3 oder so vergleichen. Hinter einem Titel wie Tribal Trouble steckt nicht die Infrastruktur, die hinter einem großen kommerziellen Titel steht. AFAIK wurde das von ein paar CS Studenten in ihrer Freizeit geschrieben. Die leben da nicht von, sind noch keine Profis im Spielegeschäft und haben auch kein Millionen-Dollar Budget. Entsprechend kommt da natürlich kein Grafikwunder bei raus. Dafür sind die Hardwareanforderungen auch nicht so besonders groß. Soll AFAIK auf einem 700 MHz Athlon mit Geforce 2MX flüssig laufen.
-
Gregor@Home schrieb:
Annakin schrieb:
Ich muß auch sagen das was ich an 3D in Java gesehen habe (z.B. Tribal Trouble, erstellt mit LWJGL ) hat mich nicht so überzeugt.
Wenn ich die Grafik als das zur Zeit machbare unter Java in 3D ansehe, so liegt die doch um ein paar Jahre hinter dem heute in C++ möglichen.
Ich habe zwar angenommen das Java etwas langsamer ist als C++, aber der Unterschied ist doch relativ groß.Das kannst du nicht so direkt mit einem Domm 3 oder so vergleichen. Hinter einem Titel wie Tribal Trouble steckt nicht die Infrastruktur, die hinter einem großen kommerziellen Titel steht. AFAIK wurde das von ein paar CS Studenten in ihrer Freizeit geschrieben. Die leben da nicht von, sind noch keine Profis im Spielegeschäft und haben auch kein Millionen-Dollar Budget. Entsprechend kommt da natürlich kein Grafikwunder bei raus. Dafür sind die Hardwareanforderungen auch nicht so besonders groß. Soll AFAIK auf einem 700 MHz Athlon mit Geforce 2MX flüssig laufen.
Nenn mir mal einen Titel, der an Leistung (3D) das heute mögliche in Java herausholt.
Ich denke mittlerweile auch das die Geschwindigkeitsunterschiede zwischen Java und C++ erheblich sind. Nachdem was ich so in den Fforen höre, nicht nur in diesem, ist das auch die Meinung der meisten Programmierer.
-
Annakin schrieb:
Nenn mir mal einen Titel, der an Leistung (3D) das heute mögliche in Java herausholt.
Ich denke mittlerweile auch das die Geschwindigkeitsunterschiede zwischen Java und C++ erheblich sind. Nachdem was ich so in den Fforen höre, nicht nur in diesem, ist das auch die Meinung der meisten Programmierer.Ich kenne keinen. Vermutlich gibt es momentan auch keinen. Java ist in der großen industriellen Spielebranche praktisch nicht vertreten. Hast du mal ein C++ Indi-Game, das von der Grafik her an Doom 3 rankommt? Glaube nicht. Deine Argumentation ist so wie "Ich habe Battle for Wesnoth gespielt und schließe aus diesem Spiel, dass 3D mit C++ überhaupt nicht geht.".
Im 3D-Bereich dürfte aber praktisch kein Leistungsunterschied zu C++ vorhanden sein. Darauf hat weder Java noch C++ Einfluss, da die ganze Arbeit hier von OpenGL und der darunterliegenden Grafikhardware erledigt wird. Da gibt es für C++ und Java das gleiche Interface und in den performancekritischen Bereichen wird in beiden Fällen genau das Gleiche gemacht. Da gibt es dann praktisch kein Java oder C++ mehr, sondern nur noch OpenGL.
...oder meinetwegen Direct3D, was aber keinen wirklichen Unterschied machen sollte.
-
Gregor@Home schrieb:
Hast du mal ein C++ Indi-Game, das von der Grafik her an Doom 3 rankommt? Glaube nicht. Deine Argumentation ist so wie "Ich habe Battle for Wesnoth gespielt und schließe aus diesem Spiel, dass 3D mit C++ überhaupt nicht geht."
Das ein Java-Spiel den Vergleich mit Doom3 nicht standhalten kann war mir klar.
Die Programmierung in Java ist einfacher als mit C++.
Warum nutzen die Spiele-Entwickler Java nicht wenn keine Unterschiede vorhanden sind?Gregor@Home schrieb:
Im 3D-Bereich dürfte aber praktisch kein Leistungsunterschied zu C++ vorhanden sein.
Halte ich für ein Vermutung deinerseits die du nicht beweisen kannst.
Glaube ich nicht, da C++ binärer Code ist, während Java interpretierter Code ist.
Das oft gebrachte Argument das interpretierter Code sich während der Laufzeit auf den Prozessor optimiert und damit evtl. sogar schneller als C++ ist, konnte bislang auch noch keiner beweisen.Ich denke das Java eine Klassesprache ist, aber für die Spieleprogrammierung (3D) ist Sie nur bedingt geignet.
-
Annakin schrieb:
Halte ich für ein Vermutung deinerseits die du nicht beweisen kannst.
Ein lange nicht mehr gebrachter Link:
Evaluating Java for Game Development
Das ist zwar kein Beweis, aber zumindest sind in der Arbeit einige Benchmarks enthalten, die meine Aussage doch stark untermauern. Lies dir mal Abschnitt 7.10 durch. Da wird zumindest kein großer Unterschied bei der Nutzung von OpenGL durch Java und C++ festgestellt.
-
Annakin schrieb:
Das oft gebrachte Argument das interpretierter Code sich während der Laufzeit auf den Prozessor optimiert und damit evtl. sogar schneller als C++ ist, konnte bislang auch noch keiner beweisen.
Das Argument halte ich bisher auch für relativ schwach. Man wird sehen, ob sich da in Zukunft etwas ändert. Dieses Argument hat aber gar nichts mit der 3D-Performance zu tun. Dafür wird kein Javacode genutzt. Man nutzt entsprechende Funktionen von OpenGL.
-
Annakin schrieb:
Die Programmierung in Java ist einfacher als mit C++.
Begründung?
-
Annakin schrieb:
Das ein Java-Spiel den Vergleich mit Doom3 nicht standhalten kann war mir klar.
Die Programmierung in Java ist einfacher als mit C++.
Warum nutzen die Spiele-Entwickler Java nicht wenn keine Unterschiede vorhanden sind?Das hat viele Gründe.
1. Ich glaube, ich habe das Playstation-Argument schon gebracht. Dies wird in vielen Fällen der Hauptgrund sein.
2. Wenn schon viel Code in C++ vorhanden ist, fällt ein Umstieg auf Java natürlich schwer.
3. Java ist noch nicht allzulange so schnell, wie es jetzt ist. In den ersten Jahren wurde Java zum Beispiel komplett interpretiert. Es gab da keinen Jitter. Java hat in den letzten Jahre allerdings stark aufgeholt und ist nun in viele Bereichen (nicht in allen) mit der Geschwindigkeit nativer Programme gleichauf. Allerdings haftet Java weiterhin das langsam-Image an, was i.A. nicht gerechtfertigt ist. Es ist auch oft eine unbegründete Angst vor dem GC vorhanden.
4. usw.Aber guck mal in die Zukunft:
Langsam kommen Mehrkernprozessoren. Hierzu muss man wissen, dass Multithreading bei der Spieleentwicklung bisher nicht allzu präsent ist. Wenn man in Zukunft allerdings die ganze Leistung eines Prozessors nutzen möchte, wird man daran nicht vorbeikommen. Da macht sich eine Sprache wie C++, die Multithreading selbst nicht unterstützt natürlich nicht mehr so gut. Sprachen wie C# oder Java bekommen hier einen Vorteil, der sie für die Spieleprogrammierung (und auch in anderen Bereichen) attraktiver machen wird.
-
Glaube ich nicht, da C++ binärer Code ist, während Java interpretierter Code ist.
Mit Java Grafikprogramme schreiben .. ne nie im Leben, immerhin benutzt das einen JIT-Compiler. Völlig unmöglich mit einem
JIT-Compiler Grafikprogramme halbwegs benutzbar zu machen, sagt einem doch schon der Hausverstand. Mehr Argumente
braucht man auch schon nicht mehr gegen Java, den wer weitere sucht hat noch immer nicht verstanden, dass man in C++ native
Programme schreibt. Hoffe ihr versteht jetzt warum Java C++ nie das Wasser reichen wird, der JIT-Compiler ist schuld.
-
Gregor@Home schrieb:
Java ist noch nicht allzulange so schnell, wie es jetzt ist. In den ersten Jahren wurde Java zum Beispiel komplett interpretiert. Es gab da keinen Jitter. Java hat in den letzten Jahre allerdings stark aufgeholt und ist nun in viele Bereichen (nicht in allen) mit der Geschwindigkeit nativer Programme gleichauf. Allerdings haftet Java weiterhin das langsam-Image an, was i.A. nicht gerechtfertigt ist. Es ist auch oft eine unbegründete Angst vor dem GC vorhanden.
Aber guck mal in die Zukunft:
Langsam kommen Mehrkernprozessoren. Hierzu muss man wissen, dass Multithreading bei der Spieleentwicklung bisher nicht allzu präsent ist. Wenn man in Zukunft allerdings die ganze Leistung eines Prozessors nutzen möchte, wird man daran nicht vorbeikommen. Da macht sich eine Sprache wie C++, die Multithreading selbst nicht unterstützt natürlich nicht mehr so gut. Sprachen wie C# oder Java bekommen hier einen Vorteil, der sie für die Spieleprogrammierung (und auch in anderen Bereichen) attraktiver machen wird.
Meinst du nicht das die C++-Compiler auch auf die neuen Multiprozesseren angespasst werden? Vielleicht löst C# dann auch C++ ab, kann sein.
Ich bin jedenfalls gespannt wie die Situation in 3-5 Jahren ist.
Alles andere ist Spekulation.