Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Обсуждение статьи об OpenGL и Java


Автор: $tatic 27.6.2007, 20:30
Если у вас есть вопросы или замечания по http://forum.vingrad.ru/forum/topic-161042/kw-opengl-java-jogl.html, пишите их здесь.

Автор: arilou 28.6.2007, 09:10
$tatic, спасибо за статью. Продолжение будет?

Автор: $tatic 30.6.2007, 19:57
Конечно. Вот сейчас я написал и отправил на форум вторую часть статьи. Прошу ее также обсудить.
Следует отметить, что для корректной работы необходимо исправить код файла Renderer.java, а именно строку
Код

gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, new float[]{0f, 0f, 1f}, 0);

на
Код

gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, new float[]{0f, 0f, 1f, 0f}, 0);

В противном случае у программы будет неопределенное поведение.
Предлагайте свои идеи будущих статей.

Автор: WTF4XZ 1.7.2007, 22:41
Статья прикольная, была бы возможность кинул плюс.
Мона ещё написать что нить про OGL3 там привьювка.... вообщем пособирать и изложить, было бы интерестно ;)

Автор: Mazzi 2.7.2007, 08:26
За статью респект!

Автор: Hidrag 2.7.2007, 09:27
Все сделал как в статье.

Теперь замечания и придирки.
В общем все отлично и все мои замечания и придирки это мелочи.

1. У тебя в примере в классе глфрэйм обьявлена  GLCanvas canvas; а потом в конструкторе снова GLCanvas canvas = new GLCanvas(); нада оставить что то одно, получается два конвала один создается второй так и висит не созданный smile хотя ошибки и нет.

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

все.

Теперь вопрос: картинка у нас статичная  - чайник, тогда почему каждый раз разные показания счетчика кадров, от чего они зависят?

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

А вообще $tatic, респект и уважуха smile такую тему поднял и развил, модераторам JAVA раздела будет теперь куда отправлять новичков с вопросами о 3D в Java.

Ждем продолжения, ты главное не останавливайся! smile 

Да и еще, в статье предлагается использовать джаву 1.6, но могу сказать что и на 1.5 данные примеры работаю на ура smile а вот с 1.4 не пошло...)))

Автор: $tatic 2.7.2007, 19:12
Большое спасибо за отклики!
Теперь рассмотрим ваши вопросы и предложения ;)

Цитата(WTF4XZ @  1.7.2007,  23:41 Найти цитируемый пост)
Мона ещё написать что нить про OGL3 там привьювка.... вообщем пособирать и изложить, было бы интерестно ;)

К сожалению по OpenGL 2.x Longs Peak и OpenGL 3.0 Mount Evans конкретной информации довольно мало даже на opengl.org. Дело в том, что ARB все еще работает над интерфейсом и пересматривает все еще раз (можно их только похвалить за это, не стремятся выпустить недоделанную спецификацию). Но даже та информация, которая уже доступна, думаю достойна скорее отдельной статьи, правда все же лучше читать это в оригинале, нежели в переводе. Тем более, к тому времени как будет готов перевод, думаю уже выйдет релиз smile

Цитата(Hidrag @  2.7.2007,  10:27 Найти цитируемый пост)
1. У тебя в примере в классе глфрэйм обьявлена  GLCanvas canvas; а потом в конструкторе снова GLCanvas canvas = new GLCanvas(); нада оставить что то одно, получается два конвала один создается второй так и висит не созданный smile хотя ошибки и нет.

Исправил (удалил объявление локальной переменной).

Цитата(Hidrag @  2.7.2007,  10:27 Найти цитируемый пост)
2. В первой статье когда предлагается впервые запустить приложение у тя написанно, что должен быть пустой черный экран - это не тру ))) видимо у всех по разному, у меня было что то похожее на шахматную доску ))) из пыльных белых и серых прямоугольников )))

Довольно оригинально smile К сожалению, точную причину этого эффекта назвать не могу. Вероятно, что в буфере видеокарты была какая-то случайная информация.

Цитата(Hidrag @  2.7.2007,  10:27 Найти цитируемый пост)
Теперь вопрос: картинка у нас статичная  - чайник, тогда почему каждый раз разные показания счетчика кадров, от чего они зависят?

