gpt4 book ai didi

java - 为什么java多线程不能加速图形程序

转载 作者:太空宇宙 更新时间:2023-11-04 07:05:20 25 4
gpt4 key购买 nike

我正在尝试使用多个线程绘制一个三角形,每个线程将绘制三角形的一个独立部分。但它的运行速度比仅使用一个线程慢得多。有什么问题吗?

这是代码:

    (...)
int nCores = Runtime.getRuntime().availableProcessors();
Thread[] threads = new Thread[nCores];
int width = box[1][0] - box[0][0];
int incr = width / nCores;
int x = box[0][0];
for (int i = 0; i < nCores; i++) {
threads[i] = new Thread(new TriFiller(x, x + incr, z - nx * incr
* i));
threads[i].start();
x += incr;
}
try {
for (int i = 0; i < nCores; i++)
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

和可运行的:

public class TriFiller implements Runnable {
int xi, xf;
double z;

public TriFiller(int xi, int xf, double z) {
super();
this.xi = xi;
this.xf = xf;
this.z = z;
}

@Override
public void run() {
boolean inOut = false;
double z0 = z;
int rgbColor = shade.getRGB();
BufferedImage image = wd.getImage();
for (int i = xi; i < xf; i++) {
for (int j = box[0][1]; j < box[1][1]; j++) {
if (isOnSet(i, j, polyNormals, intBuffer)
&& z < zBuffer[i][j] && z > zd) {
image.setRGB(i, j, rgbColor);
zBuffer[i][j] = z;
inOut = true;
} else {
if (inOut) {
break;
}
}
z += -ny;
}
z0 += -nx;
z = z0;
inOut = false;
}
}
}

最佳答案

您遇到麻烦的原因是, Swing 绘画不适用于多线程。阅读另一个摘录 forum (jfree.org) :

“我认为您没有看到任何性能改进的原因是您没有通过分离另一个线程来引入任何并行性。

在 Swing 中更新屏幕的方式本质上是:

1) 一旦组件决定在屏幕上重新绘制它,就会调用 JComponent.repaint()。这会导致异步重绘请求发送到 RepaintManager,后者使用 invokeLater() 在 EDT 上对 Runnable 进行排队。

2) 当 Runnable 执行时,它会调用 RepaintManager,后者会调用 Component 上的 PaintImmediately()。然后,该组件设置剪辑矩形并调用paint(),最终调用您已覆盖的paintComponent()。请记住,屏幕已锁定,并将保持锁定状态,直到组件完全重新绘制脏矩形。

分出线程来生成图像缓冲区是没有意义的,因为 RepaintManager 必须阻塞,直到缓冲区准备好,这样它才能在释放屏幕上的锁之前完成脏矩形的更新。

swing 支持的所有工具包(windows、linux、mac)在设计上都是单线程的。不可能同时更新屏幕的多个区域。”

关于java - 为什么java多线程不能加速图形程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21492118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com