Hallöchen
Ich wollte mich mal der Herausforderung stellen, ein kleines Java-Game zu schreiben.
Und zwar sollte dies eine relativ "Abgespeckte" version von Teraria sein.
Ich habe nun 3 Anläufe gehabt, alle 3 gingen auch, aber ich hatte ständig performance Probleme.
Desswegen hätte ich hier ein paar Fragen :
1. Ich generiere bei jedem Start eine Welt, im Moment sollen das 100x100 Blöcke sein.
Diese Welt wird wie folgt generiert :
- Ich erstelle eine "Location", dies ist eine selbst geschriebene Klasse in der die X und Y Koordinate und ein Block, auch eine selbst geschriebene Klasse, gespeichert wird. In dieser Block Klasse wird ein BlockTyp gespeichert, im moment entweder Erde oder Luft, und dann noch einmal die dazugehörige Koordinate...
Diese "Location" sollte also nicht zu viel Speicher verbrauchen, da sie ja nur aus ein paar zahlen und anderen Variablen besteht.
Die ganzen Locations werden in einer HashMap gespeichert, um dann bei jedem repaint() die Location aus der HashMap zu holen, die der Spieler sehen kann. Leider wird das ganze aber extrem ruckelig. Ich kann teilweise zusehen, wie sich die Blöcke um einen Pixel verschieben, und das ganze obwohl ich weit über 60 mal in der Sekunde repainte. Sogar wenn ich am Ende des repaints gleich nochmal repainten lasse, was meiner Meinung nach dazu führen sollte, dass so oft repaintet wird wie nur möglich, ist es nicht ruckelfrei...
Den repaint führe ich auf einem JPanel aus, das auf einem JFrame liegt. Ich benutze die paintComponent() Methode, wobei mir leider immer noch niemand wirklich erklären konnte, wo der Unterschied zwischen paint() und paintComponent() liegt. In der Überschriebenen paintComponent() wird dann einfach die HashMap mit den ganzen Locations geladen, danach werden die benötigten Locations gesucht, es wird der BlockTyp abgefragt und dann das dazu passende Bild gemalt.
Gibt es da irgendwelche Möglichkeiten dies zu verschnellern, sollte ich in der paintComponent() vielleicht nicht rechnen, oder ist graphics2d.drawImage() ungeeignet ?
Hat da jemand ne Idee ?
Würde mich auf jeden Fall über eine schnelle Antwort freuen.
mfg Major_Sauce
Ich wollte mich mal der Herausforderung stellen, ein kleines Java-Game zu schreiben.
Und zwar sollte dies eine relativ "Abgespeckte" version von Teraria sein.
Ich habe nun 3 Anläufe gehabt, alle 3 gingen auch, aber ich hatte ständig performance Probleme.
Desswegen hätte ich hier ein paar Fragen :
1. Ich generiere bei jedem Start eine Welt, im Moment sollen das 100x100 Blöcke sein.
Diese Welt wird wie folgt generiert :
- Ich erstelle eine "Location", dies ist eine selbst geschriebene Klasse in der die X und Y Koordinate und ein Block, auch eine selbst geschriebene Klasse, gespeichert wird. In dieser Block Klasse wird ein BlockTyp gespeichert, im moment entweder Erde oder Luft, und dann noch einmal die dazugehörige Koordinate...
Diese "Location" sollte also nicht zu viel Speicher verbrauchen, da sie ja nur aus ein paar zahlen und anderen Variablen besteht.
Die ganzen Locations werden in einer HashMap gespeichert, um dann bei jedem repaint() die Location aus der HashMap zu holen, die der Spieler sehen kann. Leider wird das ganze aber extrem ruckelig. Ich kann teilweise zusehen, wie sich die Blöcke um einen Pixel verschieben, und das ganze obwohl ich weit über 60 mal in der Sekunde repainte. Sogar wenn ich am Ende des repaints gleich nochmal repainten lasse, was meiner Meinung nach dazu führen sollte, dass so oft repaintet wird wie nur möglich, ist es nicht ruckelfrei...
Den repaint führe ich auf einem JPanel aus, das auf einem JFrame liegt. Ich benutze die paintComponent() Methode, wobei mir leider immer noch niemand wirklich erklären konnte, wo der Unterschied zwischen paint() und paintComponent() liegt. In der Überschriebenen paintComponent() wird dann einfach die HashMap mit den ganzen Locations geladen, danach werden die benötigten Locations gesucht, es wird der BlockTyp abgefragt und dann das dazu passende Bild gemalt.
Gibt es da irgendwelche Möglichkeiten dies zu verschnellern, sollte ich in der paintComponent() vielleicht nicht rechnen, oder ist graphics2d.drawImage() ungeeignet ?
Hat da jemand ne Idee ?
Würde mich auf jeden Fall über eine schnelle Antwort freuen.
mfg Major_Sauce