【问题标题】:Quickest method to paint a single pixel in Java AWT Graphics在 Java AWT Graphics 中绘制单个像素的最快方法
【发布时间】:2015-12-02 00:50:34
【问题描述】:

我正在开发一个轻量级的图形 API,以满足不同的需求,我想在图像显示之前对其进行渲染。我已经覆盖了 AWT 的组件以获得最高性能。但是,如果我在paint 方法中渲染图像(绘制线条、矩形和其他东西),如果该方法被频繁调用(例如,正在调整窗口大小或正在播放动画,则用户可以看到绘画过程)播放),这是一个非常注重性能的解决方案。

我决定单独缓存和渲染图像,并简单地将像素复制到 paint 方法中的 Graphics 对象。但现在我不知道如何将单个像素绘制到 Graphics 对象。我想底层的 Sun 实现有这样的方法,但我不应该解决那个类。我知道 Graphics 类声明了几个方法(drawLinedrawRectfillRect 等),这些方法看起来很轻量级,只能用于绘制一个像素,但我不知道哪个最快。

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

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

提前谢谢你。

【问题讨论】:

    标签: java performance graphics awt


    【解决方案1】:

    如果您觉得需要调用 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
    }
    }
    

    试试这个,很简单,如果你想要一些评论告诉我

    【讨论】:

    • 无论你调用什么绘画方法,你都可以传入 x,y 坐标,然后执行 g.drawRect(xCoord,yCoord,1,1);
    猜你喜欢
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2017-05-08
    • 1970-01-01
    相关资源
    最近更新 更多