2014-01-31 2 views
1

Я пытаюсь нарисовать треугольник, не имеющий нескольких потоков, каждый поток будет рисовать независимую часть треугольника. Но он работает намного медленнее, чем использование только одного потока. В чем проблема?почему 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; 
     } 
    } 
} 
+1

Поскольку потоки не делают волшебства и не добавляют лишние расходы. Измерьте все, если хотите знать, каков эффект потоков. – zapl

+0

Можете ли вы для обеспечения полного запускаемого примера, который демонстрирует вашу проблему ...? – MadProgrammer

+0

Интересный вопрос: почему вы внедряете z-буферизацию вручную, когда ваша видеокарта уже имеет реализацию, которая намного быстрее, чем ваш процессор может когда-либо быть? OpenGL вполне способен отображать буфер вне экрана, и для вас есть несколько различных библиотек интерфейса Java/OpenGL. – Jules

ответ

0

Причина у вас возникли проблемы в том, что свинг картина не работает с многопоточной. Прочитайте этот отрывок из другого forum (jfree.org):

«Я думаю, что причина того, что вы не видите какие-либо улучшений производительности является то, что вы не введением какого-либо parrallelism на спиннинг с другим потока

Путь обновления экрана работает в Swing. по существу:

1) Как только компонент решает, что он должен быть перекрашен на экран, вызывается JComponent.repaint(). Это приводит к отправке асинхронного запроса перерисовки в RepaintManager, который использует invokeLater() для очереди Runnable на EDT.

2) Когда Runnable выполняет, он вызывает RepaintManager, который вызывает PaintImmediately() в компоненте. Затем компонент устанавливает прямоугольник клипа и вызывает paint(), который заканчивается вызовом paintComponent(), который вы переопределили. Помните, что экран заблокирован и останется заблокированным до тех пор, пока компонент полностью не перекрасит грязный прямоугольник.

Нет смысла выделять поток для создания буфера изображения, потому что RepaintManager должен блокироваться до тех пор, пока буфер не будет готов, чтобы он мог закончить обновление грязного прямоугольника, прежде чем отпустить блокировку на экране.

Все инструментальные средства, которые поддерживают качели (окна, linux, mac), имеют сквозную конструкцию. Невозможно одновременно обновлять несколько областей экрана. »

+1

Хотя я не сомневаюсь в ваших комментариях, OP не упоминает о Swing в частности. Я думаю, вы обнаружите, что почти все графические интерфейсы GUI имеют одинаковую проблему;) – MadProgrammer

+0

сначала я использую awt (не знаю, является ли это тем же самым, что и Swing), тогда я просто использую потоки для обновления буфера кадров, который является видом матрицы i догадываюсь (BufferedImage) – pedroth

 Смежные вопросы

  • Нет связанных вопросов^_^