2014-01-26 3 views
2

Я работаю над программой java, которая рисует сложные фрактальные фигуры на экране и позволяет пользователю «приближать» и перемещаться, чтобы исследовать эти фигуры. Это означает, что необходимо вычислить, чтобы отобразить фрактал и что должна быть достигнута определенная частота кадров (около 20 кадров в секунду или более).Java2D vs Javafx Canvas performance

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

Во-первых, я думаю, что можно было использовать пустой Image (BufferedImage, в частности), и это Graphics2D контекст, чтобы нарисовать фрактал закадровый, а затем передать его в пользовательский интерфейс, который рисует его на экран. Это означало бы создание большого количества типов изображений, которые, как я полагаю, являются дорогостоящими.

Аналогичным вариантом будет создание двух изображений, а затем чередование между рисунком на втором, показывая первый, и наоборот. Будет ли этот метод лучше работать?

Мой третий вариант заключается в том, чтобы пойти с API холста javafx и использовать Canvas вместо Image, в то же время делая то же самое (внешний экран).

Что даст мне лучший результат? Или есть что-то еще, что я должен рассмотреть?

Благодаря

ответ

2

Я написал (не анимационные) фрактальный генератор в JavaFX. Я использовал WritableImage и звонил в setColor на своем PixelWriter. Я создал WritableImage в задаче и возвратил изображение из метода вызова Task; то я просто обновил изображение ImageView с сгенерированным изображением. Другим вариантом было бы сгенерировать цвета в Задаче, как массив из int или байтов, и скопировать их в массив в один WritableImage, вызвав один из методов setPixels(). Я думаю, что любой из них будет работать очень хорошо.

Как я понимаю, Canvas в JavaFX кэширует свои команды рисования, а затем выполняет их все при визуализации; Я не думаю, что это тоже сработает. Но я могу ошибаться.

+0

Знаете ли вы, что лучше иметь два WritableImages, которые я передаю между Задачей и пользовательским интерфейсом, а не всегда повторно создавая экземпляр? – Olivier

+1

Я сомневаюсь, что это будет иметь значение. Я думаю, что стоимость создания WritableImage совершенно ничтожно по сравнению с затратами на вычисление данных пикселя. Если бы он работал лучше, тогда я думаю, что использование одного WritableImage и позволить вычислить Task массив из ints или bytes будет работать одинаково хорошо и, вероятно, сохранит код чище. Вам может потребоваться просто экспериментировать ... –

+0

Ну, вы используете задачу, поэтому поток GUI должен синхронизироваться с потоком, который выполнил задачу: он может долго ждать (достаточно, чтобы быть видимым), он может сделать задержки анимации или быть нелинейными (иногда быстрая, иногда медленная). Я думаю, что лучше использовать Canvas, потому что результат будет более плавным. – zenbeni