Не следует забывать, что данное приложение работает на платформе Java, которая использует автоматическое управление памятью. Таким образом, во время работы программы периодически происходит отработка сборщика мусора. Вот график использования памяти за первые 30 секунд работы приложения (получен при помощи NetBeans Profiler 5.5).
user posted image
Розовым цветом показана выделенная JVM куча памяти, фиолетовым - используемая память в данный момент времени.
Как видно, виртуальная машина выделяет приложению память из кучи системы с запасом (а выделение системной памяти происходит достаточно медленно, использование заранее выделенной памяти намного эффективнее, этим и объясняется выигрыш Java перед C++ в некторых тестах). Примерно это 5 Мб.
Периодически происходит постоянное создание объектов (в частности, объекта GLUT), и когда общий объем использованной памяти доходит до ~1.8 Мб, происходит срабатывание Garbage Collector'а. Объем использованной памяти при этом падает до 1.5 Мб. Таким образом, во время периодического срабатывания GC происходит некторое снижение FPS. Однако, с течением времени текущий FPS приложения постепенно увеличивается до некоторого предела. Предположительно, это связано с работой JIT-компилятора и runtime-оптимизации приложения. Однако, это лишь мои предположения.


Цитата(Hidrag @  2.7.2007,  10:27 Найти цитируемый пост)
Еще такую особенность сейчас заметил, пока писал это у меня был запущен чайник со счетчиком, и комп подвисал немного, закрыл прогу, тормоза пропали, смею предположить что это связанно с тем что идет постоянный опрос системного времени.

Ну, определение системного времени занимает ничтожное время в работе приложения. Основные ресурсоемкие методы - это (за исключением процесса создания окна) естественно методы display классов Renderer и FPSMeter (соответственно 86% и 12% полного времени работы приложения). Причем основное время затрачивается в них на вычисление и отрисовку чайника (com.sun.opengl.util.GLUT.evaluateTeapotMesh) и отрисовку строки FPS. Все эти сведения можно легко узнать, выполнив профайлинг (это очень полезно, особенно в таких ресурсоемких приложениях).

Цитата(Hidrag @  2.7.2007,  10:27 Найти цитируемый пост)
Да и еще, в статье предлагается использовать джаву 1.6, но могу сказать что и на 1.5 данные примеры работаю на ура smile а вот с 1.4 не пошло...)))

Интересно то, что в файлах jogl.jar и gluegen-rt.jar в манифестах указано:
Код

Created-By: 1.4.2_11-b04 (Sun Microsystems Inc.)

Однако, поскольку Java 1.4 уже морально устарела, думаю, что это не слишком критично, тем более, что теперь есть такие удобные вещи как generics (1.5) и поддержка скриптов (1.6). Последнее очень удобно было бы использовать в играх...

На данный момент я обдумываю тему следующей статьи, но могу заверить, что она будет настолько же практична, насколько и предыдущие. Спасибо за внимание smile

Автор: Hidrag 3.7.2007, 09:16
Цитата(WTF4XZ @  1.7.2007,  22:41 Найти цитируемый пост)
Статья прикольная, была бы возможность кинул плюс.

user posted image resolved


$tatic, спасибо за исчерпывающий ответ!  smile 

Автор: Goganchic 3.7.2008, 19:20
$tatic, а что насчет продолжения? Может сделать цикл статей по OpenGL в жаве? Может быть что-то вроде создания простенького 3D движка? Я конечно понимаю, что OpenGL будет везде похож, т.к. сама Java вызывает нативные функции OpenGL, реализованные на данной платформе, но сам Java-way может внести в программу что-то особенное (например какие-то паттерны проектирования), и вот об этом и хотелось бы почитать, о том, что получится, если применить Java-way к OpenGL и играм.

P.s. статья - крутЪ

Автор: $tatic 6.7.2008, 11:17
Goganchic, мне бы тоже этого хотелось smile В общем я теперь свободен, так что может и придумаю что-нибудь...

Автор: TXC 23.9.2008, 21:38
$tatic, 
Цитата($tatic @  2.7.2007,  19:12 Найти цитируемый пост)

Цитата(Hidrag @  2.7.2007,  09:27 Найти цитируемый пост)
2. В первой статье когда предлагается впервые запустить приложение у тя написанно, что должен быть пустой черный экран - это не тру ))) видимо у всех по разному, у меня было что то похожее на шахматную доску ))) из пыльных белых и серых прямоугольников )))


