schnellste alternative um in java zu "zeichnen"

Status
Nicht offen für weitere Antworten.

Java Chris

Bekanntes Mitglied
würd gern ein isometric spiel machen, dazu bräuchte ich aber ne gewisse geschwindigkeit um die Landkarte schön und schnell darzustellen, was gibts denn da in java an schnelles?

ich kenn in java nur swing und awt um etwas darzustellen, gibts was besseres bzw schnelleres?
 

AlArenal

Top Contributor
Es gibt diverse Schnittstellen zu OpenGL, wie z.B. JOGL. In der Regel heißt es aber:

1. make it work
2. make it fast

Hast du empirische Daten (Test-Code), die deine Vermutung stützen, dass AWT/Swing alleine nicht reichen?
 
B

Beni

Gast
Du könntest auch OpenGL benutzen (z.B. mit JOGL). Da könntest du vielleicht auch einige Dinge, wie die Berechnung Vorder-/Hintergrund, an die Hardware abgeben.

[Edit, grrr, zu langsam]
 

0xdeadbeef

Top Contributor
Es gibt Sachen, die sind in Swing/AWT lahm. Das blitten von Grafiken in ein Graphics(2D)-Objekt geht aber sehr flott, solange man BufferedImages benutzt.
 

Java Chris

Bekanntes Mitglied
naja ich hab nur versucht 100x100 felder darzustellen und das hat schon ewig gedauert, inklusive um 45° drehung

sonst bin ich eigentlich auch ein feind von leuten, die sagen, java sei langsam :p
 

0xdeadbeef

Top Contributor
Java Chris hat gesagt.:
naja ich hab nur versucht 100x100 felder darzustellen und das hat schon ewig gedauert, inklusive um 45° drehung

sonst bin ich eigentlich auch ein feind von leuten, die sagen, java sei langsam :p

Willst Du die Felder in "Echtzeit" drehen? Warum legst Du die Grafiken nicht gleich "richtig" ab oder drehst sie zumindest nur einmal beim Start des Spiels?
Und 100x100 Felder sind 10000 Felder. Kaum vorstellbar, daß die auf einmal auf den Bildschirm passen. Also zeichne entweder nur die, die auch wirklich zu sehen sind oder mal sie in eine große Hintergrundgrafik und kopier dann den Teil raus, der zu sehen ist.
Und nur am Rande: Java benutzt - soweit möglich - Hardwarebeschleunigung, wenn man BufferedImages benutzt (am besten mit GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage() erzeugen).
Ich bezweifle ganz entschieden, daß Du mit JOGL und dergleichen ernsthaft schneller wirst.
 

Java Chris

Bekanntes Mitglied
0xdeadbeef hat gesagt.:
GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage()

hört sich interessant an, hab ich noch nie verwendet, muss ich dann mal ausprobieren
 

0xdeadbeef

Top Contributor
Eigentlich werden BufferedImages immer hardwarebeschleunigt, falls es irgendwie geht. Die per CreateCompatibleImage erzeugten Bilder sind aber von einem Typ, der auf diesem System auf jeden Fall optimal wiedergegeben werden kann - wenn Hardwarebeschleunigung überhaupt verfügbar ist.

Falls Du Fullscreen benutzt, wäre auch ein 16bit-Modus überlegenswert. Auf ollen Rechnern ist ein 16bit-Fullscreen-Modus teils dramatisch flotter als ein 32bit-Modus.

Trotzdem denke ich, daß Du eventuell Deinen Zeichenalgorithmus überdenken solltest. Falls Du wirklich 10000 Bilder pro Frame um 45° drehst und zeichnest, wirst Du so oder so auf keinen grünen Zweig kommen.
Wenn's auf Zeichenperformance ankommt, sollte man folgende Dinge beachten:
1) Alles, was irgendwie geht, vor dem eigentlichen Spiel/Level berechnen, zeichnen und cachen.
2) Während des Spiels nur das zeichnen, was unbedingt benötigt wird. Jeden Pixel nach Möglichkeit nur einmal zeichnen.

Bei einem scrollenden Spielfeld (gehe ich jetzt mal davon aus), gibt es prinzipiell zwei Ansätze:
1) Vorher den gesamten statischen Level in ein großes Graphics-Objekt malen und dann bei jedem Frame den passenden Teil aus der Hintergrundgrafik kopieren. Darüber dann animierte Objekte malen.
2) Statisches Spielfeld aus Kacheln/Tiles aufgebaut: für jeden Frame bestimmen, welche Tiles sichtbar sind und dann genau diese Kacheln zeichnen. Darüber dann wieder animierte Objekte malen.

