Доброго времени суток уважаемые коллеги, интересует следующее - есть ли в 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 аппаратное ускорение часто недоступно в полной мере или вообще.
Комментариев нет:
Отправить комментарий