Я пытаюсь нарисовать треугольник, не имеющий нескольких потоков, каждый поток будет рисовать независимую часть треугольника. Но он работает намного медленнее, чем использование только одного потока. В чем проблема?почему java multithread не ускоряет графическую программу
вот код:
(...)
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;
}
}
}
Поскольку потоки не делают волшебства и не добавляют лишние расходы. Измерьте все, если хотите знать, каков эффект потоков. – zapl
Можете ли вы для обеспечения полного запускаемого примера, который демонстрирует вашу проблему ...? – MadProgrammer
Интересный вопрос: почему вы внедряете z-буферизацию вручную, когда ваша видеокарта уже имеет реализацию, которая намного быстрее, чем ваш процессор может когда-либо быть? OpenGL вполне способен отображать буфер вне экрана, и для вас есть несколько различных библиотек интерфейса Java/OpenGL. – Jules