2016-04-01 2 views
0

У меня есть простой метод, который записывает пиксели на холст 'GrapicConte2D. Int [] - pixelarray получает рандомизированный каждый кадр и обновляется с помощью метода PixelWriters setPixels().Slow laggy Javafx-Performance на Retina Display

У меня есть монитор с двумя мониторами, «обычный» экран и сетчатая сетчатая сетчатка. При перетаскивании рамки приложения на мой «обычный» экран все работает очень хорошо для меня. Но поместив его на дисплеи Retina MacBooks, он становится очень лаги.

Я действительно не знаю, что пошло не так. Я проверял свой код несколько раз, но, похоже, я не могу с собой поделать.

Буду очень признателен за каждый совет, который может мне помочь.

Благодаря

Код:

public class CanvasTest extends Application { 
    @Override 
    public void start(Stage primaryStage) throws Exception { 
     Random random = new Random(); 
     BorderPane root = new BorderPane(); 

     ScrollPane scrollPane = new ScrollPane(); 

     Canvas canvas = new Canvas(1280, 800); 
     GraphicsContext gc = canvas.getGraphicsContext2D(); 
     PixelWriter writer = gc.getPixelWriter(); 
     PixelFormat format = PixelFormat.getIntArgbInstance(); 

     int[] pixels = new int[(int) (canvas.getWidth() * canvas.getHeight())]; 



     scrollPane.setContent(canvas); 

     AnimationTimer timer = new AnimationTimer() { 
      @Override 
      public void handle(long now) { 
       for (int i = 0; i < pixels.length; i++) { 
        pixels[i] = (255 << 24) | random.nextInt(0xffffff); 
       } 


       writer.setPixels(0, 0, (int) canvas.getWidth(), (int) canvas.getHeight(), 
         format, pixels, 0, (int) canvas.getWidth()); 
      } 
     }; 

     root.setCenter(scrollPane); 
     primaryStage.setScene(new Scene(root,1280,800)); 
     primaryStage.show(); 

     timer.start(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+1

Можете ли вы разместить часть своего кода? Это поможет нам помочь вам. –

+0

Спасибо за ваш ответ. Я опубликовал отрывок из моего кода, но я не уверен, помогает ли он, это очень просто. Это происходит в конструкторе Canvas. И мой холст оформлен в BorderPane .. – Adam

+0

Ну, я предполагаю, что ваш сетчатый дисплей имеет очень высокое разрешение, поэтому этот код будет работать медленнее обычного дисплея. И в зависимости от того, как часто ваш метод handle() вызывается AnimationTimer, тогда это может начать очень сильно отставать. Особенно учитывая 3 вызова Random.nextInt(), которые происходят для каждого пикселя, каждый кадр. Это куча обработки, проходящая там. – ManoDestra

ответ

1

Мое предположение, что ваш дисплей Retina имеет больше пикселов всего и более высокую плотность пикселей и, следовательно, больше вычислений должны быть сделаны за один кадр. Если вы не используете GraphicsContext2D, я бы посмотрел OpenGL.

Если вы все еще хотите использовать GraphicsContext2D, я бы взял меньше образцов случайности, чтобы сделать его менее лагги. Вместо того, чтобы находить случайное значение для каждого пикселя, вы можете найти случайное значение для каждого другого пикселя и просто установить соседние пиксели на этот цвет. Это выглядело бы немного хуже, но это уменьшило бы отставание. Опять же, OpenGL использует рендеринг графического процессора и будет намного быстрее.

Попробуйте вместо этого:

for (int y = 0; y < height; y+=2) { 
    for (int x = 0; x < width; x+=2) { 
     int i = x + y * width; 
     screen[i] = (255 << 24) | (random.nextInt(256) << 16) | (random.nextInt(256) << 8) | random.nextInt(256); 
     screen[i+1] = screen[i]; // The pixel just to the right of the current one 
     screen[i+width] = screen[i]; // The pixel just below the current one 
     screen[i+width+1] = screen[i]; // The pixel one to the right and one below this one 
    } 
} 

Примечание: Это будет работать только тогда, когда ширина и высота делится на 2. Поэтому в данном случае, с большим количеством пикселей, гораздо проще в использовании вместо этого GPU.

+0

Спасибо, Джермей, за ваш ответ. Это хорошая идея, но я думаю, что моя проблема заключается не в том, что пиксели рендеринга, а в моем неэффективном использовании компонентов.Взгляните на мой обновленный код. Я думаю, это из-за scrollPane. Это замедляет мое приложение, когда я загружаю в него холст. – Adam

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