문제

이미 구현 된 Performance Boosters : - Graphics Configuration의 호환 이미지 가져 오기 - 1.5의 OpenGL 파이프 라인 활성화 : 심각한 아티팩트로 인해 불가능합니다.

지금까지는 괜찮습니다. 프로그램의 주요 프로파일 링 된 병목 현상은 수천 개의 타일이있는 이미지를 그리는 것입니다. 불행히도 그것은 규칙적이지 않습니다. 그렇지 않으면 단순히 픽셀을 설정하고 확장 할 수 있습니다. 나는 휘발성 이유와 자신의 렌더링 루틴으로 이미지를 축적했습니다 (리 페인트를 무시하고 타이머로 자체적으로 그려냅니다). 그 결과는 기뻤고 충분할 것입니다. 그러나 : Jmenu가 과잉으로 인출되어 이미지의 일부를 상대로 전형적으로 호버링하는 jmenu를 선택하는 것은 심각하게 방해됩니다. 용납 할 수없고 레이아웃을 변경할 수 없었습니다.

나는 Jogl의 Gljpanel을 시도했지만 눈에 띄는 성능 개선은 없습니다. 따라서 휘발성 이유물 (또는 Glcanvas와 같은 다른 축적 된 경량 구성 요소)을 사용하고 여전히 정상적인 jmenu 디스플레이를 얻을 수있는 가능성이 있습니까?

도움이 되었습니까?

해결책

팝업을 비 외형 중량으로 설정하려고 시도 할 수 있습니다. 팝업이 기본 구성 요소이고 과도하지 않기 때문에 작동하는지 확실하지 않지만 가능합니다. 헤비급으로 팝업 설정 : jpopupmenu.setDefaultLightWeightPopUpenabled (false)

추가 정보: 무겁고 가벼운 구성 요소를 혼합합니다

다른 팁

다음은 몇 가지 예제 코드입니다.

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

창을 조정하여 JMenuBar 보이는. 메뉴 포인트를 선택하십시오. 보다?

글쎄, 나는 당신의 문제를 완전히 이해하는지 확실하지 않지만 주요 문제는 이미지가 표시되는 패널을 다시 칠하는 것 같습니다. 패널에서 이미지를 그리는 드로잉 루틴을 제공해야합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top