jmenus를 방해하지 않고 Java *의 2D 이미지를 가속화
-
05-07-2019 - |
문제
이미 구현 된 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
보이는. 메뉴 포인트를 선택하십시오. 보다?
글쎄, 나는 당신의 문제를 완전히 이해하는지 확실하지 않지만 주요 문제는 이미지가 표시되는 패널을 다시 칠하는 것 같습니다. 패널에서 이미지를 그리는 드로잉 루틴을 제공해야합니까?