不明白为什么重新拍摄这么慢

时间:2012-08-21 01:57:35

标签: java eclipse performance jpanel repaint

编辑:

我在这里做同样的事情,但问题不会发生。

    import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;


public class MainFrame extends JFrame implements KeyListener {
static long start;
MyPanel right, left;
    public MainFrame() {

    }

    public void go(){
        setUndecorated(true);
        setLocation(0, 0);
        Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setSize(screenSize);
        addKeyListener(this);
        setLayout(new GridLayout(1,0));

        Border b = BorderFactory.createLineBorder(Color.black, 4);
        Border b1 = BorderFactory.createLineBorder(Color.blue, 4);
        right = new MyPanel();
        left = new MyPanel();
        right.setBorder(b); left.setBorder(b1);

        add(left);add(right);


        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }


    public void update() {
        left.update();
        right.update();
}

    @Override
    public void keyPressed(KeyEvent arg0) {
        if (arg0.getKeyCode() == KeyEvent.VK_ESCAPE)
            System.exit(1);
        else if (arg0.getKeyCode() == KeyEvent.VK_RIGHT){
            start = System.currentTimeMillis();
            update();
        }

    }



    @Override
    public void keyReleased(KeyEvent arg0) {}

    @Override
    public void keyTyped(KeyEvent arg0) {}

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MainFrame().go();
            }
        });

    }

}
import java.awt.Graphics;

import javax.swing.JPanel;


public class MyPanel extends JPanel {
    MyPanel(){
        super();
    }
    public void update(){
        repaint();
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        System.out.println(System.currentTimeMillis() -  MainFrame.start);
    }


}

首先,我想说我已经准备好了一些例子,假设显示我的问题,但问题没有出现在这个示例代码中,它只在原始程序中。我知道阅读起来很糟糕,但它会有很大的帮助,因为问题在特定的地方,你不需要了解其余的代码,甚至只需要修改几行。

  1. GlowneOkno是一个主要的方法,可以启动它。
  2. Glowne okno是KeyListener,它扩展了JFrame,它包含3个扩展的JPanel:MapaPanel,InfoLiniaPanel,KursPanel。
  3. 当你在键盘上按“向右箭头”时,它假设运行akutalizuj(这意味着更新)方法,在这3个扩展JPanel中调用akutalizuj方法(更新方法)。在那些方法中有repaint()调用。
  4. 我在GlowneOkno类中使用静态长启动来查看方法GlowneOkno:Aktualizuj的调用时间,然后我在InfoLiniaKurs的paint method()中println(currentTime - GlowneOkno.start)(这是显示时间的那个 - >你会看到)。 而且这个间隔很慢,它是如此之慢,我不知道为什么,如果我阻止方法akutalizuj Mapa Panel
  5. 我知道这是我要问的重要事情,但这是第五天我找不到理由而且我无法形成问题并将所有应该知道的事情放在那里而不给所有项目Eclipse和我还有5个小时。

    该计划适用于1680 x 1050

    版权所有Robert Kilar 2012; )但如果​​你想以某种方式使用它只是问我。我很乐意帮忙。

    主要的主要是GlowneOkno类。

    ESC关闭应用程序。

    enter image description here

1 个答案:

答案 0 :(得分:4)

仔细查看重新绘制所需的每个步骤。

  1. InfoLinePane需要呈现文字和时间。虽然这本身并不是一个困难的过程,但您可以考虑将其中的一部分卸载到缓冲的图像中,因为让我们面对它,只有时间会发生变化。当其他细节发生变化时,您可以使缓冲区无效并再次重新绘制它。
  2. 您再次更新InfoLinePane ......?
  3. 您将地图名称分配给mapaPanel,而不考虑是否需要更改
  4. 您加载地图。你缩放所说的地图。您可以更改地图面板的首选大小以匹配缩放图像的大小
  5. 您缩放地图(再次)
  6. 你画站停。我很确定停止不会改变那个匹配,你应该考虑缓冲这个结果。除非时间实际发生了变化,否则更新进度条可能毫无意义。
  7. 图像加载和缩放很昂贵。如果内存允许,您应该考虑缓存这些结果。缩放最好在后台实现。使用低质量进行缩放以将高质量标度开始并卸载到单独的thread

    考虑实际发生了什么变化。将(通常)不会改变的所有内容渲染为缓冲区。