# Minecraft aus programmiertechnischer Sicht



## Crysis nerd (16. Juli 2011)

Ich wollt mal eure Meinung zu Minecraft hören. Nicht über das Gameplay, sondern als Programmierer gesehen.
Also ich kenne mich nicht mit Java aus, und ich möchte die Sprache auch nicht runtermachen, aber wie ich das sehe, verschwendet der gute Notch(hauptsächlicher Programmierer) extrem viel Leistung.
Einmal das Generieren des Terrains: Es kostet bestimmt ne Menge Leistung, aber auch hier denke ich, dass die selben Algorithmen in C++ schneller wären, bzw optimierte Algos möglich sind.
Rendern: Minecraft laggt auf manchen Notebooks und dass kan ja wohl nicht sein. Die Anzahl der Polys entsprechen vllt. denen einer Figur in einem heutigen 3D Spiel und die Summe aller Texturen ist wohl kleiner als eine Textur bei Crysis.

Außerdem glaube ich irgendwie, dass Notch irgendwie "schlecht" ist. Ich weiß, wer im Schlachthaus sitzt, sollte nicht mit Schweinen werfen, aber:
Er braucht für kleine Features extrem lange und baut so viele unverständliche Bugs ein. Er bzw sein ganzes Team.

Was meint ihr zu dem Spiel und zu meiner Meinung zu dem Spiel? 

mfg
Crysis nerd


----------



## bingo88 (16. Juli 2011)

Ich finde es jedenfalls erstaunlich, was er da geschaffen hat (auch wenn mich das Spiel nicht interessiert ). Klar, Java ist vermutlich nicht die beste Wahl als Programmiersprache (wobei "beste" immer mit Vorsicht zu genießen ist), aber trotzdem. Ich meine mich auch zu erinnern, der hat vorher bereits an einem im Java geschriebenen MMORPG mitgearbeitet, vermutlich kommt die Wahl daher. Ich würde Java jetzt auch grundsätzlich nicht als ungeeignet einstufen. Den einzigen Teil, den ich bei Java wirklich als problematisch sehen würde, ist halt die Grafikausgabe. Da fehlt es wirklich an der schnellen nativen Unterstützung. Von der Grundperformance her ist Java in den letzten Jahren jedenfalls immer schneller geworden, der Abstand zu "nativen" Sprachen hat sich ergo auch weiter verkleinert. Je nach Benchmark liegt mal die eine, mal die andere vorne.


----------



## -NeXoN- (16. Juli 2011)

Naja, mich nervt es auch mehr oder weniger. Ich spiele auf dem Mainserver vom cube-network. Dort hängen im großen Kaufhaus ein paar Dutzend Fackeln, die ein statisches Licht abgeben. Ohne flackern oder ähnliches, einfach ein statisches Licht. Und naja .. egal ob mit meinem Desktop Rechner a 3GHz Quad + AMD 4890 Vapor-X 1024MB Raid 0 oder am neuen Notebook 2 x 2,93 GHz mit AMD 6550 1024MB + SSD .. die Framerate geht wenn ich dort drinstehe auf beiden Systemen unter die 20 FPS. Allgemein werden beide Systeme extrem laut und heiss bei dem Game. Auch wenn man meint dass es nicht rechenaufwändiger als ein SNES Super Mario ist (jetzt übertrieben ausgedrückt), braucht es doch unglaublich viel Performance, was auf Dauer schon nervt. Grade in Anbetracht dessen, dass das Spiel nahezu 0 Soundkulisse bietet auf die man sich konzentrieren kann (ausser diese Träumermusik für 30 sek alle 10 Minuten und die brechenden Blöcke), ist dass einzige was man wirklich wahrnimmt wie die Graka unglaublich übertrieben vor sich hinpustet ...


----------



## Star_KillA (17. Juli 2011)

Die Java Engine nutzt auch nur 1 Kern


----------



## Crysis nerd (17. Juli 2011)

