Pixel-Rendering/Animation Performance in BufferedImage

chpn

Neues Mitglied
Hallo,

für den beigefügten Code versuche ich eine möglichst hohe Performance zu erreichen. Gibt es Alternativen für BufferedImage oder Canvas, die mir diesbezüglich helfen würden? Wäre beispielsweise ein JComponent der Canvas vorzuziehen? Oder evtl auf JavaFX umzusteigen?

Ich bin für jegliche Anregungen und Tipps dankbar!

Gruß,

Sven


Java:
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java.awt.Canvas;
import java.awt.Graphics;
import java.util.Random;

import javax.swing.JFrame;

public class Main extends Canvas implements Runnable {

  public static final int WIDTH = 1280;
  public static final int HEIGHT = 800;

  private int xstart;
  private int ystart;
  private int xend;
  private int yend;

  private int xPos;
  private int yPos;

  private Thread thread;
  private boolean isRunning = false;
  private BufferedImage img;
  private int[] pixels;

  private int[] cells;
  private Random r;

  public Main() {
    img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

    pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
    r = new Random();
    cells = new int[pixels.length];

    for (int i = 0; i < cells.length; i++) {
      int num = r.nextInt(2);
      if (num == 0) {
        cells[i] = 0;
      } else if (num == 1) {
        cells[i] = 1;
      }
    }
    addMouseMotionListener(new MouseMotionListener() {
      public void mouseDragged(MouseEvent e) {
        xPos = e.getX();
        yPos = e.getY();
      }

      public void mouseMoved(MouseEvent e) {
      }
    });

    addMouseListener(new MouseListener() {
      public void mouseClicked(MouseEvent e) {
        xPos = e.getX();
        yPos = e.getY();

      }

      public void mousePressed(MouseEvent e) {
        xPos = e.getX();
        yPos = e.getY();

      }

      public void mouseReleased(MouseEvent e) {
        xPos = e.getX();
        yPos = e.getY();
      }

      public void mouseEntered(MouseEvent e) {
      }

      public void mouseExited(MouseEvent e) {
      }
    });
    xPos = WIDTH / 2;
    yPos = HEIGHT / 2;

    xstart = xPos - 300;
    ystart = yPos - 300;
    xend = xPos + 300;
    yend = yPos + 300;
  }

  @Override
  public void run() {
    while (isRunning) {
      render();
    }
  }

  private void start() {
    if (isRunning)
      return;
    isRunning = true;
    thread = new Thread(this);
    thread.start();
  }

  private void stop() {
    if (!isRunning)
      return;
    isRunning = false;
    try {
      thread.join();
    } catch (Exception e) {
      e.printStackTrace();
      System.exit(0);
    }
  }

  private void render() {

    xstart = xPos - 100;
    ystart = yPos - 100;
    xend = xPos + 100;
    yend = yPos + 100;

    if (xstart < 0)
      xstart = 0;
    if (xstart > WIDTH)
      xstart = WIDTH;
    if (ystart < 0)
      ystart = 0;
    if (ystart > HEIGHT)
      ystart = HEIGHT;
    if (xend < 0)
      xend = 0;
    if (xend > WIDTH)
      xend = WIDTH;
    if (yend < 0)
      yend = 0;
    if (yend > HEIGHT)
      yend = HEIGHT;

    BufferStrategy bs = this.getBufferStrategy();
    if (bs == null) {
      createBufferStrategy(3);
      return;
    }
    int[] nextCells = new int[cells.length];
    for (int i = 0; i < cells.length; i++) {
      nextCells[i] = cells[i];
    }

    for (int y = ystart + 1; y < yend - 1; y++) {
      for (int x = xstart + 1; x < xend - 1; x++) {
        int index = x + y * WIDTH;
        int neighbours = 0;
        for (int j = -1; j <= 1; j++) {
          for (int i = -1; i <= 1; i++) {

            neighbours += cells[(x + i) + (y + j) * WIDTH];
          }
        }
        neighbours-=cells[index];
        
        if ((cells[index] == 1) && (neighbours < 2))
          nextCells[index] = 0;
        else if ((cells[index] == 1) && (neighbours > 3))
          nextCells[index] = 0;
        else if ((cells[index] == 0) && (neighbours == 3))
          nextCells[index] = 1;
        else
          nextCells[index] = cells[index];

      }
    }

    for (int i = 0; i < cells.length; i++) {
      if (nextCells[i] == 0) {
        pixels[i] = 0x000000;
      }
      if (nextCells[i] == 1) {
        pixels[i] = 0xffffff;
      }
      cells[i] = nextCells[i];
    }

    Graphics g = bs.getDrawGraphics();
    g.drawImage(img, 0, 0, WIDTH, HEIGHT, null);
    g.dispose();
    bs.show();
  }

