Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

arko

Frischling

  • »arko« ist der Autor dieses Themas
  • Private Nachricht senden

1

01.11.2011, 18:20

Performance-Probleme mit Java AWT: Graphics2D.drawImage()

hi leute,

ich programmier ein spiel. auf der suche nach mehr performance hab ich nun zahlreiche buffer erzeugt, die z.t auch recht groß sind (4000x4000 pixel). da ich aber beim konkreten rendern nur noch diese buffer kopieren muss sollte das eigentlich klar gehen. nun gibt es auch eine zoom-funktion. ich zoome rein, lösche den inhalt des buffers (immerhin schon 29 ms, kann man sicher noch drücken), schreibe den neuen inhalt rein (stolze 12 ms!) und kopiere das dann auf den buffer den ich am anfang mit getBufferStrategy erzeugt habe.
nun bekomme ich das folgende merkwürdige verhalten: nach dem löschen dauert der nächste kopiervorgang (wohlgemerkt: nur kopieren, nix skalieren o.ä.) 300-400 ms! die nächsten 1-2 durchläufe sind dann ebenfalls grottenlangsam, bevor ich wieder auf 15µs herunter komme. da das ja hardware-beschleunigt sein sollte ist eigentlich nur der zweite wert wirklich realistisch.
messen tu ich direkt vor und nach der folgenden zeile:
g.drawImage(image, vs.boardOffsetX, vs.boardOffsetY, null);
g ist die Graphics2D die ich von der strategy bekomme, die offsets integerwerte. nun würde man natürlich denken es liegt an image:

GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice device = env.getDefaultScreenDevice();
GraphicsConfiguration config = device.getDefaultConfiguration();
image = config.createCompatibleImage(width, height,Transparency.TRANSLUCENT);

also ein BufferedImage. Wenn ich versuche das zu beschleunigen und ein volatileimage nehme bricht die performance völlig in den keller, hardwarebeschleunigung kann ich da nicht erzwingen. schade. trotzdem: was zur hölle geht da vor sich? ich hab mich schon durch die ganzen jre-flags gewühlt (ddforcevram=true,ddscale=true,...), aber es ist kein bisschen schneller als vorher. was zur hölle?!?!?!

danke für eure hilfe!

arko

Frischling

  • »arko« ist der Autor dieses Themas
  • Private Nachricht senden

2

03.11.2011, 15:46

Falls jemand ähnliche Probleme haben sollte: So ganz genau hab ich nicht verstanden was dieses komische Verhalten verursacht hat, nehme aber mal einfach dass es mit der Hardwarebeschleunigung zu tun hat, die man ja nur indirekt beeinflussen kann. Ich hab das Problem nicht gelöst, sondern umschifft indem ich die Größe der Buffer reduziert habe. Ein bisschen enttäuschend, weil so Dinger eigentlich immer sehr interessant sind, aber nun gut: Es läuft, und das recht schnell.

3

03.11.2011, 16:19

Wie kopierst du denn die Daten und warum hast du so große Buffer? Vor allem verstehe ich nicht so recht warum du nicht direkt in den Buffer zeichnest. Schau dir mal hier an wie Double Buffering mit Java2D gelöst wird: http://content.gpwiki.org/index.php/Java…ouble_Buffering

Wenn du arge Performance-Probleme bekommst, solltest du dir mal Slick anschauen, das besitzt eine bessere GPU Unterstützung als Java2D.

Falls du bei Java2D bleiben willst schau dir mal http://www.jhlabs.com/ip/managed_images.html an. Der Artikel ist vor allem relevant, wenn du auch Pixel abfragst.

arko

Frischling

  • »arko« ist der Autor dieses Themas
  • Private Nachricht senden

4

06.11.2011, 11:31

Die Ansicht ändert sich nur marginal von frame zu frame. Also Puffer ich sich nicht verändernde Teile und zeichne den Rest Frame für Frame. So rein theoretisch sollte das kein Problem darstellen, vorausgesetzt die Hardwarebeschleunigung lässt mich nicht im Stich.

Aber danke für die beiden Tipps, Slick hört sich gut an!

Werbeanzeige