Also ich finde nur eines erstaunlich: Die Generierung von Gelände, die sicher weitreichende Überlegungen voraussetz und wofür der Algo sicher sehr komplex ist.. Trotzdem...
Wie gesagt, zum einen die schlechte performance und zum andere die scheinbar langsame und schlechte programmierung.

Habs gerade mal ausprobiert: Ja nur einen kern, aber das bringt uns ja nichts. Minecraft muss mit einem Kern klarkommen! Der Code muss optimiert und die Sprache eventuell gewechselt werden.
Irgendwie fail: "energie spar modus" bei minecraft limitiert die framerate scheinbar einfach auf 25 oder so^^


----------



## MetallSimon (17. Juli 2011)

Also mich als "nicht-Programmierer" nervt es auch ein bisschen, dass das Spiel soviele Resourcen frisst. Das hätte man sicher besser machen können. Doch wenn man bedenkt, dass das Spiel nur von einer kleinen Gruppe programiert wurde, dann ist das zu vernachlässigen. Von der Programmierung kann es mit größeren Spielen nicht mithalten - wie auch, aber vom Spielprinzip her ist es echt Klasse.


----------



## Bauer87 (17. Juli 2011)

Für die Grafikausgabe wird JavaGL (oder so) benutzt, ohne  Grafikkarte/Treiber verschlechtert sich die Performance noch weiter. Ich würde behaupten, dass man einen Software-Renderer bauen könnte, der Minecraft rein auf der CPU flüssiger darstellt als es Java mit OpenGL schafft.

PS: Ich habe bisher unter Linux auf den freien radeon-Treiber gesetzt, für Minecraft muss es aber tatsächlich der offizielle von AMD sein.


----------



## jensi251 (17. Juli 2011)

Ja, ist schon ressourcen fressend.
Aber er ist ja auch kein Profi Entwickler (0der doch?)


----------



## Bauer87 (18. Juli 2011)

Erst Hobbyentwickler, mittlerweile aber durch das Spiel zum Millionär geworden.


----------



## bbcsb (18. Juli 2011)

Crysis nerd schrieb:


> dass die selben Algorithmen in C++ schneller wären, bzw optimierte Algos möglich sind.


 
Generell gebe ich dir recht: Java ist langsam, Resourcenfressend und sollte nicht für Spiele verwendet werden... Allerdings versuch mal, Minecraft auf C++ Basis zu entwickeln und dann für alle gewünschten Systeme zu veröffentlichen... Da haste kein Spaß dran, daher kann ich die Entscheidung dieses ehemaligen Hobby-Entwicklers schon verstehen.....


----------



## Leandros (18. Juli 2011)

Ich Minecraft mal decompiled und muss sagen, der Code ist schon nicht schlecht.


----------



## Crysis nerd (19. Juli 2011)

@bbcsb: War es denn von Anfang an sein Plan für alle System etwas zu entwickeln? Da bin ich mir nich sicher. Die Sache für Ipad etc kam ja jetzt auch erst vor kurzer Zeit. Und ihr kennt alle das Ibash Zitat: "Zu sagen Java wäre besser, weil systemunabhängig ist, wäre so als würde man sagen, Analsex ist besser, weil es Geschlechterunabhängig ist" 
Naja, meine Meinung. Ich würd das Spiel gern in C++ sehen.

@Leandros: Wie kann man sich bei Java decompilieren vorstellen? Bei C++ endet das ja mit Glück maximal in Assemblerbefehlen. Kriegt man bei Java den exacten Source wieder raus?
Wenn ja: willst du uns bzw mir mal schicken 
Ich bin nich so die Bombe in Java, von daher kann ich wohl schlecht beurteilen, ob das gut programmiert ist (vom Stil her). Außerdem bin ich auch kein Optimierungsexperte, also kann ich auch den Aspekt schlecht beurteilen. Trotzdem glaub ich nich, dass dieses Spiel so viel Resourcen fressen müsste, wie es tut.
EDIT: Lass mal Projekt unter uns hier starten, Minecraft komplett in C++ umzusetzen 

