FAQ по Xtreme3D

Если возникли проблемы, то перед тем, как лишний раз беспокоить народ на форуме, не поленитесь заглянуть сюда. Может быть, решение вашей проблемы уже есть!


Q: Актуально ли сегодня использование Xtreme3D?

A: Для серьезного использования в индустрии (создания коммерческих игровых проектов) - скорее нет, чем да. Xtreme3D основан на устаревающих графических технологиях (OpenGL 1.x/2.x) и, конечно, не может конкурировать с современными движками типа Unity и Unreal Engine. Тем не менее, любительские игровые проекты, как правило, и не пытаются сравниться в плане графики с AAA-тайтлами, поэтому для создания простых инди-игр Xtreme3D 3.x вполне подходит. Движок по-своему интересный и привлекательный - теоретически, с его помощью можно создать игру не хуже, чем Doom 3 или Half-Life 2.


Q: Какой движок лучше - Xtreme3D, Ultimate3D или GMOgre?

A: Все зависит от требований относительно простоты изучения, функциональности, гибкости и удобства. Ultimate3D очень прост в изучении, но технологически сильно уступает остальным. GMOgre - достаточно сложный движок с очень своеобразным API, но очень мощный, с его помощью можно сделать если не все, то очень многое. Xtreme3D в последних версиях (3.0 и выше) по функциональности приблизился к GMOgre и сейчас умеет практически все, что и он - при этом у Xtreme3D более простая архитектура, доставшаяся в наследство от GLScene, и интуитивный API.

Если вы только начинаете изучать 3D-графику, рекомендуем Ultimate3D. Если вы уже обладаете достаточным опытом во встроенной 3D-графике GM, если вас не пугают сложности и отсутствие документации - можно взглянуть в сторону GMOgre. Если вам просто нужен легковесный, но в то же время мощный и хорошо документированный 3D-движок, который легко изучить и удобно использовать - то берите Xtreme3D. Имейте также в виду, что Xtreme3D сейчас является единственным активно развивающимся 3D-движком для GM - если вам чего-то не хватает, вы можете сделать запрос на форуме, и мы постараемся реализовать нужные вам функции.


Q: Игру какого жанра можно сделать при помощи Xtreme3D?

A: Движок не имеет жанровых ограничений, но лучше всего адаптирован для action-игр от первого и третьего лица. Известны также проекты по созданию на X3D платформера, стратегии, top-down-шутера, логических игр и гонок.


Q: Какие технологии рендеринга поддерживает Xtreme3D?

A: В основе Xtreme3D лежит классический прямой рендер (фиксированный конвейер с вершинным освещением). Однако, благодаря поддержке GLSL-шейдеров в Xtreme3D 3.x, вы можете запрограммировать практически любой спецэффект или графический пайплайн, от простого попиксельного освещения до нетривиальных отложенных эффектов вроде SSAO. На Xtreme3D успешно реализованы несколько моделей освещения (Blinn-Phong, Cook-Torrance), image-based lighting (IBL), теневые карты (в том числе каскадные), а также множество эффектов постобработки.

Вопрос о том, можно ли реализовать полноценный отложенный рендеринг (deferred rendering) и сопутствующие ему эффекты (например, SSLR и SSGI), пока остается открытым - для этого необходима поддержка MRT, которая, вполне возможно, скоро появится.


Q: Почему движок не запускается или работает слишком медленно?

A: По состоянию на 2016 год (Windows 8.1) движок должен работать нормально. Отдельные проблемы могут быть связаны с видеодрайвером. Xtreme3D требует драйвер с поддержкой OpenGL 1.3 (плюс несколько расширений для работы отдельных функций) - если Xtreme3D не запускается или работает медленно, рекомендуем обновить видеодрайвер.


Q: Почему движок вылетает с ошибкой?

A: Чаще всего сообщение о неизвестной ошибке ("Unexpected error occurred when running the game") возникает из-за передачи в функции Xtreme3D неправильных параметров. Например, движок не проверяет id'ы объектов (указатели) на валидность, поскольку такую проверку невозможно сделать эффективной. Движок предполагает, что вы не будете передавать ему недействительные указатели.

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

Наконец, ошибка может возникнуть, если попытаться удалить объект, имеющий потомков. Всегда преварительно отсоединяйте потомков или удаляйте их при помощи ObjectDestroyChildren.


Q: Поддерживает ли Xtreme3D шейдеры?

A: Да, в Xtreme3D 3.x реализована полноценная поддержка шейдеров на языке GLSL 1.1 и 1.2. Также в движке есть много встроенных шейдеров, реализующих те или иные популярные эффекты.


Q: Поддерживает ли Xtreme3D динамические тени?

A: Да, в Xtreme3D 3.x есть поддержка трех видов теней (shadow plane, shadow volume, shadow map). Мы рекомендуем использовать теневые карты (объект ShadowMap), как наиболее современные и эффективные. Можно на их основе сделать cascaded shadow maps для охвата тенями обширных пространств - ищите соответствующую демку в разделе Примеры.


Q: Как увеличить производительность игр на Xtreme3D?

A: Это зависит от механики игры, но есть несколько распространенных способов:

  • Используйте менее детализированные модели и текстуры меньшего разрешения
  • Разделите все игровое пространство на части и отключайте отдельные части по мере надобности
  • Отключайте или удаляйте ненужные/невидимые в данный момент объекты
  • Уменьшите разрешение ресурсоемких эффектов (Вода, Размытие и т.д.)
  • Установите рендеринг в событии Alarm вместо Step. FPS возрастет как минимум на 30%!
  • Вместо загрузки одной и той же модели несколько раз, используйте дублирование. Это существенно сэкономит память. Также в Xtreme3D 3.x можно использовать прокси (ProxyObject), которые позволяют создать сколь угодно много копий модели, не дублируя ее в памяти
  • Не создавайте новые объекты в цикле (событии Step) для таких вещей, как, например, снаряды, пули, лазеры, спрайты для взрывов и эффектов частиц. Создание и удаление объекта - медленные операции. Используйте массивы заранее созданных объектов, а затем включайте/отключайте их по пере необходимости
  • Большие количества однотипных объектов (например, призов) заносите в Octree или Quadtree, а затем используйте PartitionQueryFrustrum для отсеивания невидимых объектов и PartitionQueryBSphere или PartitionQueryAABB для оптимизации проверки столкновений с этими объектами
  • В Xtreme3D 3.x можно реализовать LOD (level of detail) при помощи мультипрокси (MultiProxyObject). Вблизи от камеры мультипрокси будет рендерить высопоколигональную модель, а вдалеке - низкополигональную
  • В Xtreme3D 3.x можно использовать объект ClipPlane для отсечения графики произвольными плоскостями. Например, вы можете разделить уровень на подземелье и верхний мир - когда игрок находится в подземелье, верхний мир отсекается плоскостью, и наоборот.

  • Q: Почему модели в игре неправильно повернуты?

    A: Причина кроется в различиях между координатными системами. Xtreme3D использует координатную систему, где ось Z указывает вперед относительно экрана (Z-forward), а ось Y - вверх (Y-up). Вы легко можете исправить положение,

    а) переориентировав модель в 3D-редакторе, так, чтобы при загрузке в Xtreme3D она была повернута правильно;

    б) сделав модель дочерней для Манекена (Dummycube) и повернув модель при помощи ObjectRotate (в этом случае для всех остальных действий вместо модели используется Манекен);

    в) повернув модель при помощи функции MeshRotate (только для моделей типа Freeform). В Xtreme3D 3.x эта функция называется FreeformMeshRotate.


    Q: Почему при загрузке моделей не загружаются текстуры?

    A: Библиотеки материалов Xtreme3D по умолчанию загружают все текстуры из рабочей директории игры. Если модель находится в какой-либо папке (например, data/models), то вы должны указать ее как путь к текстурам при помощи MaterialLibrarySetTexturePaths. Если одновременно загружаются модели из разных папок, следует создать несколько библиотек материалов и при загрузке переключаться между ними при помощи MaterialLibraryActivate. Для каждой из них необходимо указать путь к текстурам соответствующей модели. В Xtreme3D 3.x библиотеки указываются индивидуально при создании модели, поэтому переключаться при помощи MaterialLibraryActivate необязательно.


    Q: Что такое Манекены (Dummycube) и для чего они нужны?

    A: Манекены - очень важный тип объектов. Они невидимы и используются для создания иерархических структур. Сделав Манекен родительским для одного или нескольких объектов, Вы можете управлять ими всеми сразу, управляя Манекеном. Например, если отключить Манекен, то все его дочерние объекты также будут отключены. Это очень удобно для представления группы объектов одного типа. Второе главное назначение Манекенов - создание шарнирных структур (pivot), когда вторичные состояния объекта находятся в зависимости от первичных. Если, скажем, неободимо получить или задать поворот объекта независимо от вектора направления, то проще будет сделать объект дочерним для Манекена и для работы с направлением использовать Манекен, а для поворота - объект. Подобная структура используется также в скелетной анимации.


    Q: Почему в Xtreme3D не работают события мыши?

    A: События мыши проверяют только окно GM, в то время как Xtreme3D создает новую активную форму поверх старой, и поэтому обычные события мыши в ней не работают. Нажатия кнопок мыши можно проверять только функцией keyboard_check_direct(mb_left) или keyboard_check_direct(mb_right) - в этом случае нажатия проверяются непосредственно на аппаратном уровне, вне зависимости от конкретного активного окна. В Game Maker 8 можно также использовать функцию mouse_check_button_pressed.


    Q: Как растянуть окно игры на весь экран? Опция Start in full-screen mode не работает!

    A: В Global Game Settings на вкладке Resolution поставьте галочку Set the resolution of the screen. В списке Resolution выберите нужное Вам разрешение (обычно то, которое было указано в функции ViewerCreate). На вкладке Graphics все же выберите Start in full-screen mode, т.к. без полноэкранного режима будут видны границы окна.


    Q: Как сделать проверку столкновений?

    A: В Xtreme3D есть несколько встроенных способов для этого.

  • Функции ObjectCheck... (ObjectCheckCubeVsCube, ObjectCheckSphereVsFace и др.). Они определяют факт столкновения между двумя объектами (а точнее, их ограничивающими кубами или сферами). Такая проверка может быть полезна для проверки типа снаряд/цель, игрок/приз и т.д.
  • Для стрельбы в шутерах (а также для реализации взаимодействия игрока с интерактивными предметами и триггерами) можно использовать трассировку лучей (raycasting). Заданный объект испускает луч, и другие объекты проверяются на пересечение с этим лучом. При этом можно получить координаты точки и нормаль полигона пересечения.
  • Для кинематики (чтобы персонаж передвигался по карте и не проходил сквозь стены) существуют специальные движки проверки столкновений - DCE и FpsManager.
  • Вы также можете подключить внешнюю библиотеку с реализацией проверки столкновений. Для Xtreme3D 3.x, кстати, разрабатывается вспомогательная библиотека GMDMech, реализующая более качественную кинематику, чем в DCE - подробности в разделе Примеры.


    Q: Как получить реалистичную перспективу камеры?

    A: Иногда для достижения реалистичной перспективы требуется коррекция "оптических" характеристик игровой камеры. Следующий пример такой коррекции сводит перспективные искажения к минимуму:

    CameraSetFocal(camera, 120);
    CameraSetSceneScale(camera, 0.5);

    Q: Как получить имена материалов, которые загружаются автоматически вместе с моделью?

    A: Материалы загружаются в текущую активную библиотеку под теми именами, которые были заданы в 3D-редакторе. Вы можете использовать эти имена для того, чтобы изменять параметры материалов модели.


    Q: Почему ландшафт (Terrain) выглядит ступенчатым?

    A: Если при создании ландшафта он выглядит ступенчатым, значит исходная карта высот закодирована в 24 бита на пиксель, а не 8, как это должно быть. Изображение нужно преобразовать в черно-белое (256 цв.). Например, в GIMP это делается так: Изображение -> Режим -> Градации серого.


    Q: Как указать переход на следующую строку в объектах текста?

    A: В объектах текста Xtreme3D символ '#' НЕ означает переход на следующую строку. Для этого используется тринадцатый символ ASCII (возврат каретки) - chr(13), например:

    TextSetText(text, 'Line1' + chr(13) + 'Line2');

    Q: Как вывести кириллицу в объектах текста?

    A: Используйте шрифт TTFont и передавайте объектам текста строки в кодировке UTF-8. В старых версиях Xtreme3D можно использовать растровый шрифт (Bmpfont), где английские буквы заменены русскими, а затем выводить соответствующий текст латиницей.


    Q: Поддерживает ли Xtreme3D воспроизведение видео?

    A: Нет. Для воспроизведения видеороликов придется использовать специализированные DLL.


    Q: Почему к телам ODE не прикладываются силы?

    A: Дело в том, что в Xtreme3D 2.0.2.0 появилась возможность автовыключения тел, если они бездействуют определенное время, а к выключенным телам невозможно применить силы. Автовыключение по умолчанию активировано, его нужно просто выключить:

    OdeWorldSetAutoDisableFlag(false);

    Q: Поддерживает ли ODE "тряпичные куклы" (ragdoll)?

    A: Да, ODE в Xtreme3D 3.1 поддерживает Ragdoll для Актеров (Actor).


    Q: Почему материал не учитывает альфа-канал текстуры?

    A: Нужно выставить режим смешивания bmTransparency функцией MaterialSetBlendingMode.

    Отзывы