我使用的是来自https://introcs.cs.princeton.edu/java/stdlib/StdDraw.java的StdDraw库。据我所知,它只是使用JFrame实现了一个简单的界面来绘制屏幕。
在我的实现中,我只有一个二维像素数组,并且我像这样绘制每个像素:
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);
}
}然而,这是非常慢的。就像慢得发疯。更不用说每次我想要更新整个屏幕时都要重新绘制整个屏幕。
我清除屏幕,然后重新绘制每个像素。这不可能是它应该是如何工作的,但我真的不知道该去哪里看。关于我应该注意的一些建议将会非常有帮助!
发布于 2021-06-29 23:05:38
这不是最终的答案,而是一种将一些可测量的代码放在桌面上的方法。使用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 SPanelhttps://stackoverflow.com/questions/67421961
复制相似问题