首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种方法可以在java中用StdDraw更快地绘制到屏幕上?

有没有一种方法可以在java中用StdDraw更快地绘制到屏幕上?
EN

Stack Overflow用户
提问于 2021-05-07 00:07:39
回答 1查看 90关注 0票数 0

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

在我的实现中,我只有一个二维像素数组,并且我像这样绘制每个像素:

代码语言:javascript
复制
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);
    }
}

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

我清除屏幕,然后重新绘制每个像素。这不可能是它应该是如何工作的,但我真的不知道该去哪里看。关于我应该注意的一些建议将会非常有帮助!

EN

回答 1

Stack Overflow用户

发布于 2021-06-29 23:05:38

这不是最终的答案,而是一种将一些可测量的代码放在桌面上的方法。使用BufferedImage是可行的,但在我的运行速度不是很快的系统上,这段代码需要5秒来绘制4000万像素,或每兆像素125毫秒。你的像素是多少?!?此代码使用对line的调用作为绘制单个像素的代理,因为该类不提供单个像素绘制,但理论上像您这样绘制实际像素的代码应该更快。

您的map是什么级别的

有多少像素?

多长时间才是“慢得发疯”?

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67421961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档