Страницы

Поиск по вопросам

пятница, 9 ноября 2018 г.

Рисование в java

Доброго времени суток уважаемые коллеги, интересует следующее - есть ли в java ( или каких либо библиотеках, расширениях и т.д., не суть важна ), возможность рисовать, например как на javascript'e на canvas'e... Если такая возможность есть - поделитесь пожалуйста ссылками на книги, статьи и т.д. Так-же, если вас не затруднит, не отказался бы от примерчика ( конечно-же если код небольшой ).
Интересует именно самостоятельное приложение, так-же интересует, опять таки если это возможно :), соизмеримо ли это по скорости, хотя-бы с webgl... PS: так-же интересно - есть ли какая-либо возможность взаимодействия с ресурсами видеокарты... PPS: пока кроме JavaFX ничего в голову не лезет... Но это, мягко говоря, не то... Заранее спасибо, понять и разобраться очень важно - выручайте :)


Ответ

Я не понимаю о чём вы говорите и никак не понимаю, почему речь сразу зашла про OpenGL? Вопрос поставлен есть ли в java (...) возможность рисовать, например как на javascript'e на canvas'e... Разумеется, есть. Это называется Java2D. И никаких библиотек не требует. Если же речь действительно про OpenGL, то есть JOGL. JOGL - это просто враппер, который просто объявляет почти все OpenGL-функции. Соответственно, они будут иметь такое же именование и прототипы функций аналогиченые оригинальным. По поводу ресурсов видеокарты, то тут всё зависит от того, с какими ключами запущена виртуальная машина. Можно сделать так, чтобы она не использовала ничего и тогда она будет иметь возможность рисовать изображения даже без видеокарты и иксов. Или можно включить использование DirectX или OpenGL (на юниксах, разумеется, только второе) и тогда аппаратное ускорение будет использоваться для ускорения рисования 2D. Что же до 3D, то насколько мне известно, использовать можно всё то же, что и обычно можно делать на OpenGL, но работает это немного медленнее. Однако, это не будет большой проблемой, если не использовать старые OpenGL-функции. Надо экономить вызовы нативных методов. UPD Сравнивать их производительности просто смешно. Не думаете же вы, что javascript + canvas имеют какие-то серьёзные шансы против Java2D? Но думаю, такие сравнения кто-нибудь уже проводил, можно поискать. Я уж не говрою о том, что возможности у канваса, мягко говоря ограниченные. С другой стороны, весьма вероятно, что вам ничего особенного и не нужно. Если надо нарисовать пару линий и пару квадратов, то может и не стоит заваривать кашу. Вот вам краткий пример использования Java2D.. уж извините, но что-то воображение у меня к ночи не очень, так что пусть будет флаг import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File;
public class Main { public static void main(String[] args) throws Exception { BufferedImage img = new BufferedImage(320, 240, BufferedImage.TYPE_3BYTE_BGR); Graphics2D g2d = img.createGraphics();
try { g2d.setColor(Color.WHITE); g2d.fillRect(0, 0, 320, 240);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HBGR); g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2d.setColor(Color.BLUE); g2d.setStroke(new BasicStroke(30.f));
g2d.drawLine(0, 0, 320, 240); g2d.drawLine(0, 240, 320, 0);
g2d.setColor(Color.GREEN); g2d.setFont(new Font("Arial", Font.PLAIN, 25));
g2d.drawString("1712", 130, 60); } finally { g2d.dispose(); }
ImageIO.write(img, "PNG", new File("test.png")); } } test.png: UPD2 На самом деле, если подумать, то HTML-Canvas + JavaScript имеют шансы на каких-то простых вещах. Скорее всего разница будет просто напросто незаметна, пока не начнёте рисовать что-то грандиозное. Так что если вы думаете делать какой-нибудь апплет, чтобы нарисовать кружок с точкой, то не стоит этого делать :)) UPD3 В Java есть ещё ряд преимуществ, которые приходят в голову, если смотреть задачу вроде той, что вы описываете (что-то похожее на какую-то игру или карту, как я понимаю). Главное - простота занесения внешних картинок из ресурсов и возможность кэширования некоторых частей нарисованного, что может быть очень полезно, когда рисовать надо много и часто. У кансваса с этим будут проблемы. Непомерные числа, о которых вы говорите скорее говорят не о проблемах со средством рисования, а о проблеме с тем, как вы рисуете. Очевидно, что если пропускной способности чего-либо не хватает, то это значит, что надо уменьшить численность каким-то образом. Слияние/объединение, фильтрация, отсечение и т.п. помогут уменьшить количество элементов до приемлемой величины. Думаю, вам надо поинтересоваться методами в компьютерной графике и геймдевом, в частности. UPD4 И последнее: если захотите использовать мой пример, чтобы что-то потестить, то имейте в виду, что: включение антиалисингов и пр. замедляет рисование в разы рисование в картинку, которая не на экране может быть намного медленнее, чем рисование на экран, так как при рисовании в BufferedImage аппаратное ускорение часто недоступно в полной мере или вообще.

Комментариев нет:

Отправить комментарий