#1 ist nur bis zu einer gewissen Größe sinnvoll, aber einfacher zu implementieren und flexibler, weil der Level auf beliebigen Objekten aufgebaut sein kann.
#2 ist das Standardverfahren für typische 80er/90er-Konsolenspiele. Mit symmetrischen Tiles recht gut beherrschbar für fast beliebige Levelgrößen. Levelbau ist sehr einfach (z.B. ASCII-Zeichen in Textdatei). Nachteil: etwas mehr Aufwand als #1 und nicht trivial für unsymmetrische Tiles.
 

Moonlight1234

Bekanntes Mitglied
Ich habe beides mal ausprobiert:

1) Vorher den gesamten statischen Level in ein großes Graphics-Objekt malen und dann bei jedem Frame den passenden Teil aus der Hintergrundgrafik kopieren. Darüber dann animierte Objekte malen.
2) Statisches Spielfeld aus Kacheln/Tiles aufgebaut: für jeden Frame bestimmen, welche Tiles sichtbar sind und dann genau diese Kacheln zeichnen. Darüber dann wieder animierte Objekte malen.

Methode 1:
Ichhabe den gesammten Level als statische Image (mit
Code:
GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().
getDefaultConfiguration().createCompatibleImage() )
gezeichnet.
Der aktuell dargestellte Ausschnitt wird in eine Volatile Image kopiert und dann ins Frame kopiert
Ich erreiche dadurch Frameraten von 270 Frame/sec.
Ich bin immer davon aus gegangen das dieses die schnellste Methode ist, da ja alles vorgezeichnet ist und nur noch kopiert wird. Speicherplatzintensiv aber schnell.

Ich habe trotzdem nochmal Methode 2 ausprobiert:
Die Tiles habe ich als statische Image angelegt.
Die werden dann immer wieder neu in eine Volantile Image gezeichnet.
Die Volantile Image wird dann ins Frame kopiert.
Ich erreiche dabei Frameraten von etwa 500 Frames/sec.

Ich hatte eigentlich angenommen das dieses die langsamste Methode ist, da ja alles immer wieder neu gezeichnet wird.

Weiß jemand erklären wie diese unterschiedliche Geschwindigkeit zu Stande kommt?

Außerdem habe ich bei Methode 2 das Problem daß bei einem minimieren des Spieles mit ALT-TAB die Framerate, dh. Die Leistung der volatile Image sinkt und so niedrig bleibt, auch wenn ich wieder in das Spiel gehe.
Selbst wenn ich die Volantile Image neu erzeuge bleibt die Framerate niedrig.
Welche Einstellungen muß ich neu setzen wenn ich wieder die hohe Framerate habe will?
volantileImage.setPriority(1.0F)
und ein erneutes setzten des Frame im GraphicsDevice mit
setFullScreenWindow()
brachte keine Änderung.

Gruß, Moonlight1234
 

0xdeadbeef

Top Contributor
Ein "volatile" Image muß nicht im Speicher der Grafikkarte liegen, es kann da liegen. Ein Problem ist zudem, daß sie halt im wahrsten Sinne des Wortes "flüchtig" sind. Schlimmstenfalls kann es passieren, daß das Image überschrieben wird und man es neu zeichnen muß. Dafür gibt es ja auch einen Listener-Mechanismus, soweit ich mich erinnere.
Ich könnte mir vorstellen, daß Dir sowas passiert, also daß durch das Umschalten die Grafikkarte den Speicher für sich reklamiert und das volatile Image ausgelagert wird.
Wenn ich das richtig kapiert habe, werden managed Images (also solche, die man per CreateCompatibleImage) erzeugt hat, ebenfalls im Speicher der Grafikkarte gehalten, wenn es denn möglich ist. Ich persönlich schlage mich deshalb auch gar nicht mit volatile Images rum.

Was das Reinkopieren der "großen" Grafik angeht: wie machst Du das denn? Kopierst Du wirklich nur den benötigten Ausschnitt oder vertraust Du aufs Clipping? Ansonsten könnte es natürlich sein, daß das große Image im Speicher der Grafikkarte liegt (ist ja "managed") und dadurch andere Sachen (z.B. der Frambuffer) keinen Platz mehr finden.
Es kann aber auch gut sein, daß das Kopieren eines Image-Ausschnitts nicht (komplett) hardwarebeschleunigt ist, daß Kopieren eines kompletten Images aber schon. Eventuell gibt es auch eine Größenlimitierung für die Hardwarebeschleunigung.[/i]
 

Moonlight1234

