Minecraft aus programmiertechnischer Sicht

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 :schief:)
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 :ugly:
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 :P

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
 
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 :ugly:
 
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 :ugly:
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 :ugly:

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 :lol:

Hf auf den Lan ;)
 
Sag bloß :schief:
Im 1:1 Vergleich (z.B. mit C) ist Java dadurch trotzdem langsamer, da gibts letztendlich nicht viel zu diskutieren.
 
Das bestreite ich ja auch garnicht. Auch wenn Java in den letzten Jahren aufgeholt hat, gegen einen optimierenden C-Compiler reicht es (noch :D) 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.
 
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...
 
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.
 
Genau, never change a running system... Obwohl bei MC "running" doch eher zweideutig ist, wenn ich mir teilweiße den RAM-Bedarf anschaue....
 
wenn ich mir teilweiße den RAM-Bedarf anschaue....

Das muss doch aber so sein oder? :D
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 :lol:
 
Einem Int Wert definitiv nicht :lol:
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 :ugly:)
 
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
- ..... ?!?
 
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 :ugly:
 
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…
 
Ich bin momentan zwar noch kein Programmier-Experte :D , 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 :D, sauber laufen kanns also schon, nur halt nicht auf jedem System :D

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:what:) und all die in Letzter Zeit weggeworfenen Items:ugly:.

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.
 
Zuletzt bearbeitet:
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.
 
Zurück