Frage

Bereits implementiert Performance-Booster: - Holen Sie kompatibel Bild von GraphicsConfiguration auf zeichnen - Aktivieren Sie OpenGL-Pipeline in 1.5: Nicht möglich aufgrund schwerer Artefakte

Bisher bin ich in Ordnung, das Hauptprofil Engpass des Programms wird ein Bild mit mehreren tausend Fliesen zeichnen. Leider ist es nicht regelmäßig, sonst konnte ich einfach Pixel eingestellt und skalieren. Ich accerelated das Bild mit VolatileImages und eigenen Rendering-Routinen (ignore neu aufgebaut und es mich mit einem Timer ziehen). Das Ergebnis war erfreulich und würde genügen, ABER: Die Wahl eines JMenu, die normalerweise über den Teil des Bildes schwebt ist stark gestört, weil die JMenu überzogen ist. Inacceptable und das Layout nicht geändert werden.

Ich habe versucht, die GLJPanel von JOGL, aber es gibt keine sichtbare Performance-Verbesserung. So gibt es eine possibitlity verwenden VolatileImages (oder andere accerelated lightweighted Komponenten wie GLCanvas) und noch normal JMenu Anzeige erhalten und wenn ja, wie?

War es hilfreich?

Lösung

Sie könnten versuchen, die Pop-ups nicht-leightweight einzustellen. Ich bin mir nicht ganz sicher, ob es funktioniert, aber es könnte, weil das Popup eine native Komponente ist dann und wird nicht überzogen werden. Popups Einstellung zum Schwergewicht: JPopupMenu.setDefaultLightWeightPopupEnabled (false)

Weitere Informationen: Mischen schweren und leichten Komponenten

Andere Tipps

Hier ist ein Beispiel-Code:

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.VolatileImage;
import java.io.File;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

public final class FastDraw extends JFrame {

    private static final transient double NANO = 1.0e-9;
    private BufferStrategy bs;
    private BufferedImage frontImg;
    private BufferedImage backImg;
    private int PIC_WIDTH,
    PIC_HEIGHT;
    private Timer timer;

    public FastDraw() {
        timer = new Timer(true);
        JMenu menu = new JMenu("Dummy");
        menu.add(new JMenuItem("Display me !"));
        menu.add(new JMenuItem("Display me, too !"));
        JMenuBar menuBar = new JMenuBar();
        menuBar.add(menu);
        setJMenuBar(menuBar);
        setIgnoreRepaint(true);
        setVisible(true);

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
                super.windowClosing(evt);
                timer.cancel();
                dispose();
                System.exit(0);
            }
        });

        try {
            backImg = javax.imageio.ImageIO.read(new File(<insert a jpg picture here>));
            frontImg = javax.imageio.ImageIO.read(<here, too>));
        }
        catch (IOException e) {
            System.out.println(e.getMessage());
        }

        PIC_WIDTH = backImg.getWidth();
        PIC_HEIGHT = backImg.getHeight();
        setSize(PIC_WIDTH, PIC_HEIGHT);

        createBufferStrategy(1); // Double buffering
        bs = getBufferStrategy();
        timer.schedule(new Drawer(),0,20);

    }

    public static void main(String[] args) {
        new FastDraw();
    }

    private class Drawer extends TimerTask {
        private VolatileImage img;

        public void run() {
            long begin = System.nanoTime();
            Graphics2D  g  = (Graphics2D) bs.getDrawGraphics();
            GraphicsConfiguration gc = g.getDeviceConfiguration();

            if (img == null)
                img = gc.createCompatibleVolatileImage(PIC_WIDTH, PIC_HEIGHT);

            Graphics2D g2 = img.createGraphics();

            do {
                int valStatus = img.validate(gc);

                if (valStatus == VolatileImage.IMAGE_OK)
                    g2.drawImage(backImg,0,0,null);
                else {
                    g.drawImage(frontImg, 0, 0, null);
                }
                // volatile image is ready
                g.drawImage(img,0,50,null);
                bs.show();
            } while (img.contentsLost());
        }
    }
}

Ändern Sie die Größe des Fensters der JMenuBar sichtbar zu machen. Versuchen Sie, einen Menüpunkt auszuwählen. Siehst du?

Nun, ich bin nicht sicher, ob ich das Problem vollständig verstehen, aber es scheint, dass Hauptproblem ist das Panel mit Neulackierung wo Bild angezeigt wird. Sollten Sie bitte Ihre Zeichnung Routine schaffen, das Bild auf Platte zieht?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top