СarbonUI и EVE Online: incursion 1.6
Интерфейс в EVE значительно устарел к текущему времени, так же как и основная часть кода, отвечающая за рендеринг. Старый интерфейс рендерился, используя fixed-function рендеринга в Direct3D — основной в D3D7 подход. D3D9 так же поддерживает этот подход, но это может сыграть злую шутку с производительностью, и ограничивает вас только возможностями, которые предлагают fixed-function — никаких модных шейдеров, например.
Мы планировали тюнинг UI долгое время по ряду причин:
- улучшение юзабилити;
- улучшение внешнего вида;
- улучшение производительности.
Текущий UI фреймворк провёл нас в этом плане — за многие годы он значительно оброс функциями, и разработка на нём стала значительно сложнее, к тому же появилось много тупиков на пути к улучшению производительности. Из-за спешного добавления новых возможностей в пользовательский интерфейс недостаточно внимания было уделено разработке самого фреймворка.
Мы рассмотрели несколько путей по переработке UI фреймворка, но, в конце концов, мы поняли, что код EVE UI стал слишком велик для рассмотрения варианта, предлагающего полностью переписать UI с учетом новых парадигм. Мы решили применить подход, требующий минимальное количество доработок текущего интерфейса.
Итак, CarbonUI — это эволюция структуры текущего пользовательского интерфейса и его фреймворка, с совершенно новой системой рендеринга. Мы старались изменить настолько мало, насколько это вообще возможно в верхнем уровне UI, так что UI-программисты, работающие в Python не увидят больших изменений — и что более важно, это ~200K строк UI кода, который продолжает работать. Было много кода требующего модифицирования для работы с новыми слоями рендеринга или был простов крайне необходим рефакторинг. Результатом стало то, что немногие файлы UI были затронуты изменениями.
Некоторые ключевые особенности:
- Сцены UI могут быть реализованы в различных контекстах;
- Объекты UI могут быть отрендерены в текстуры для создания 3D объектов;
- UI станет поддерживать 3D, что позволит произвести взаимодействие с UI в 3D сценах;
- UI так же позволяет рендерить набор 2D примитивов в 3D сцену, позволяющую прорисовать всё это с созданием эффекта глубины и перспективы;
- 2D рендеринг как 2D наложение;
- Весь Python код и объекты UI могут быть использованы в различных контекстах — сцены могут быть перемещены из одного контекста в другой на лету;
- Производительность стала лучше, чем была на старом UI;
- Текстуры автоматически собираются в текстурный атлас, делая гораздо более эффективным рендеринг без отягощения работы художников UI;
- Клиппинг сделан в пиксельных шейдерах;
- Трансформации происходят в вершинных шейдерах;
- Пиксельные шейдеры делают премультипликацию альфа слоя как непрозрачного, прозрачного и адитивно смешаного в D3D режиме наложения;
- В результате обращений к рендеренгу стало менее 10, а раньше это было более 100 обращений;
- Выравнивание полностью отделено от рендеринга;
- Выравнивание теперь полностью выполнено на Python, что является более легким в обслуживании;
- Оптимизация рендеринга больше не приводит к риску потери выравнивания;
- Рендеринг теперь полностью происходит при помощи шейдеров, что открывает нам возможность делать всякие крутые штуки на них;
- Теперь все примитивы полностью поддерживаются основные эффекты, такие как тень, свечение, размытие;
- Новые библиотеки полностью написаны на Питоне, что позволит делать более легкий и динамичный UI.
Incursion 1.6
Incursion 1.6
Incursion 1.6
Incursion 1.6
Тестовая утилита, используемая программистами интерфейса для отработки эффектов и анимации элементов пользовательского интерфейса, созданных в CarbonUI.
Выравнивание
Что мы имеем ввиду под выравниванием? Это то, как элементы UI расположены на экране, грубо говоря, координаты по оси X и Y, но программист UI не должен размещать их по этим координатам. Для примера, если она хочет разместить кнопку внизу экрана, то кнопка получает CENTERBOTTOM выравнивание. Если окно изменяется-то координаты пересчитываются, так, что бы кнопка осталась по центру внизу экрана.
Перемещение этой функции из C++ в Питон — было не однозначным решением. Это конечно быстрее отрабатывается в C++, но мы много усилий положили на улучшение производительности в Питоне. С другой стороны это было ДО, что означало, что внесение изменений будет сопряжено с некоторыми трудностями.
Это было связано с двумя причинами:
- Рендеринг и выравнивание — это переплетенные воедино темы, изменение одного влекло за собой риск потери работоспособности другого;
- Цикл тестирования разработки на Питоне значительно короче цикла тестирования разработки на С++.
Вместо того, что бы оптимизировать код на Питоне — мы решили уменьшить объем работы, что позволило бы привести к тем же результатам. Выравнивание делалось каждый кадр при обновлении иерархии UI, это было заменено на кэширование результатов и вызов выравнивания при любых изменениях их свойств.
Имея четкое разделение выравнивании и рендеринга, мы получили более простой способ оптимизировать каждую часть этого пазла.
Почему это должно меня волновать?
Когда EVE была запущена около 8 лет назад, UI выглядел круто по сравнению с другими играми. Времена меняются, а вот наш пользовательский интерфейс не очень. Хотя такие проекты как CarbonUI трудно даются — мы всегда должны делать что-то такое, что позволяет выйти за рамки, использовать всё, что дают современные технологии. Даже если игроки не увидят сейчас очевидной разницы, когда мы запустим CarbonUI на TQ, то мы можем вам гарантировать, что наши дизайнеры интерфейса будут слышать от программистов — «Ага, без проблем» значительно чаще, когда ставят им очередную сумасшедшую идею в задачи. В конечном счете, наша любимая игра про космические кораблики станет еще лучше.
Что будет с производительностью?
Мы расскажем подробнее о разнице в производительности с CarbonUI в будущем девблоге!