我有一个mandlebrot程序,它将mandlebrot分形绘制到屏幕上。我有一个显示计算速度的计时器,范围从0到10毫秒。我有一个draw(Graphics2D g)方法,它将2维像素数组绘制到屏幕上。计时器显示绘制方法大约需要100毫秒,随着变焦增加,逐渐增加到大约700毫秒。不断调用draw方法,而只在移动或放大mandlebrot时调用mandlebrot计算方法。继承我绘制方法的代码:
public void draw(Graphics2D g) {
// col and row pixel positions of the pixel being drawn
// The if statements check if the point is in the mandlebrot set
// I added a 3 dimensional array just so it could store the color number, and 0 or 1 if it's in the mandlebrot set
// g.drawLine() draws the pixel at it's location
for(int col = 0; col < 640; col++) {
for(int row = 0; row < 480; row++) {
if(Mandlebrot.pixels[col][row][0] == 1) {
g.setColor(new Color(Mandlebrot.pixels[col][row][1]));
g.drawLine(col, row, col, row);
} else {
g.setColor(Color.BLACK);
g.drawLine(col, row, col, row);
}
}
}
}
我认为BufferedImage可能会更快,但是当我尝试它时,我得到了一些奇怪的屏幕gltiches。我也在考虑尝试让多个线程同时呈现屏幕的一部分。因此,可能有1个线程从(0,0)到(100,100)绘制像素,而另一个线程从(0,100)到(100,200)绘制像素,依此类推。有没有更好的方法来做到这一点,并且肯定是由draw方法引起的滞后?还是还有其他阻碍它的东西?当调用计算方法时,程序启动大约10个线程来计算屏幕的某些部分,这会提高性能。线程完成后终止。
这是当前程序的一个可运行的jar: http://www.mediafire.com/download/uh93231z71q27y1/Mandlebrot.jar
答案 0 :(得分:1)
drawline方法相当昂贵,最好使用BufferedImage,并调用
image.setRGB(int x, int y, int rgb)
表示您需要绘制的所有像素
编辑:正如有人想看到我所说的指标,这是我在我的代码执行非常相似的应用程序中所花费的时间(循环遍历表示像素的数组,并用颜色绘制每个像素)。每个时间都以毫秒为单位,使用System.currentTimeMillis();
使用graphics.drawLine:
Time : 71
Time : 66
Time : 71
Time : 66
Time : 68
Time : 66
Time : 68
Time : 68
Time : 69
Time : 65
Time : 67
Time : 68
Time : 75
with image.setRGB:
Time : 58
Time : 44
Time : 43
Time : 41
Time : 45
Time : 45
Time : 45
Time : 45
Time : 44
Time : 45
Time : 46
Time : 45
Time : 45