  public static void main(String[] args) {
    Main main = new Main();
    JFrame frame = new JFrame();
    frame.add(main);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(WIDTH, HEIGHT);
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);
    frame.setVisible(true);
    main.start();
  }
}
 

Bananabert

Bekanntes Mitglied
Die Pixel einzeln setzen ist eher schlecht. Dadurch können die Bilder meist nicht optimiert werden und werden mit der CPU dargestellt.
Ich habe immer Canvas mit Volatile Images benutzt und mit createCompatibleVolatileImage die Images erstellt.
Damit kam ich bei 60 bewegenden Bildern auf über 2000 Bilder pro Sekunde.

Ansonsten kann ich dir nur empfehlen dich in eine fertige Engine einzuarbeiten. Wie zum Beispiel LWJGL, JMonkeyEngine oder Slick2D.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
TheSepp Fenster um x Pixel bewegen, wenn man auf dem Knopf drückt AWT, Swing, JavaFX & SWT 10
N Swing GridBagLayout: Ein Pixel Versatz AWT, Swing, JavaFX & SWT 2
D Swing Farbe aus Pixel vom JFrame auslesen AWT, Swing, JavaFX & SWT 17
M Wie ermittele ich die Breite und Höhe meines Displays in Pixel AWT, Swing, JavaFX & SWT 3
TheWhiteShadow Swing Document Text Position in Pixel AWT, Swing, JavaFX & SWT 2
U Pixel zeichnen AWT, Swing, JavaFX & SWT 2
S Pixel im *.Gif ändern AWT, Swing, JavaFX & SWT 2
C AWT: Pixel für Pixel Linien auf Panel zeichnen AWT, Swing, JavaFX & SWT 2
D Pixel in ein Array einlesen AWT, Swing, JavaFX & SWT 2
H Einzelne Pixel auf Transparenz überprüfen? AWT, Swing, JavaFX & SWT 3
F png-Datei erstellen und einzelne Pixel schreiben AWT, Swing, JavaFX & SWT 2
I JScrollPane, wenn JLabels x Pixel erreichen AWT, Swing, JavaFX & SWT 3
K Fontgröße in Pixel angeben AWT, Swing, JavaFX & SWT 5
G Pixel ablaufartig verändern AWT, Swing, JavaFX & SWT 5
R Pixel zeichnen AWT, Swing, JavaFX & SWT 9
D Wie viele Pixel welches Icon? AWT, Swing, JavaFX & SWT 4
B Bild(pixel) füllen AWT, Swing, JavaFX & SWT 6
N Alle Pixel-Koordinaten von z.B. g.drawLine(.) speichern AWT, Swing, JavaFX & SWT 7
B Länge eines Strings in Pixel AWT, Swing, JavaFX & SWT 2
G Buggeredimage & pixel HUE/RGB AWT, Swing, JavaFX & SWT 17
D Zeichen ein Pixel mit Java2D AWT, Swing, JavaFX & SWT 15
T Pixel OS abhängig AWT, Swing, JavaFX & SWT 3
T jedes Pixel aus dem Image (auf dem Panel) auslesen AWT, Swing, JavaFX & SWT 3
N Laenge eines Strings in Pixel AWT, Swing, JavaFX & SWT 2
M Farbe eines Pixel im Image ändern AWT, Swing, JavaFX & SWT 1
Luma Bild Pixel für Pixel auslesen? AWT, Swing, JavaFX & SWT 3
H Pixel zeichnen AWT, Swing, JavaFX & SWT 6
F Pixel Farbe auslesen AWT, Swing, JavaFX & SWT 3
C Image-Pixel manipulieren AWT, Swing, JavaFX & SWT 9
T Pixel nach Farbwert abfragen AWT, Swing, JavaFX & SWT 2
I Anderes (schlechteres) Font-Rendering in OpenJDK 8 AWT, Swing, JavaFX & SWT 21
J JavaFX Rendering von Canvas sehr langsam AWT, Swing, JavaFX & SWT 2
O 3D-Grafik OpenGL CubeMaps - Skybox Rendering AWT, Swing, JavaFX & SWT 0
ToBJo JavaFX Rendering beschleunigen AWT, Swing, JavaFX & SWT 3
Luk10 g.drawString funktioniert nicht + Frage zur Text-Rendering Qualität AWT, Swing, JavaFX & SWT 7
J AWT Artefakte bei AWT-Rendering durch parallelen Thread AWT, Swing, JavaFX & SWT 4
P Animation läuft nicht korrekt AWT, Swing, JavaFX & SWT 8
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
DeBoiJoshua 2D-Grafik Gif Animation will nicht laden AWT, Swing, JavaFX & SWT 1
S JavaFX WebView zeigt keine Animation AWT, Swing, JavaFX & SWT 5
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Ruckelfreie Animation AWT, Swing, JavaFX & SWT 20
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
F JavaFX Timeline Animation soll X- und Y-Position während Animation ändern AWT, Swing, JavaFX & SWT 2
javampir 2D-Grafik Effizienz bei animation AWT, Swing, JavaFX & SWT 0
wolfgang63 JavaFX Animation, Kreise im vorgegebem Takt durchs Fenster laufen lassen AWT, Swing, JavaFX & SWT 3
P Ansatz für 2D Animation gesucht AWT, Swing, JavaFX & SWT 2
Thallius HHübsche Kopier Animation? AWT, Swing, JavaFX & SWT 5
L JPanel kleine "Animation" AWT, Swing, JavaFX & SWT 7
E Animation läuft nicht mehr flüssig AWT, Swing, JavaFX & SWT 8
E Warum macht die einfache Animation einen kleinen Fehler? AWT, Swing, JavaFX & SWT 14
B 2D-Grafik Dynamisches Erstellen von Images und deren Animation AWT, Swing, JavaFX & SWT 4
R Swing Komponenten bleiben bei Animation unsichtbar AWT, Swing, JavaFX & SWT 7
J GIF Animation AWT, Swing, JavaFX & SWT 2
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
R Swing Animation mit JLayeredPane? AWT, Swing, JavaFX & SWT 8
K 3D-Grafik Animation AWT, Swing, JavaFX & SWT 4
U Gif Animation mit JLabel AWT, Swing, JavaFX & SWT 3
P KeyListener + Animation AWT, Swing, JavaFX & SWT 2
D 2D-Grafik Animation flackert AWT, Swing, JavaFX & SWT 8
R Polygon-Animation mit Darstellungsfehlern AWT, Swing, JavaFX & SWT 5
StupidAttack Animation, JComponent AWT, Swing, JavaFX & SWT 3
S SWT Rudimentäre Bild Animation AWT, Swing, JavaFX & SWT 3
C Animation auf einem JPanel AWT, Swing, JavaFX & SWT 3
A paintComponent() - Animation AWT, Swing, JavaFX & SWT 2
S Ich brauche eine Idee: Animation mit teil eines Bildes AWT, Swing, JavaFX & SWT 16
H "Animation" AWT, Swing, JavaFX & SWT 2
S Animation korrekt darstellen AWT, Swing, JavaFX & SWT 8
Developer_X Nach Animation Button adden AWT, Swing, JavaFX & SWT 3
Developer_X Swing JPanel-THE ANIMATION AWT, Swing, JavaFX & SWT 3
T JFrame und Scale-Animation AWT, Swing, JavaFX & SWT 8
M Animation berechnen AWT, Swing, JavaFX & SWT 4
M Animation auf JPanel per Knopfdruck AWT, Swing, JavaFX & SWT 12
P Problem bei Animation AWT, Swing, JavaFX & SWT 2
K Animation auf GUI AWT, Swing, JavaFX & SWT 3
R ruckelfreie animation AWT, Swing, JavaFX & SWT 8
T Animation will nicht trotz Thread. AWT, Swing, JavaFX & SWT 14
S animation Flackern trotz doppelpufferung wieso? AWT, Swing, JavaFX & SWT 2
S Animation geht nicht AWT, Swing, JavaFX & SWT 3
m@nu Animation in GlassPane: Performanceeinbruch JFrame maximiert AWT, Swing, JavaFX & SWT 17
rudi.schraml Animation von Robotern auf FactoryFloor - repaint()? AWT, Swing, JavaFX & SWT 7
J Animation - Runnable AWT, Swing, JavaFX & SWT 3
O Animation in einem JPanel AWT, Swing, JavaFX & SWT 2
H Animation startet nicht/ Thread AWT, Swing, JavaFX & SWT 6
N Animation nach einem bestimmten Ereignis starten lassen? AWT, Swing, JavaFX & SWT 4
A Problem mit Animation AWT, Swing, JavaFX & SWT 4
M Animation mit Keylistener AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben