Hallo,
Langsam aber sicher bin ich am Ende mit meinem Latein. Vielleicht hat ja hier jemand ne Idee...
ToDo:
Der Bildschirminhalt, by default ca. 320x240 Pixel, wird in einem Byte Array 50mal pro Sekunde aktualisiert. Aus diesem Byte Array soll möglichst effizient ein Bild aus nur 16 Farben erzeugt werden. Dieses Bild soll auf ein JLabel gezeichnet und bei Bedarf mit diesem skaliert werden.
Bislang:
Ich erzeuge ein ColorModel:
Daraus erzeuge ich ein BufferedImage:
Dieses wird an eine Instanz einer anderen Klasse übergeben, die es dann zeichnet:
Das funktioniert soweit auch. Leider ist aber die Skalierung höllisch ineffizient. An ein Hochskalieren auf übliche Bildschirmauflösungen ist nicht zu denken. Ich hatte es zuvor auch schon ohne BufferedImages versucht. Hier schien mir zwar das Skalieren an sich effizienter, aber leider nach wie vor zu langsam.
Die Interpolationsmethode ist ganz nett, hat aber keinen Einfluss auf die Performance (also bilinear is genauso lahm wie bikubisch).
Jetzt stellt sich mir langsam die Frage, ob und wie ich Java noch dazu bringen könnte, den Vorgang etwas zu beschleunigen. Muss doch möglich sein, ein Bild aus 16 Farben 50mal in der Sekunde neu zu zeichnen und ggf. zu skalieren...
Langsam aber sicher bin ich am Ende mit meinem Latein. Vielleicht hat ja hier jemand ne Idee...
ToDo:
Der Bildschirminhalt, by default ca. 320x240 Pixel, wird in einem Byte Array 50mal pro Sekunde aktualisiert. Aus diesem Byte Array soll möglichst effizient ein Bild aus nur 16 Farben erzeugt werden. Dieses Bild soll auf ein JLabel gezeichnet und bei Bedarf mit diesem skaliert werden.
Bislang:
Ich erzeuge ein ColorModel:
Code:
private static ColorModel generateColorModel(int type) {
byte[] r = new byte[16];
byte[] g = new byte[16];
byte[] b = new byte[16];
...
return new IndexColorModel(4, 16, r, g, b, Transparency.OPAQUE);
}
Daraus erzeuge ich ein BufferedImage:
Code:
buffer = new DataBufferByte(content, __screen_width * __screen_height);
raster = Raster.createPackedRaster(buffer, __screen_width, __screen_height, 8, new Point(0,0));
img = new BufferedImage(colorModel, raster, false, null);
Dieses wird an eine Instanz einer anderen Klasse übergeben, die es dann zeichnet:
Code:
public class Display extends JLabel {
private BufferedImage img;
private int __frame_width;
private int __frame_height;
public void paint (Graphics g) {
Graphics2D g2d = (Graphics2D)g;
__frame_width = this.getWidth();
__frame_height = this.getHeight();
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2d.drawImage(img, 0, 0, __frame_width, __frame_height, Color.black, null);
}
}
Das funktioniert soweit auch. Leider ist aber die Skalierung höllisch ineffizient. An ein Hochskalieren auf übliche Bildschirmauflösungen ist nicht zu denken. Ich hatte es zuvor auch schon ohne BufferedImages versucht. Hier schien mir zwar das Skalieren an sich effizienter, aber leider nach wie vor zu langsam.
Die Interpolationsmethode ist ganz nett, hat aber keinen Einfluss auf die Performance (also bilinear is genauso lahm wie bikubisch).
Jetzt stellt sich mir langsam die Frage, ob und wie ich Java noch dazu bringen könnte, den Vorgang etwas zu beschleunigen. Muss doch möglich sein, ein Bild aus 16 Farben 50mal in der Sekunde neu zu zeichnen und ggf. zu skalieren...