Некоторое время назад в Твиттере я обнаружил @Orango_Mango, который поделился своим прогрессом в создании 3D-движка с помощью JavaFX. Совместные видеоролики начинались с кубика Рубика в январе 23 года, затем с простой акробатической машины в феврале и полного мира, похожего на Minecraft, в апреле. Кто этот @OrangoMango? И почему он взялся за создание 3D-движка с Java и JavaFX? Давайте узнаем…

Начнем с первой загадки… Кто стоит за аккаунтом @Orango_Mango? Можете представиться?

Мой никнейм Orango_Mango, но мое настоящее имя Paul Kocian, и я живу в Италии. Я начал программировать в 13 лет и изучил основы Python, создавая простые программы, а позже и свои первые приложения с графическим интерфейсом. Я начал с простой игры, в которой компьютер запрашивает несколько операций, и пользователь должен вычислить результат в кратчайшие сроки, не сделав ни одной ошибки.

Как только я изучил более продвинутые вещи, такие как программирование ООП, SQLite и модуль Tkinter, я начал создавать приложения, такие как интерфейс входа, а затем свою первую игру с использованием холста tkinter: Pong.
В это время я очень любил создавать игры и узнавать, как строятся игры на низком уровне, поэтому я начал программировать FlappyBird и LavaPlatformer. Поскольку я был новичком в разработке игр, код был написан очень плохо, когда я его сейчас читал.

В 14 лет я начал программировать на Java, а год спустя я также начал использовать фреймворк JavaFX. Я начал создавать очень простые приложения с графическим интерфейсом, а затем игры. Также я присоединился к GMTK Game Jam 2022. Сейчас мне 16, и я пытаюсь расширить свой опыт работы с такими приложениями, как пользовательский интерфейс MySQL, и такими играми, как TrisGame, базовая многопользовательская игра, Projectile и FoodDice.

Это впечатляющий список проектов, и к тому же вам всего 16 лет! Как вы находите время учиться и создавать все это? Ты еще в школе? И где вы всему этому научились?

Да, я хожу в школу Liceo Filippo Buonarroti в Пизе, Италия. В основном мы используем С++, но я так глубоко программировать не учусь. Вот почему я изучаю эти вещи в основном в одиночестве дома.

Когда я не знаю, как что-то кодировать, я ищу это на StackOverflow или других сайтах, пока не найду решение.

Поскольку у меня также есть домашние задания и экзамены, у меня не так много времени в течение недели, чтобы кодировать свои вещи. Создание 3D-движка требует времени, поэтому я пишу в основном по выходным и праздникам.

Многие считают Java старым и скучным языком программирования. Поэтому я рад узнать, что кто-то вашего возраста выбрал Java, чтобы узнать больше и разработать игры и другие приложения. Какова главная причина, по которой вы выбрали Java?

Мне нравится делать игры, но я думаю, что лучше всего писать код игры на низком уровне, поэтому я не люблю использовать игровые движки, такие как Unity (C#), где все уже создано за вас (графика, физика, АИ,…).

Я знаю, что Java — старый язык, но я думаю, что он по-прежнему лучше всего подходит для создания игр.

Например, Minecraft сделан на Java, и я вдохновился созданием 3D-движка. И API холста JavaFX действительно впечатляет, в нем есть все, что нужно игре (отрисовка изображений, форм и даже пикселей). Поскольку Android и Java так связаны, это также позволит мне портировать мой код на мобильные устройства.

Java и JavaFX для мобильных устройств — это действительно очень хороший подход, которому не уделяется должного внимания. Я думаю, вы знаете, какую работу делает Gluon по этой теме? Если нет, посмотрите их документы.

Поскольку JavaFX основан на Java, я всегда спрашивал себя, можно ли запустить приложение JavaFX на Android.

Итак, однажды я случайно обнаружил JavaFXPorts. Я знаю о Gluon, но так как он не совсем бесплатный, я сам начал компилировать приложения JavaFX для Android.

Я попытался использовать плагин JavaFXPorts Gradle и внести некоторые изменения в код, чтобы приложение работало и на более новых версиях Android (на данный момент плагин устарел).

Я увидел в Твиттере, что вы поделились проблемой, связанной с вашим 3D-движком, и Алмас Байм посоветовал вам проверить с помощью VisualVM, какой код блокирует ваш рендеринг. Как это работает? Было ли сложно настроить и найти ту часть кода, которая вызывала проблемы? И какую проблему он выявил?

Основная проблема 3D-движка — производительность. Кодировать и понимать математику сложно, но написать движок эффективным способом еще сложнее. Я работал неделями и перепробовал множество способов сделать код максимально эффективным. Поскольку я разрабатываю приложение на Raspberry Pi, мне сложно сделать его легким.

В конце концов, как предложил Алмас Баим, я использовал профилировщик, чтобы увидеть, что вызывает все задержки движка. Я обнаружил, что вершины каждого куба вычислялись 36 раз вместо 8 (!). Эта проблема возникла из-за того, что каждый куб был создан из списка из 12 треугольников (каждый треугольник с 3 вершинами, 12*3=36), а некоторые вершины использовались многими треугольниками более одного раза.

Поэтому, чтобы исправить это, я кэшировал вычисленные вершины и использовал данные для построения других треугольников куба. Это все еще можно улучшить, проверив соседние кубы (2 смежных куба имеют одни и те же 4 вершины).

Вы упомянули, что разрабатываете 3D-движок для Raspberry Pi!? Является ли это дополнительной проблемой, чтобы ограничить мощность компьютера и увидеть влияние на 3D-рендеринг? Можете ли вы поделиться, какой компьютер и программы вы используете для разработки?

Да, разработать 3D-движок для Raspberry Pi — сложная задача. Я использую модель 4B с 2GB RAM.

Хотя Java использует много памяти, эти 2 ГБ вполне подходят для моего 3D-движка. Поскольку у меня так мало оперативной памяти, мне нужно писать код очень эффективно и поддерживать максимально низкое разрешение окна. Моя основная IDE — Geany, очень легкое приложение, оптимизированное для Raspberry Pi.

На самом деле у меня есть ноутбук с Windows, но мне не нравится кодить его. Для этой задачи я предпочитаю Linux, а Raspberry Pi не так уж и дорог… Итак, моя установка очень проста: Raspberry Pi и один экран.

Поскольку вы узнали все это самостоятельно, не могли бы вы рассказать, что было самым сложным при начале работы с Java и JavaFX?

Когда я начал изучать Java, самой сложной частью было знакомство с фигурными скобками, циклами for и всеми именами классов (например, пакет java.util), поскольку я пришел из Python. Когда я узнал все самое необходимое о Java, я искал GUI API для Java, похожий на модуль Tkinter Python (я был знаком с Canvas API Python, который похож на JavaFX).

Я нашел Swing и JavaFX. Я выбрал JavaFX вместо Swing, потому что основы JavaFX были хорошо объяснены в книге, которую я читал о Java, а синтаксис Swing был немного более запутанным по сравнению с JavaFX.

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

Какая профессия была бы для вас идеальной?

Я хотел бы быть разработчиком игр Java или чем-то еще, связанным с кодированием!

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

Первоначально опубликовано на сайте webtechie.be 2 мая 2023 г.