在Java AWT Graphics

时间:2015-09-06 09:46:40

标签: java performance graphics awt

我正在开发一个轻量级图形API,以满足不同的需求,我希望在显示之前渲染图像。我已经覆盖了AWT的组件以获得最高的性能。但是,如果我在paint方法中渲染图像(绘制线条,矩形和东西),如果经常调用该方法(例如,窗口正在调整大小,或者动画正在播放),这是一个非常有效的解决方案。

我决定分离缓存和渲染图像,只需将像素复制到paint方法中的Graphics对象即可。但现在我不知道如何将单个像素绘制到Graphics对象。我认为Sun的底层实现有这样的方法,但我不应该解决这个问题。我知道Graphics类声明了几个方法(drawLinedrawRectfillRect等),这些方法看起来很轻,只能用于绘制一个像素,但我不知道哪一个将是最快的。

由于某些内存问题,我不想使用BufferedImage,因此drawImage在这种情况下不是解决方案。在this question中也不是这样的情况,因为我再次使用Images并且我没有在paint方法中创建新实例(渲染图像数据类仅在调整组件大小时更改)。

tl; dr :java.awt.Graphics中最快的方法,通过坐标将某个像素的颜色设置为指定颜色(java.awt.Color或RGB,最后首选)。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果您觉得需要立即调用repaint()并使paintComponent(Graphics g)停止。玩这个我今天早上做的。 包宠物;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import javax.swing.*;


public class pet extends JPanel implements MouseListener{
public static JFrame frame = new JFrame("frame");
public pet() throws IOException{
 setPreferredSize(new Dimension(870, 675));         //configuring panel
 addMouseListener(this);
}
public static void main(String[] args) throws IOException{
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JComponent newContentPane = new pet();
    newContentPane.setOpaque(true);
    frame.setContentPane(newContentPane);
    frame.pack();
    frame.setVisible(true);
    frame.addMouseListener(new pet());
}
public void paintRectangleAtPoint(Graphics g, int x, int y){
g.setColor(Color.BLACK);
g.drawRect(x, y, 100,100);
}
public void paintStuff(Graphics g, int x, int y){
g.setColor(Color.BLACK);
g.drawRect(x, y, 100,100);
}
@Override
public void mouseClicked(MouseEvent e) {
paintStuff(frame.getGraphics(),e.getX(), e.getY());
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
 public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
}

玩这个,它非常简单,告诉我你是否想要一些评论