mfg


----------



## bingo88 (19. Juli 2011)

Es gibt z.B. den Java Class File Disassembler. Erzeugt aber kein source code, sondern die byte code Entsprechungen, ähnlich zu .Net Disassembler.


----------



## Bauer87 (20. Juli 2011)

Crysis nerd schrieb:


> Lass mal Projekt unter uns hier starten, Minecraft komplett in C++ umzusetzen


Es gibt schon einige Minecraft-Likes und -Klone, zusätzlich natürlich auch alternative Server. An Klonen wären da u.a. Manic Digger (C#) und Minetest-c55 (C++, Irrlicht-Engine).


----------



## fadade (20. Juli 2011)

Bauer87 schrieb:


> Es gibt schon einige Minecraft-Likes und -Klone, zusätzlich natürlich auch alternative Server. An Klonen wären da u.a. Manic Digger (C#) und Minetest-c55 (C++, Irrlicht-Engine).


 
Wär doch aber trotzdem cool, wenn man es selber gemacht hätte 
Dann kann man selber entscheiden, was wie funktioniert etc.

(Außerdem könnte man da dann mal ne KI* einbauen und sich damit beschäftigen )

_*Verweis auf nen anderen Thread _


----------



## Crysis nerd (20. Juli 2011)

Also ich fänds auch cool, es selber zu machen, aber es geht einfach nich. Selbst wenn wir hier 3 Leute zusammenkriegen.. glaub ich nich das es klappen würde. und ich denke hier hat nich wirklich jemand Lust dadrauf oder?
Aber Notch wollte für entwickler den quellcode veröffentlichen.. ka ob ers schon getan hat.

Bin hier gerade wieder am verzweifeln iwelche Mods zu installieren. Minecraft wird einfahc nur verdammt instabil und stürtz dauernd ab.


----------



## bbcsb (20. Juli 2011)

Crysis nerd schrieb:


> @bbcsb: War es denn von Anfang an sein Plan für alle System etwas zu entwickeln? Da bin ich mir nich sicher. Die Sache für Ipad etc kam ja jetzt auch erst vor kurzer Zeit. Und ihr kennt alle das Ibash Zitat: "Zu sagen Java wäre besser, weil systemunabhängig ist, wäre so als würde man sagen, Analsex ist besser, weil es Geschlechterunabhängig ist"
> Naja, meine Meinung. Ich würd das Spiel gern in C++ sehen.


 
Ich hoffe mal, obwohl man ihn das natürlich selbst Fragen müsste, ansonsten sehe ich ehrlich gesagt keinen Grund Java überhaupt zu verwenden... Besser ist es nämlich in keinem Fall, egal wo, egal wie


----------



## Bauer87 (20. Juli 2011)

Ich wollte ja nicht sagen, dass ihr einfach die Klone verwenden sollt. Es wäre aber vielleicht eine Überlegung wert daran mitzuwirken. Zumindest Minetest-c55 ist definitiv FLOSS.


----------



## Crysis nerd (22. Juli 2011)

Bauer87 schrieb:


> Ich wollte ja nicht sagen, dass ihr einfach die Klone verwenden sollt. Es wäre aber vielleicht eine Überlegung wert daran mitzuwirken. Zumindest Minetest-c55 ist definitiv FLOSS.


 FLOSS? Das Freelibre open source bla, was man über google findet?
Ich hab die malausprobiert.. Naja find ich nich so dolle. Und frisst immer noch einiges an Leistung, bei langsameren Landschaften generieren...
Bin aber echt mal gespannt aufn Source, wenn er veröffentlich wird..


----------



## AMD (22. Juli 2011)

Interessantes Thema hier 

Ich bin ehrlich gesagt jmd. der total gegen Java ist. (obwohl ich im Studium noch was für embedded Systems programmieren muss und dafür Java brauche )
Trotzdem, Java ist nunmal eine Interpretersprache und das ist letztendlich nunmal nicht so das wahre.

Notch wird Java genutzt haben, weil er es 1. kann und 2. sich bestimmt nie erträumen lassen hat, dass sein Projekt so riesig wird. Sowas plant man ja nicht einfach wenn man das als Hobby anfängt.
Auf einer C basierten Sprache zu setzen würde Minecraft sicher nicht schaden - vorallem da die Grafikausgabe mit Java mal nicht so pralle ist aber das hatte ja Bauer87 schon erwähnt.

Es wäre schon cool mal ein eigenes Spiel zu programmieren (wo ich im übrigen auch etwas dabei bin bzw. eher an der 3D Engine (C++ & OpenGL)) aber alleine ist das eine sehr zeitaufwendige Sache - zumal wenn man das nur ab und zu in der Freizeit macht.
Für manche Algorithmen muss man sich echt erstmal 2 Stunden mit Mathe beschäftigen und schreibt den Code dann in 10 Minuten


----------



## Crysis nerd (22. Juli 2011)

AMD schrieb:


> Interessantes Thema hier
> 
> Ich bin ehrlich gesagt jmd. der total gegen Java ist. (obwohl ich im Studium noch was für embedded Systems programmieren muss und dafür Java brauche )
> Trotzdem, Java ist nunmal eine Interpretersprache und das ist letztendlich nunmal nicht so das wahre.
> ...


Ist Java wirklich eine Interpretersprache? Ich meine es ist schon eine Programmiersprache, weils compiliert wird, obwohl ichs selber noch nie gemacht habe...
Ja ist schon klar.. am anfang so eines Hobby Projektes denkt man nich daran, obwohl ich sowieso nich Java nehmen würde 

Und mitn eigenen Spiel: Ich war schon in 2 Spieleprojekten, eines war ein Projekt eines Programmierforums. Ist leider untergegangen und wurde eingestellt. Das zweite ist eins von mir undn paar Kumpel, was noch nich eingestellt ist. 

Aber hier zu Minecraft: Wenn man den Java Source hat, ist das umschreiben auf C++ doch nich so schwierig odeR? Das einzige schwierige ist die Grafikausgabe... Alles andere ist nur Syntax umschreiben. 

mh.. kann  leider nich zuende schreiben, weil ich hier auffer lan minecraft mitspielen soll xD

bis denn


----------



## bingo88 (22. Juli 2011)

Naja, Java ist keine reine Interpretersprache. Java besitzt einen Just-in-Time Compiler und kann daher direkt Maschinencode erzeugen. Außerdem kann Java Hotspots im Code erkennen und zur Laufzeit optimieren.

Und man muss auch bedenken, dass ein Großteil der Performance vom Programmierer stammt (der also "gut" programmieren sollte), insofern sehe ich das Gestänkere gegen Java hier ziemlich kritisch. Außerdem macht es selbst erst einmal besser, in C++ gibt es nämlich ganz andere Performance-Fallstricke


----------



## AMD (22. Juli 2011)

Kann man so sagen ja, es wird halt nicht in einen Maschienencode übersetzt sondern in einen Bytecode. Ist zwar nicht direkt das gleiche aber wayne 
Aber ja, ich würde auch nie Java nehmen aber man muss es halt so sehen: Er kann es ganz gut! Wenn ich eine Sprache gut behersche und in dem moment keine bessere alternative habe nimmt man die natürlich^^

Tja, wenigstens steckt da noch ein Team dahinter und nicht so ein 1-Mann Komando wie bei mir 

Ich stell es mir schwierig vor. 
Den Syntax umschreiben dauert und das sind bestimmt nicht nur 1000 Zeilen Code. Also ich würds nicht machen wollen 

Hf auf den Lan


----------



## bingo88 (22. Juli 2011)

Java erzeugt erst mal Byte-Code. Der JIT-Compiler erzeugt aber Maschinencode, z. B. für Hotspots.


----------



## AMD (22. Juli 2011)

Sag bloß 
Im 1:1 Vergleich (z.B. mit C) ist Java dadurch trotzdem langsamer, da gibts letztendlich nicht viel zu diskutieren.


----------



## bingo88 (22. Juli 2011)

Das bestreite ich ja auch garnicht. Auch wenn Java in den letzten Jahren aufgeholt hat, gegen einen optimierenden C-Compiler reicht es (noch ) nicht. Aber wie gesagt, was ich bei MC wirklich als problematisch ansehe, ist die 3D-Ausgabe. Das kann Java einfach nicht gut. Der Rest hängt eher vom Können des Entwicklers ab.


----------



## Crysis nerd (23. Juli 2011)

Ich bin jedenfalls der Meinung, dass Notch von seinem Geld mal ein paar kompetente Entwickler zusammen kramen sollte, alles in C++ umsetzen und ein ordentliches Pluginsystem.
Es ist schrecklich wie instabil Minecraft läuft.. Es ist eine super idee, die extrem viel Erweiterungspotenzial hat. Notch sollte im Sinne der Fans von Minecraft ein kompetenteres Programmiererteam zusammenstellen, damit Minecraft aus der Sparte der Hobby entwicklungen rauskommt...


----------



## AMD (23. Juli 2011)

Ich glaube nur irgendwie nicht, dass das eintreten wird.
Klar wäre es mit C/C++ besser (wenn man es denn ordentlich macht) aber der Aufwand übersteigt wohl dem Nutzen.
Wenn man sich das große gesamte anschaut: Es ist erfolgreich und es läuft.


----------



## bbcsb (25. Juli 2011)

Genau, never change a running system... Obwohl bei MC "running" doch eher zweideutig ist, wenn ich mir teilweiße den RAM-Bedarf anschaue....


----------



## joffal (25. Juli 2011)

bbcsb schrieb:


> wenn ich mir teilweiße den RAM-Bedarf anschaue....


 
Das muss doch aber so sein oder? 
gehen wir mal von einem Sichtradius von 60 klötzchen aus, einer Höhe der Welt von ich glaube 128 und dann kannste approximieren mit einem Quadrat mit einer Seitenlänge von ... ~80 klötzen.
Nun Volumen des "Sichtfeldes" ausrechnen: 128 (Höhe) * 120(Länge) * 120(Breite) = 819200 Klötzchen. Jedes wird gespeichert mit öööhhmmm..... vllt einem int-Wert der 4(?)Bytes groß ist und schon haste den Speicherbedarf


----------



## AMD (25. Juli 2011)

Einem Int Wert definitiv nicht 
Wenn wir wirklich einen 3D Klotz sehen, haben wir ja 8 Eckpunkte. Jeder Eckpunkt hat ja wiederrum eine x, y, z Koordinate.
8*3 = 24 Werte.
Da diese (vermutlich) als float gespeichert werden (vllt. sogar double), kostet das 4 Byte (bei double sogar 8Byte).
24 * 4 Byte = 96 Byte pro Würfel (falls er wirklich komplett 3D ist! - ggf. wird ja nur eine 2D Sicht gemacht und wir hätten "nur" 12 Werte weil 4 Eckpunkte).

Bin zwar kein Minecraft Experte aber diese Rechnung sollte so einigermaßen aufgehen, da es ja doch relativ allgemein ist.


Es gibt natürlich noch andere Möglichkeiten, dass es z.B. nur 2x3 Eckpunkte gibt und darüber ein Würfel aufgespannt wird (was aber intern dann wieder mit 12 Ecktpunkten berechnet werden muss) aber so müssten so erstmal weniger Werte in Ram (aber das findet bei Minecraft wohl nicht statt )


----------



## fadade (25. Juli 2011)

und schwupps haste 1GByte RAM zusammen wollte joffal wohl sagen 

was könnte die Klasse "Klotz" denn alles enthalten?
- Position
- Typ
- texturort
- timer o.ä. für Zerstörung
- methode fürs zerstören 
- ..... ?!?


----------



## AMD (25. Juli 2011)

Dazu müsste ich wohl Minecraft besser kennen^^
Auf jedenfall haben wir die Geometrie (also das 3D Model) von so einem Klotz.
Dann die Texturen die raufgemappt werden mit U,V,W Koordinaten
Und ein Kollisionsabfrage gibts ja auch noch - wobei vermutlich bei Minecraft mit Bounding Boxes gearbeitet - das braucht nicht viele Resourcen und erfüllt für Minecraft den Zweck vollkommen. Hat zwar nix mit der Klasse Klotz zutun (falls es die so gibt) aber muss ja auch berechnet werden.
zu den Timer etc. kann ich nix sagen aber wenn du sagst die werden irgendwie zerstört nach einer gewissen Zeit...

Ich werd mal die Woche versuchen nen kleinen Algorithmus für so eine TerrainRenderung für meine 3D Engine in C++ zu schreiben und eben auch solche Klotze nehmen... mal schauen was bei raus kommt


----------



## Bauer87 (31. Juli 2011)

Die Klötze sind von allen Seiten aus dem gleichen Material, es gibt also nur (ganzzahlige) Positionen (int oder long für x/y, char für die Höhe), Material (wahrscheinlich char) und Schaden (char). Aber selbst das  ergibt für einen Kubus mit 256 Blöcken Kantenlänge 176MiB.

PS: Den Code von Minetest-c55 sollte es schon geben…


----------



## Freddycbv (1. August 2011)

Ich bin momentan zwar noch kein Programmier-Experte  , aber Minecraft kenn ich nur allzu gut.

Die Performance ist wirklich nicht gut, 100 % CPU Auslastung meines i5-2500k und circa 30% Auslastung meiner Graka(Gtx 560). Einen Absturz hatte ich dafür noch nie , sauber laufen kanns also schon, nur halt nicht auf jedem System 

Zum Thema Speicherplatz: Blöcke werden in Minecraft in Chunks gespeichert und geladen, die jeweils aus 16*16*128 = 65536 Blöcken bestehen. Noch zu wissen ist, dass immer 81 chunks aktiv sind. Es gibt bisher 96 (feste) Blöcke, wobei die Möglichkeit auf bis zu 255 offen gehalten wurde. Theoretisch bräuchte man dann für jeden Block 1Byte an Speicher + 3 Koordinaten für den Chunk, die sagen wir mal zusammen 12Byte brauchen. Also 65548 Byte * 81 aktive Chunks ergibt  5309388 Byte. Ähm... Wo sind da 400mb??? Natürlich kommen da noch viele Daten zusammen, aber 10mb sollten locker für die Karte reichen sammt allen Mobs+Truhen,Öfen;Wolle und Holz(für die extra Daten je nach Farbe gespeichert werden) und all die in Letzter Zeit weggeworfenen Items.

Es geht denk ich also viel schonender.

EDIT: Da fällt mir noch ein, dass in Minecraft im Startmenü immer so ein paar "Spracheinlagen" zu finden sind.
Ich bin mir auch zu 100% sicher, dort das Schriftzügchen "about 7000000 Lines of Code" gefunden zu haben, wobei es eine genaue Anzahl war. Ist das überhaupt möglich? Eine Million könnte es ja vielleicht sein, aber 7? Ich wage sogar zu behaupten, ganze 7 Milliarden gelesen zu haben, sicher bin ich mir aber nicht.


----------



## bingo88 (1. August 2011)

Zum Speicherverbrauch: Java hat einen eigenen Speichermanager. Man kann zwar forciert Speicher freigeben, das wird allerdings relativ teuer. Wenn also Daten nicht mehr benötigten werden, dauert es eine Zeit, bis die automatische Säuberung anläuft.

Zur CPU-Auslastung: Ein Spiel befindet sich in einer Schleife. Bei jeder Iteration wird das Spiel aktualisiert und anschließend gerendert. Wenn man jetzt keinen Frame Limiter einbaut, sollte die CPU-Last 100% erreichen. Das heißt ja nur, dass diese Schleife so schnell wie möglich ausgeführt wird.


----------

