这不是最终的答案,而是一种将一些可衡量的代码放在桌面上的方法。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