Devilmarkus Geschrieben 2. Juli 2012 Geschrieben 2. Juli 2012 (bearbeitet) Hallo Zusammen, ich befasse mich momentan mit der Emulation der CRT Bildröhre. Dazu verwende ich JOGL und pinsel das Bild auf eine riesige Kugel mit einer Texturgrösse von 1024x1024 Pixeln. (Die eigentliche Bild-Source ist allerdings nur 768x544 Pixel gross) Nun würde ich gerne wissen, ob man mit Graphics2D auch solch ein Bild derartig verzerren kann: (Zum Vergrössern draufklicken) JOGL ist zwar ganz nett, allerdings bin ich mit der Framerate noch sehr unzufrieden, die bei ~20-30 fps herumdümpelt... (50 sollen es sein) Gibt es also eine Routine, mit der man ein Bild so "abrunden" kann? Achtung! Die Ecken müssen nicht abgerundet werden! Das ist hier eine draufgezeichnete Maske! Normal laufen die Ecken auch spitz zusammen. Bearbeitet 2. Juli 2012 von Devilmarkus
flashpixx Geschrieben 2. Juli 2012 Geschrieben 2. Juli 2012 Also ich denke, dass Du von der Graphikseite schon eine recht gute Anbindung hast. Ist halt OpenGL das wird sehr performant sein
Devilmarkus Geschrieben 2. Juli 2012 Autor Geschrieben 2. Juli 2012 Ja das OpenGL sicherlich. Das "Textur-Updaten" 50x pro Sekunde nur leider nicht... Im BufferedImage kann ich pixels[] verwenden, um so schnell Bildbereiche zu füllen. In der Textur leider nicht. Da muss ich leider jedesmal "DrawImage(image,x,y,w,h);" verwenden, was wesentlich langsamer ist.
flashpixx Geschrieben 3. Juli 2012 Geschrieben 3. Juli 2012 Man kann die Textur in den Speicher der GraLaden und direkt darauf verweisen bzw. direkt auch Shader verwenden. Dies hat aber nichts mit Java zu tun sondern ist genereller Bestandteil von OpenGL
Devilmarkus Geschrieben 3. Juli 2012 Autor Geschrieben 3. Juli 2012 Nun, ich habe die Routine "Texture zeichnen" auch auf pixels[] umgestellt. Das geht etwas schneller, als g.DrawImage. public void update(final int[] sourcepixels, final boolean usemask) { if (!ispainted) { if (DEBUG) { System.out.println("skipping " + frame++); } Display.painted = true; return; } ispainted = false; SwingUtilities.invokeLater(new Runnable() { public void run() { try{ frame = 0; imageoffset = startoff; for (y = 0; y < (halfsize ? 272 : 544); y++) { System.arraycopy(sourcepixels, 768 * y * (halfsize ? 2 : 1), pixels, imageoffset, 768); imageoffset += (texsizeX); } raster.setDataElements(0, 0, texsizeX, texsizeY, pixels); imagecomponent.set(display); } catch (Exception e){} ispainted = true; Display.painted = true; } }); } InvokeLater, damit wird es "smoother". Ist aber immernoch nicht das Gelbe vom Ei. Bei der kleinen Texturgrösse (1024x512) habe ich locker 50fps, allerdings fehlen hier ein paar Details. Bei der Grossen habe ich ~40fps. "Skipped frames" habe ich übrigens keine!
flashpixx Geschrieben 3. Juli 2012 Geschrieben 3. Juli 2012 der CPU übernimmt bei Dir das erzeugen und zeichnen und das ist nun mal langsam. Nimm einen Shader und lade die Textur in den Speicher der GraKa.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden