Я пытаюсь реализовать многопоточность с помощью Callable / Future в моем Raytracer, разделяя процесс по каждой строке / столбцу.Для этого мне нужно передать переменные из моего Main в Callable, который не принимает аргументы.
Я попытался передать всю функцию как вызываемую
Это функция, которую я пытаюсь использовать в многопоточном режиме,'formen' - моя группа объектов, которые я передаю.Отправка лучей и нахождение пересечений - это то, что требует наибольшей вычислительной мощности -
static Image raytrace(Camera camera, Group formen, int samples){
Image image = new Image(camera.width, camera.height);
for (int x = 0; x != camera.width; x++) {
for (int y = 0; y != camera.height; y++) {
Vec3 color = new Vec3(0, 0, 0);
for (int xi = 0; xi < samples; xi++) {
for (int yi = 0; yi < samples; yi++) {
double rx = random.nextDouble();
double ry = random.nextDouble();
double xs = x + (xi + rx) / samples;
double ys = y + (yi + ry) / samples;
Ray ray = camera.sendRay(xs,ys);
Hit hit = formen.intersect(ray);
if(hit != null) color = Vec3.add(color, calculateRadiance(formen, ray, 100));
}
}
color = Vec3.divide(color, Math.pow(samples, 2));
image.setPixel(x, y, color);
}
}
return image;
}
Вот как выглядит моя функция трассировки:
int cores = Runtime.getRuntime().availableProcessors();
Thread[] threads = new Thread[cores];
Image[] images = new Image[cores];
// Pool creation
ExecutorService pool = Executors.newFixedThreadPool(4);
//images[core] = raytrace(camera, scene, nn);
for(int i = 0; i < camera.height; i++){
Future<Image> pixel = pool.submit(calculateOneRow);
//threads[i].start();
System.out.println("Thread started:");
pool.shutdown();
try {
System.out.println("Image written");
return pixel.get();
//Image color = pixel.get();
} catch (ExecutionException e) {
e.printStackTrace();
}
final long duration = (System.nanoTime() - startTime) / 1000000;
return image;
}
Думаю, внутренний цикл for должен войти в моюМожет быть вызван, но я не знаю, как передать их каждому как отдельную задачу.Моя цель - уменьшить время рендеринга.