Pregunta

Impulsores de rendimiento ya implementados: - Obtener una imagen compatible de GraphicsConfiguration para dibujar en - Habilitar canalización de OpenGL en 1.5: no es posible debido a artefactos graves

Hasta ahora estoy bien, el principal cuello de botella perfilado del programa es dibujar una imagen con varios miles de fichas. Desafortunadamente no es regular, de lo contrario simplemente podría establecer píxeles y escalarlos. Acreje la imagen con VolatileImages y sus propias rutinas de renderización (ignore repintar y dibuje ella misma con un temporizador). El resultado fue agradable y sería suficiente, PERO: La elección de un JMenu que se desplaza normalmente sobre la parte de la imagen se ve gravemente afectada porque el JMenu está sobregirado. Inaceptable y el diseño no se pudo cambiar.

Probé el GLJPanel de JOGL, pero no hay una mejora visible en el rendimiento. Entonces, ¿existe la posibilidad de usar VolatileImages (u otros componentes ligeros accelerados como GLCanvas) y aún así obtener una visualización normal de JMenu y, de ser así, cómo?

¿Fue útil?

Solución

Puedes intentar configurar las ventanas emergentes como no ligeras. No estoy muy seguro de si funciona, pero podría hacerlo, porque la ventana emergente es un componente nativo y no estará sobregirada. Configuración de ventanas emergentes a peso pesado: JPopupMenu.setDefaultLightWeightPopupEnabled (falso)

Más información: Mezcla de componentes pesados ??y livianos

Otros consejos

Aquí hay un código de ejemplo:

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());
        }
    }
}

Cambie el tamaño de la ventana para que el JMenuBar sea visible. Intenta seleccionar un punto del menú. ¿Ver?

Bueno, no estoy seguro si entiendo completamente su problema, pero parece que el problema principal es volver a pintar el panel donde se muestra la imagen. ¿Debe indicar su rutina de dibujo que dibuja la imagen en el panel?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top