2015-09-06 75 views
0

我正在开发一个轻量级图形API,以满足不同需求,我希望在显示图像之前呈现图像。我已经覆盖了AWT的组件以获得最高的性能。但是,如果我在paint方法中渲染图像(画线,矩形&东西),则在用户频繁调用方法时(例如正在调整窗口大小或正在播放动画),用户可以看到绘制过程, ,这是一个相当重要的性能解决方案。在Java AWT中绘制单个像素的最快方法图形

我决定缓存和分离渲染图像,并简单地将像素复制到paint方法中的图形对象。但是现在我不知道如何绘制一个像素到Graphics对象。我想下层的Sun实现有这样的方法,但我不应该讲这个类。我知道Graphics类声明了几个看起来很轻量级的方法(drawLine,drawRect,fillRect等),可以用来绘制一个像素,但我不知道哪一个最快。

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

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

预先感谢您。

回答

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 
} 
} 

玩这个周围,这是很简单的,告诉我,如果你想要一些评论中无论你怎么称呼你的画法

+0

,你可以在X通,y坐标,然后做g.drawRect(XCOORD ,YCOORD,1,1); –

相关问题