有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing使用java中的StdDraw有没有办法更快地进入屏幕?

我正在使用来自https://introcs.cs.princeton.edu/java/stdlib/StdDraw.java的StdDraw库。据我所知,它只是实现了一个简单的界面,用于使用JFrame绘制屏幕

在我的实现中,我只是有一个2d像素阵列,我画的每个像素都是这样的:

StdDraw.clear()
for (int y = 0; y < Engine.HEIGHT; y += 1) {
    for (int x = 0; x < Engine.WIDTH; x += 1) {
        map[x][y].draw((float) x / Engine.WIDTH, (float) y / Engine.HEIGHT);
    }
}

然而,这是非常缓慢的。就像疯狂的慢。更不用说每次我想更新的时候都要重新绘制整个屏幕

我清除屏幕,然后重新绘制每个像素。这是不可能的,但我真的不知道该去哪里找。一些关于我应该注意什么的建议真的很有帮助


共 (1) 个答案

  1. # 1 楼答案

    这不是最终的答案,而是将一些可测量的代码放到桌面上的一种方式BufferedImage是一个不错的选择,但在我不太快的系统上作为参考,这段代码需要5秒来绘制4000万像素,即每百万像素125毫秒。你有多少像素?!?这段代码使用对line的调用作为绘制单像素的代理,因为该类不提供单像素绘制,但从理论上讲,像您这样绘制实际像素的代码应该更快

    你的map是哪门课

    有多少像素

    什么时间是“疯狂的慢”

    public class SandBox {
    
    
        public static void main (String [] args) {
    
            boolean [] [] map = new boolean [1000] [1000];
            for (int i = 0; i < 1000; i++) {
                for (int j = 0; j < 1000; j++) {
                    map [i] [j] = true;
                }
            }
            JFrame myFrame = new JFrame ();
            myFrame.setSize (1100, 1100);
            SPanel myPanel = new SPanel ();
            myPanel.myMap = map;
            myFrame.add (myPanel);
            myFrame.setVisible (true);
        }
    
    } // class SandBox
    
    
    class SPanel extends JPanel {
    
        public boolean [] [] myMap;
    
    
        @Override
        public void paintComponent (Graphics g) {
            g.drawString ("Hello", 30, 30);
            Instant start = Instant.now ();
            for (int i = 0; i < 10; i++) {
                g.setColor (new Color (0, 0, 0));
                drawMap (g);
                g.setColor (new Color (255, 0, 0));
                drawMap (g);
                g.setColor (new Color (0, 255, 0));
                drawMap (g);
                g.setColor (new Color (0, 0, 255));
                drawMap (g);
            }
            reportElapsed (start);
            g.drawRect (50, 50, 1000, 1000);
        }
    
    
        void drawMap (Graphics g) {
            for (int i = 0; i < 1000; i++) {
                for (int j = 0; j < 1000; j++) {
                    if (myMap [i] [j] == true) {
                        g.drawLine (i + 50, j + 50, i + 50, j + 50);
                    }
                }
            }
        }
    
    
        private static void reportElapsed (Instant start) {
            Duration elapsed = Duration.between (start, Instant.now ());
            long millis = elapsed.toMillis ();
            System.out.println ("Duration (ms):  " + millis + ".");
        } // reportElapsed
    
    
    } // class SPanel