Довольно оригинально smile К сожалению, точную причину этого эффекта назвать не могу. Вероятно, что в буфере видеокарты была какая-то случайная информация.


Так и есть, это буфер. Потому как на том этапе в Renderer.display() мы еще не имеем:
Код

        GL gl = drawable.getGL();
        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);



З.Ы.: Статья замечательная, автору респект.

Автор: Still 13.10.2008, 20:15
Статья интересная, это факт. Однако один момент мне не понятен по причине обычной неопытности.
$tatic, мог бы ты чуть детальнее описать следующий абзац:
Цитата
Поскольку JOGL использует JNI для вызова функций OpenGL, то виртуальной машине, в общем случае, необходимо будет указать путь к нативным библиотекам. Для этого при запуске приложения необходимо установить параметр java.library.path с помощью ключа -D виртуальной машины. Так, если нативные библиотеки для Windows находятся в папке C:\jogl\win, то ключ будет -Djava.library.path=C:\jogl\win\. Аналогично путь указывается и на других платформах. При этом, что самое важное, при использовании командных файлов для запуска приложения, путь может быть относителен. В NetBeans, для удобства запуска и отладки проекта встроенными средствами, данный ключ задается в свойствах проекта (Project Properties) в категории Run (поле VM Options).

В частности, что такое нативные библиотеки?..

В принципе отображение чайника получилось, однако предыдущий вопрос меня вводит в заблуждение из-за незнания smile. Не особо хочется сразу со старта, что-то неправильно усвоить.

Спасибо.

PS Литературу листаю, однако не все так просто...

Автор: arilou 14.10.2008, 10:32
Still, 
Цитата

В частности, что такое нативные библиотеки?..


это обычные виндовые DLL или линуксовые so, написанные на С++ и других языках, которые компилируют напрямую в native code. 

Автор: Still 15.10.2008, 08:16
arilou, спасибо, ясно.
Ну и соответственно для Java это библиотеки jar, в частности jogl'а для данного примера.

Автор: Vitaly333 23.3.2009, 22:37
$tatic, А как быть с кросплатформеностью того приложения, которое использует Jogl? Как я понял Jogl поставляется в виде двух платформонезависимых jar-ов + для каждой платформы свои нативные библиотеки. Если я хочу чтобы моё приложение работало везде мне нужно просто скачать полный комплект нативных библиотек для всех платформ с сайта, далее всех их подключить  к своему проекту. В ходе выполнения программы код из jogl.jar каким -то образом сам будет определять на какой платформе запущено приложение и дергать соответствующие функции из соответствующей нативной библиотеки для этой платформы. Правильно думаю или нет?

Автор: kemiisto 23.3.2009, 23:23
Vitaly333, правильно! smile 

Автор: EgoBrain 25.3.2009, 05:47
Выложите экзешник посмотреть.

Автор: Cheloveck 5.6.2010, 21:32
У меня этот пример отбирает 60% процессорного времени. Это нормально?

Автор: Norby89 25.2.2011, 00:11
Пример из первого поста "съедает" ресурсы одного ядра процессора, при этом приложение подвисает (его невозможно закрыть + не происходит перерисовка при перекрытии другим окном.

Автор: Cheloveck 25.2.2011, 10:20
Norby89, нужно ограничить fps.

Автор: Norby89 25.2.2011, 18:07
Cheloveck, каким образом?

Автор: Cheloveck 25.2.2011, 18:50
http://tinyurl.com/4utursg

Автор: Norby89 25.2.2011, 22:48
Cheloveck, включение/оключение вертикальной синхронизации не помогло. 
Зато появились новые данные. Изредка программа таки запускается нормально. Но после перезапуска опять происходит зависание. Пробовал запустить на других компьютерах, там работает нормально. Драйвера на видеокарту обновил. В чем еще может быть проблема?
Еще один момент: если в методе display написать gl.setSwapInterval(7) или интервал больший 7, то прорисовка происходит медленнее, но программа не зависает.
Корень проблемы найден. Поставил старые(очень старые, были на диске к ноутбуку) драйвера на видеокарту, все заработало как часы. С новыми же драйверами программа зависает. Что делать, ума не приложу. Работать на старых драйверах - маразм, а как починить новые не знаю...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)