Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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:

crt_emulated_thumb.png

(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 von Devilmarkus

  • Autor

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.

  • Autor

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!

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.