Java 2D Zeichnung Optimale Leistung
Ich bin in den Prozess des Schreibens ein Java 2D Spiel. Ich bin mit dem eingebauten Java-2D-Zeichnungs-Bibliotheken, die Zeichnung auf ein Graphics2D ich erwerben von einem BufferStrategy von einer Leinwand in einem JFrame (das ist manchmal voll abgeschirmt). Die BufferStrategy ist doppelt gepuffert. Die Bildschirmaktualisierung erfolgt aktiv über einen timer. Ich habe einige performance-Probleme, obwohl, besonders unter Linux.
- Und Java2D-hat also sehr viele Möglichkeiten, um Grafiken zu erstellen-Puffer und zeichnen-Grafiken, ich weiß nur nicht, ob ich das richtige Tue. Ich habe experimentiert mit graphics2d.getDeviceConfiguration().createCompatibleVolatileImage, das sieht vielversprechend aus, aber ich habe keine wirklichen Beweis es, es wird nicht schneller, wenn ich schalten Sie die zeichnen-code.
In Ihrer Erfahrung, was ist die Schnellste Methode zum Rendern von 2D-Grafiken auf dem Bildschirm in Java 1.5+? Beachten Sie, dass das Spiel ziemlich weit vorne, so dass ich nicht wechseln wollen, um eine völlig andere Methode des Zeichnens, wie OpenGL oder eine Spiel-engine. Ich im Grunde wissen will, wie man am schnellsten mit einem Graphics2D-Objekt zu zeichnen Zeug auf dem Bildschirm.
InformationsquelleAutor der Frage Zarkonnen | 2008-09-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe die gleichen Probleme wie du, denke ich. Schauen Sie sich meinen Beitrag hier:
Java2D-Performance-Probleme
Es zeigt den Grund für den Leistungsabfall zu finden und zu beheben. Es ist nicht garantiert, um gut zu funktionieren auf allen Plattformen zwar. Sie werden sehen, warum in der post.
InformationsquelleAutor der Antwort Consty
Einer Synthese der Antworten auf diesen Beitrag, die Antworten auf Consty ist, und meine eigene Forschung:
Was funktioniert:
GraphicsConfiguration.createCompatibleImage
Abbilder erstellen, die kompatibel mit dem, was Sie gerade zeichnen. Dies ist absolut unerlässlich!Canvas.createBufferStrategy
.-Dsun.java2d.opengl=True
wo verfügbar, zu beschleunigen Zeichnung.In meinen tests, mit diesen Methoden, habe ich eine Erhöhung der Geschwindigkeit von 10x - 15x, so dass die ordnungsgemäße Java-2D-Grafik ist eine Möglichkeit.
InformationsquelleAutor der Antwort Zarkonnen
Hier sind einige Tipps aus der Spitze von meinem Kopf. Wenn Sie etwas konkreter waren und was Sie versuchen zu tun, vielleicht kann ich weiter helfen. Klingt wie ein Spiel, aber ich will nicht zu übernehmen.
Nur zeichnen, was Sie brauchen! Nicht blind den Aufruf repaint() die ganze Zeit, versuchen, einige der Geschwister wie repaint(Rect) oder repaint(x,y,w,h).
Sehr vorsichtig mit alpha-blending, wie es sein kann, eine teure operation zu mischen images /primitive.
Versuchen prerender /cache so viel wie möglich. Wenn Sie finden, sich selbst das zeichnen eines Kreises die gleiche Weise über und über, Sie zeichnen in ein BufferedImage und dann zeichnen Sie einfach ein BufferedImage. Sie opfern-Speicher für Geschwindigkeit (typisch für Spiele /hohe perf Grafiken)
Erwägen Sie die Verwendung von OpenGL, die Verwendung von JOGL LWJGL. JOGL ist mehr Java-wie in der Erwägung, dass LWJGL bietet mehr gaming-Funktionalität auf OpenGL zugreifen. OpenGL zeichnen kann, die Größenordnungen (mit der richtigen hardware und Treiber) als Schwingen kann.
InformationsquelleAutor der Antwort basszero
Es ist wichtig, die bisher noch nicht erwähnt wurde noch, denke ich: - cache-Bilder von alles, was Sie können. Wenn Sie ein Objekt über den Bildschirm bewegen, und es ist Aussehen nicht viel ändern, ziehen Sie es auf ein Bild und dann Rendern Sie das Bild auf dem Bildschirm in eine neue position jeden frame. Tun, auch wenn das Objekt ist sehr einfach - Sie werden überrascht sein, wie viel Zeit Sie sparen. Rendern von bitmap ist viel schneller als das Rendern von primitiven.
Möglicherweise möchten Sie auch zu suchen bei der Einstellung rendering-hints explizit, und deaktivieren Sie Dinge wie antialiasing, wenn die Qualität Erwägungen gestatten.
InformationsquelleAutor der Antwort DJClayworth
Ich habe einige basic-Zeichnung-Anwendungen mit Java. Ich habe nicht gearbeitet, nichts zu Grafik-intensives, aber ich würde empfehlen, dass Sie einen guten Griff auf die 'aktualisieren' Aufrufe. Eine zusätzliche repaint-Aufruf auf einem übergeordneten container könnte die doppelte Menge von dem Rendern zu tun.
InformationsquelleAutor der Antwort Brendan Cashman
Habe ich gerade diese Frage, in der Hoffnung, jemand würde Ihnen eine bessere Antwort als meine.
In der Zwischenzeit habe ich Folgendes gefunden Sun white paper, die geschrieben wurde, nachdem eine beta-Version des jdk 1.4. Es gibt einige interessante Empfehlungen hier auf der fine-tuning, einschließlich der runtime-flags (am Ende des Artikels):
"Runtime Flag Für Solaris und Linux
Beginnend mit der Beta-3-Version des SDK, version 1.4, Java 2D-speichert Bilder in pixmaps standardmäßig bei der DGA ist nicht verfügbar, egal ob Sie arbeitet in einer lokalen oder remote-display-Umgebung. Sie können dieses Verhalten außer Kraft setzen mit der pmoffscreen Flagge:
-Dsun.java2d.pmoffscreen=true/false
Wenn Sie dieses flag auf true festgelegt, die offscreen-pixmap-Unterstützung aktiviert ist, auch wenn DGA verfügbar ist. Wenn Sie dieses flag auf "false", offscreen-pixmap-Unterstützung deaktiviert ist. Deaktivieren offscreen-pixmap-Unterstützung lösen können einige rendering-Probleme. "
InformationsquelleAutor der Antwort Brendan Cashman
stellen Sie sicher, verwenden Sie die doppelte Pufferung, zuerst ziehen zu einem großen Puffer im Speicher, die Sie dann bündig mit dem Bildschirm, wenn alle Zeichnung getan.
InformationsquelleAutor der Antwort Tom
Gibt es paar Dinge, die Sie benötigen, im Auge zu behalten,
1) ist erfrischend dieser link zeigt, wie swingtimers, das könnte eine gute option für den Aufruf von repaint. Erste repaint herausgefunden (wie die vorherigen Poster gesagt haben, ist wichtig, damit du nicht tust zu viel Arbeit).
2) Stellen Sie sicher, Sie tun nur das zeichnen in einen thread. Aktualisierung UI von mehrere threads führen kann, um böse Dinge.
3) Doppelte Pufferung. Dies macht die rendering glatter. diese Website einige gute Infos für Sie
InformationsquelleAutor der Antwort Steve g
Eine alternative, wenn Sie nicht wollen, zu gehen pure Java 2D ist die Verwendung eines Spiel-Bibliothek wie GTGE oder JGame (Suche auf Google), dann bieten einen einfachen Zugang zu Grafiken und bieten außerdem ein Doppel-Pufferung und viel einfacher zeichnen-Befehle.
InformationsquelleAutor der Antwort Paul Sagor