Bekanntes Mitglied
Den Status der VolatileImage prüfe ich permanent.
Es werden bei beiden Methoden statische Images in eine Volatile Image kopiert.
Der Unterschied ist nur die Größe der statishen Image . Ich kopiere den Ausschnitt aus der großen Grafik mit drawImage.
Clipping wäre ein Ansatz den ich mir nochmal anschauen könnte.
Wobei ich auch bei kleinen Levelgrößen (1024x768) genau die gleiche Framerate wie oben angeben habe.
Ich werde wohl (erstmal) Methode 2 verwenden, da diese anscheinend schneller ist, vom geringeren Speicherplatzbedarf mal abgesehen.
Längerfristig könnte es damit aber Probleme geben.
Im Moment verwende ich nur wenige verschiedene Tiles. Wenn ich mehr unterschiedliche Tiles verwende, wird der Speicherplatzbedarf größer. Dann könnte die Performace von Methode 2 sinken. Momentan sind die Tiles alle gleich groß. Mittelfristig will ich evtl. unterscheidlich große Tiles, welche nicht an einem Raster ausgerichtet sind verwenden.
Dann wird es komplizierter, wenn man nur den jeweils sichtbaren Levelausschnitt neu zeichnen will.
Ich müßte dann für jedes Tile prüfen ob es gerade sichbar ist, was eine Menge Performance kosten wird.

Leider kann man aus dem Source von von createCompatibleImage() und createVolatileImage() nichts lesen, da diese nativ implementiert sind.
Schade.
 

Memphis

Aktives Mitglied
Moonlight1234 kannste mal zentrale Punkte deiner Engine posten - also nen bissel Code. Da ich auch gerade ein Isometricspiel entwickle und ich komm nur so auf 50 Fps. Wenn es möglich wäre vll. wie du die Images erzeugst, dann vll. noch den renderalgo und so vll. noch nen bissel mehr.

Memphis verdankt sich für alles was kommt.
 

0xdeadbeef

Top Contributor
Bei unterschiedlichen PCs und unbekannter Bildschirmauflösung (bzw. Größe des angezeigten Fensters) ist ein Vergleich der Framerate kaum sinnvoll, oder?
 

Moonlight1234

Bekanntes Mitglied
Moonlight1234 kannste mal zentrale Punkte deiner Engine posten - also nen bissel Code. Da ich auch gerade ein Isometricspiel entwickle und ich komm nur so auf 50 Fps. Wenn es möglich wäre vll. wie du die Images erzeugst, dann vll. noch den renderalgo und so vll. noch nen bissel mehr.

Das Programm ist mittlerweile so umfangreich daß ich den Code nicht mehr posten kann, daß würde nichts bringen.
Das brauchst du auch nicht.
Erzeuge die Image wie von 0xdeadbeef vorgeschlagen mit createCompatibleImage().
Schaue dir außerdem auch mal BufferStrategy an. VolatileImage braucht man erst mal nicht, bzw wenn du BufferStrategy verwendest dann kannst du auf VolatileImage ganz verzichten.
Was von beidem man verwendet ist eher Geschmackssache.

In einem anderen Topic hatten mir 0xdeadbeef und andere sehr geholfen:
http://www.java-forum.org/de/viewtopic.php?t=20670&highlight=scrolling

Bei unterschiedlichen PCs und unbekannter Bildschirmauflösung (bzw. Größe des angezeigten Fensters) ist ein Vergleich der Framerate kaum sinnvoll, oder?

