AlexXYZ
@AlexXYZ
O Keep Clear O

java custom gradient

Здравствуйте, уважаемые пользователи habrahabr.

Захотел я написать собственный gradient в java (JRE 1.6.29, Eclipse, Windows, awt). Написал, только очень он меня огорчает. Тупит и очень даже сильно. Даже на небольшом квадратике — 300ms на один paint — много. Посмотрел я исходные коды, например, линейного градиента. Увидел там своеобразное «кеширование». Но, чтобы не пороть горячку решил я просто скопировать реализацию исходных кодов LinearGradientPaint под другим именем, скажем, LinearGradientPaint_test (вместе с классами LinearGradientPaintContext -> LinearGradientPaintContext_test, MultipleLinearGradient_test, MultipleLinearGradientContext_test). Но вот что удивительно: простое копирование исходного кода от линейного градиента… дало теже тормоза, что и у моего градиента!!!

вопрос:

Можно ли как-то ускорить рисование пользовательского градиента? или может кто знает, почему так тормозит пользовательский градиент?
  • Вопрос задан
  • 3001 просмотр
Пригласить эксперта
Ответы на вопрос 1
AlexXYZ
@AlexXYZ Автор вопроса
O Keep Clear O
Есть некоторая информация на эту тему. Я связался с человеком, поддерживающим сайт:

http://www.jhlabs.com/index.html

он ответил:

The problem is that Java doesn't actually use the source for these gradients but instead has a special optimised version (I think running on the GPU). It detects if the gradient is an instance of one of the built in gradients and then switches to this special code, so the code in the gradient classes is never actually run.

В вольном переводе:

Java не использует оригинальный код, представленный в исходниках, а вместо него имеет оптимизированную версию (которая, по-моему, выполняется на GPU). Java определяет, если градиент является «встроенным», то переключается на специальный код, поэтому код в его классах градиента на самом деле никогда не выполняется.

Я на это тоже обратил внимание, что дебаггер ещё останавливается на конструкторе LinearGradient, а вот на функции fillRaster уже не останавливается.

Маленький бонус (в инете очень мало пособий, объясняющих, как создавать градиентные заливки):

Пример градиента без наворотов:
asserttrue.blogspot.com/2010/01/how-to-iimplement-custom-paint-in-50.html
Пример конусного градиента (с кешированием, иначе вообще тупит):
www.jug-muenster.de/java2d-conical-gradient-paint-674/

Больше ничего не нашёл. Если кто найдёт — киньте ссылку, буду очень благодарен.

Мною замечено яркое применение нестандартной заливки в продукте Adobe Illustrator (сетчатый градиент). Шустро работает. Хороший пример сетчатого градиента:
Нос совы: www.digitalartsonline.co.uk/tutorials/?featureid=3221873&pn=2
Огонь спички (требуется авторизация): demiart.ru/forum/index.php?showtopic=172676

Линейная и радиальная градиентные заливки там тоже отличаются от стандартных заливок, но не сильно. Фотошоп в пример не привожу, потому что он использует свои заливки исключительно как растровые фильтры (кстати, в свете вышеизложенного становится понятно, почему они так долго отрисовываются).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы