OpenMW — это свободный движок с открытыми исходными кодами, позволяющий запускать на Linux, Windows и OS X известную компьютерную игру The Elder Scrolls 3: Morrowind, включая как официальные плагины Tribunal и Bloodmoon, так и модификации от сообщества. Работа ещё далека от завершения, а нынешние результаты пока не позволяют полноценно играть.
Перевод новости с официального сайта.
На протяжении последних трех месяцев команда OpenMW усердно работала над портированием кодовой базы с движка Ogre3D на OpenSceneGraph. Мы рады сообщить, что наши усилия по портированию наконец-то принесли плоды — все важнейшие возможности игры были реализованы, таким образом пользователи могут насладиться настоящей игрой в Morrowind используя ветку исходников OpenMW-osg. Некоторые дополнительные возможности, такие как, шейдеры, дальняя местность, тени и отражения воды пока не портированы. Однако даже сейчас можно спокойно сказать, что переход прошел в основном успешно и даже лучше, чем планировалось. Новый OpenMW загружается быстрее, дает больше кадров в секунду, выглядит ближе к оригинальной игре и исправляет старые баги, которые сложны в исправлении на старом движке. Погодите, больше кадров в секунду? Пора тестировать…
Первый бенчмарк
Наша тестовая конфигурация: GeForce GTX 560 Ti/PCIe/SSE2, AMD Phenom(tm) II X4 955 Processor × 4, Linux 3.13.0-24-generic x86_64, 1680×1050, полноэкранный режим, no AA, 16x AF, без отражений воды, без теней, без шейдеров, максимальная дистанция обзора, которую позволяет ползунок настроек.
fps/Время загрузки/Использование памяти
49 / 7c / 344.6 MB (OpenMW)
75 / 3.4с / 277.1 MB (OpenMW-osg)
Видно, что порт OpenSceneGraph выигрывает по всем трем пунктам. Приличное увеличение fps, которое все-таки далеко от 3-4-х кратного улучшения, которые мы видели в ранних тестах с одной моделью. Нет причин беспокоиться, посмотрите на следующее:
- Сравнение некорректное. Новые возможности рендеринга, включенные в ветку OSG, которые делают нас ближе к оригинальному Morrowind, влияют на производительность. Например, теперь мы можем динамически расширять границы объектов во время анимации, что исправляет печально известный баг 455 (исчезновение существ при определенном положении камеры), но цена этому — fps. Более того мы выкинули статическую группировку геометрических форм, которая предназначалась для оптимизации производительности, но приводила к множеству проблем — в основном некорректное освещение и неработоспособность заскриптованных передвижений объектов. Даже без этой оптимизации порт OSG работает быстрее!
- Ожидайте возросшую производительность при включенных графических эффектах. Сравнение было проведено при минимальных графических настройках по простой причине — некоторые возможности графики (тени, отражения и т. д.) еще не реализованы в порте OSG. Мы думаем, когда они будут портированы это ударит по производительности меньше чем ранее, просто потому что новый рендерер лучше масштабируется. Отрисовка на данный момент выполняется в отдельном потоке, таким образом графически сложная сцена не блокирует основной поток при выполнении таких значительных задач, как выбраковка, физика, скрипты и анимация.
- Реальный этап оптимизации еще не начат! Сейчас основная цель — вернуть игру в в играбельное состояние и это случилось только несколько дней назад. Теперь видно множество возможностей для оптимизации. Наш новый фреймворк рендеринга дает нам больше контроля над тем как формируется граф сцены и над тем как отправляются обновления, кое от чего мы только начинаем получать преимущество. Следующие оптимизации запланированы в ближайшем будущем:
- Перенести обновление(изменение) скининга в отдельный поток.
- Перенести обновления частиц в отдельный поток.
- Общее состояние в разных NIF-файлах.
- Включить выбраковку для источника/программ частиц.
- Внедрить оптимизатор моделей. Модели в Morrowind неожиданно содержат множество повторяющихся узлов, повторяющихся трансформаций и повторяющихся состояний, которые влияют на производительность рендеринга. Мы должны реализовать подобный этап оптимизации. OpenSceneGraph предоставляет osgUtil::Optimizer, который может быть полезен для выполнения этой задачи.
- Создать более сбалансированный граф сцены, т. е. дерево квадрантов (дерево, в котором у каждого внутреннего узла ровно 4 потомка), чтобы уменьшить падение производительности от выбраковки очередей сцен(?).
- Узкое место не только рендеринг. Говоря, что рендеринг быстрее в N раз, нельзя говорить, что OpenMW быстрее в N раз. У нас имеются другие вещи влияющие на время генерации кадра и сейчас, когда наш рендеринг стал быстрее другие узкие места становятся более заметными. В особенности реализация физики и анимации — две наихудшие проблемы. Некоторые подготовительные оптимизации в данном направлении были осуществлены в порте OSG, но мы не сомневаемся, что еще есть где развернуться.
Предварительный список изменений:
Улучшения рендеринга
- Непропорциональное масштабирование NPC (Bug 814): некоторое NPC сейчас смасштабированы по осям X и Y, делающих их более объемными — так же как в оригинальном Morrowind. Предыдущие версии OpenMW неподдерживали такой тип масштабирования в связи с ограничением Ogre3D.
- Улучшенная точность рендеринга: решение проблем с точностью больших координат, выглядящих как моргание/тряска когда игрок путешествует слишком далеко от стартовой точки мира.
- Удалена статическая группировка геометрических форм — исправлено некорректное освещение (Bug 385), исправлены скриптовые движения объектов (Bug 602) и улучшено время загрузки зоны.
- Оригинальные параметры прозрачности — предыдущие версии OpenMW использовали настройки прозрачности плохо соответствующих оригинальному Morrowind благодаря статической группировки геометрических форм. Это было исправлено — листва и другие прозрачные объекты имеют более мягкие края.
- Добавлена опция выборки: в дополнение к выбраковке внеэкранных объектов мы можем теперь также пропускать объекты, которые меньше одного пиксела во время рендеринга. Изменение визуально не заметно, поэтому мы включили эту опцию по умолчанию.
Переработанный NIF-загрузчик
- Поддержка непропорционального масштабирования в NIF-файлах (Bug 2052)
- Исправлено ограничение по количеству узлов в NIF-файлах (Bug 2187)
- Исправлены анимации «заморозка» когда объект отбракован (Bug 2151)
- Переработан алгоритм скининга(?) для более эффективного графа сцены
- Динамическое расширение границ объектов на основе скелетной анимации — исправляет исчезновение некоторых существ при просмотре под определенным углом (Bug 455)
- NIF-графы сцены теперь общий ресурс — значительно уменьшает время загрузки.
- Анимированный текст теперь общий ресурс.
Переписанная физика
- При компиляции с Bullet 2.83 или позднее получаем возможность использовать btScaledBvhTriangleMeshShape для эффективного использования фигур.
- Удалены «детализированные» отрендеренные рейкастингом (метод трассировки лучей) фигуры и заменены на прямой рейкастингом на графической сцене — это уменьшает потребление памяти.
- Использование btCollisionWorld вместо btDynamicsWorld, чтобы исключить лишние обновления, необходимые для функциональности, которая нам не нужна.
Новый рейкастинг (метод трассировки лучей)
- Использование osgUtil::IntersectionVisitor для прямого рейкастинга на графической сцене
- Поддержка рейкастинга для анимированных объектов — исправляет некорректное положение актеров (Bug 827)