Das stimmt.
Die Framerate von 500 Frames/sec ist ohnehin unter idealen Vorausetzungen gemessen. Sobald bestimmte Ereignisse auftreten (Sound, Kollisionsabfrage etc.) schwankt diese sehr.
Ich wollte auch nur darauf hinweisen das der Unterschied zwischen 270 und 500 Frames/sec erheblich ist.
Wobei auch eine Framerate von 270 Frames/sec mehr als aussreichen wäre.
Ich probiere nur mal ganz gerne was anderes aus.
:)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Alternative zu ChoiceBox in SceneBuilder Spiele- und Multimedia-Programmierung 0
Kenan89 Alternative zu Thread Runnable Spiele- und Multimedia-Programmierung 2
T Media Framework oder Alternative gesucht! Spiele- und Multimedia-Programmierung 9
W Drag and Drop oder Alternative? Spiele- und Multimedia-Programmierung 3
P 2D Game - Alternative zur TileMap? Spiele- und Multimedia-Programmierung 2
E Alternative zu import com.sun.image.codec.jpeg.JPEGCodec ? Spiele- und Multimedia-Programmierung 1
T drawstring alternative Spiele- und Multimedia-Programmierung 4
S Java als Serverseitige Alternative zu PHP Spiele- und Multimedia-Programmierung 8
xFearofdarkness Feinde überlappen sich in Java Spiel Spiele- und Multimedia-Programmierung 3
A Minecraft Java Buch fehlermeldung Spiele- und Multimedia-Programmierung 61
yakazuqi Minecraft java.lang.Error: Watchdog Spiele- und Multimedia-Programmierung 3
L Fehler bei "Nochmal Spielen" (Java) Spiele- und Multimedia-Programmierung 1
N Minecraft Java Error Spiele- und Multimedia-Programmierung 6
M "Java Datei" Cannot be resolved to a variable Spiele- und Multimedia-Programmierung 2
1Spinne Minecraft Fabric Modding Java Error Spiele- und Multimedia-Programmierung 2
Joris Minecraft Minecraft Java Server Spiele- und Multimedia-Programmierung 6
Shanic Minecraft Minecraft Forge Server "Falsche Java Version" Spiele- und Multimedia-Programmierung 6
O Browser-basiertes online Pokerspiel mit Java Spiele- und Multimedia-Programmierung 1
M Spiel Mühle-Programmierung Java Spiele- und Multimedia-Programmierung 9
G VST-Plugins in Java verwenden Spiele- und Multimedia-Programmierung 0
P Audio Visualizer mit OpenGL in Java? Spiele- und Multimedia-Programmierung 4
P Snake Java Hilfe Spiele- und Multimedia-Programmierung 4
D Minecraft [Minecraft] Java Start Fehler (Core-Dump) Spiele- und Multimedia-Programmierung 1
T Welche packages aus der java api doku ist hilfreich zur Android Spieleprogrammierung Spiele- und Multimedia-Programmierung 2
A Programmieren eines Memorys mit Java (in Eclipse) Spiele- und Multimedia-Programmierung 5
L Sound in Java Spiel Spiele- und Multimedia-Programmierung 5
C Java findet FluidSynth nicht Spiele- und Multimedia-Programmierung 2
I Java Andere Fenster in Borderless-Mode setzen Spiele- und Multimedia-Programmierung 16
leon_krys Java-Bußgeldrechner Spiele- und Multimedia-Programmierung 5
G [Java/KryoNet/LibGDX] Mutliplayer Packet Frage Spiele- und Multimedia-Programmierung 2
P Website mit Java Backend? Spiele- und Multimedia-Programmierung 1
D Java Bild bewegen funktioniert nicht Spiele- und Multimedia-Programmierung 8
J Fertigungstechnik.. PLS HALP.. Quellcode vom Text in java-Klasse speichern Spiele- und Multimedia-Programmierung 2
E Kalah Java Implementation Spiele- und Multimedia-Programmierung 1
G [Java] Vereinfachung von Boolean Abfragen Spiele- und Multimedia-Programmierung 3
G [LibGDX/Java] ArrayList Object Speicher Spiele- und Multimedia-Programmierung 3
T Java 3D Spiele- und Multimedia-Programmierung 2
A Spielfelder erstellen mit Jogl Java durch ein Koordinaten Array Spiele- und Multimedia-Programmierung 1
J Java Buttons Spiele- und Multimedia-Programmierung 6
T Java Kalender Spiele- und Multimedia-Programmierung 5
Ice4P4rty Java Optische Oberfläche Spiele- und Multimedia-Programmierung 2
MABY Eine mp3 Datei in Java abspielen Spiele- und Multimedia-Programmierung 14
D Java Bomberman Probleme java.lang.NullPointerException Spiele- und Multimedia-Programmierung 1
N Spiele-Menü in Java Spiele- und Multimedia-Programmierung 9
J HDMI Ausgänge mit Java programmieren? Spiele- und Multimedia-Programmierung 18
H Yu-Gi-Oh! Mit Java was tun? Spiele- und Multimedia-Programmierung 6
G Component System Java 2D Game LibGDX Spiele- und Multimedia-Programmierung 6
S Pong java.lang.StackOverflowError Spiele- und Multimedia-Programmierung 3
C Java aus Klasse rausgehen Spiele- und Multimedia-Programmierung 2
MaxG. Java Internet Radio Spiele- und Multimedia-Programmierung 6
G [Java Server] Allgemeine Frage zum Thema Networking in Videospielen Spiele- und Multimedia-Programmierung 15
P java.lang.NoClassDefFoundError: in Greenfoot Spiele- und Multimedia-Programmierung 0
G Java Achsen invertieren Spiele- und Multimedia-Programmierung 2
G Java 2D Spiel mit LWJGL verbinden Spiele- und Multimedia-Programmierung 1
$ Einstieg in Java Game Development Spiele- und Multimedia-Programmierung 11
BraunBerry Java Game Pixel "einfärben" Spiele- und Multimedia-Programmierung 6
BraunBerry Java Game verbesserte Kollisionserkennung Spiele- und Multimedia-Programmierung 18
BraunBerry Java Game Waypoint System Spiele- und Multimedia-Programmierung 3
S Hilfe bei Java Gui Spiele- und Multimedia-Programmierung 2
D Java sound pulseaudio Spiele- und Multimedia-Programmierung 0
David Schwarzbeck Java 3 dimensionale Kollisions Abfrage Spiele- und Multimedia-Programmierung 2
M Gesellschaftsspiel Mühle in Java programmieren Spiele- und Multimedia-Programmierung 3
beatles Java Minesweeper - OS X und Win7 Unterschied Spiele- und Multimedia-Programmierung 2
D Minecraft Java JDK installiert - Minecraft läuft nichtmehr in 64 Bit Spiele- und Multimedia-Programmierung 2
E TMX - Dateien in Java laden Spiele- und Multimedia-Programmierung 1
K Erstellen eines Fotoalbums mit Java Spiele- und Multimedia-Programmierung 8
windl MoviePlayer in Java Spiele- und Multimedia-Programmierung 0
S 2D-Render Probleme LWJGL 2 (Java) Spiele- und Multimedia-Programmierung 1
F Klausurersatz: Ein Java-Programm erstellen und dieses präsentieren. Spiele- und Multimedia-Programmierung 2
E Java Jump and Run Map zu groß Spiele- und Multimedia-Programmierung 14
P java lwjgl Game Spiele- und Multimedia-Programmierung 0
J programm mit java-plugin Spiele- und Multimedia-Programmierung 2
D Java Webgame, welche Frameworks oder Techs sind von Nöten? Spiele- und Multimedia-Programmierung 5
P Java 2D Bug? Spiele- und Multimedia-Programmierung 8
T Problem mit Eclipse (java)-(minecraft) Spiele- und Multimedia-Programmierung 3
R Java App sendet Midi Daten über Flash Spiele- und Multimedia-Programmierung 3
O Java Zeile aus Textdatei zufällig ausgeben Spiele- und Multimedia-Programmierung 8
K Bestes Bildformat für Spielegrafiken und deren Einbindung in Java Spiele- und Multimedia-Programmierung 2
D JAVA Basiertes Spiel aus dem Internet in eigenem Client laden Spiele- und Multimedia-Programmierung 1
T Alle Referenzen zu einer Klasse aus Java Bytecode ersetzt, JVM sucht trotzdem diese Klasse Spiele- und Multimedia-Programmierung 1
J Java Kollisionsabfrage Spiele- und Multimedia-Programmierung 21
Flo. android java tastatureingaben abfangen. Spiele- und Multimedia-Programmierung 1
J Java Steuerberechnung hilfe Spiele- und Multimedia-Programmierung 17
C Export als .jar funktioniert nicht richtig (JAVA 3D) Spiele- und Multimedia-Programmierung 5
P Java Grafiken mit Rechnungen verknüpfen Spiele- und Multimedia-Programmierung 4
U Minecraft Mit Java auf Minecraft Server anmelden Spiele- und Multimedia-Programmierung 11
F Das sag mir einer Java ist plattform unabhänig ! Spiele- und Multimedia-Programmierung 10
C virtueller stereomix (java sound API) Spiele- und Multimedia-Programmierung 0
S Engine2D - Java 2D Engine Spiele- und Multimedia-Programmierung 20
J Java Game performance Probleme Spiele- und Multimedia-Programmierung 7
C Java Kollisionserkennung Spiele- und Multimedia-Programmierung 4
U Blender in Java Spiele- und Multimedia-Programmierung 8
J Java Fussballspiel Player-KI in der Bewegungsphase Spiele- und Multimedia-Programmierung 4
K Java 15/Slide/Boss Puzzle Spiele- und Multimedia-Programmierung 2
T Java 3D - Step oder IGES Spiele- und Multimedia-Programmierung 1
H 3D Spiele mit Java - Diskussion Spiele- und Multimedia-Programmierung 35
X Kleines Problem mit Java Reflections und einem eigenen Eventhandler Spiele- und Multimedia-Programmierung 1
M Bilder in Java Spiele- und Multimedia-Programmierung 7
A Minecraft Java Ubuntu Minecraft Server startet nicht - ERROR (SIGSEGV) Spiele- und Multimedia-Programmierung 7
N Minecraft java lernen minecraft Spiele- und Multimedia-Programmierung 20

Ähnliche Java Themen

Neue Themen


Oben