Обновление от 26.07.15

Прокомментировать Просмотры: 0

Озвучиваемые NPC

Добавлена поддержка субтитров и синхронизации движения губ для звуковых файлов. Реализация вдохновлена Half-Life 2, но выполнена на уровень выше.

Обновление от 26.07.15

Открыть видео

Параметры импорта звука

В процесс компиляции аудио теперь встроены опции предварительной обработки, которые настраиваются через файлы .meta и применяются нативным компилятором звука:

  • Принудительное моно (Force Mono) — сведение всех каналов в один.
  • Удаление тишины (Trim Silence) — обрезка тишины в начале и конце дорожки по заданному порогу.
  • Нормализация громкости (Normalize Loudness) — задействует ранее скрытую нормализацию LUFS с целевым значением -16 LUFS.
  • Усиление (Gain, дБ) — статичная регулировка громкости в диапазоне ±24 дБ.

Все параметры по умолчанию отключены, поэтому компиляция уже существующих материалов остаётся абсолютно идентичной. Точки зацикливания рассчитываются после обрезки, что позволяет им корректно соотноситься с таймлайном в звуковом редакторе. Любое изменение настроек сохраняется в .meta и инициирует принудительную перекомпиляцию ресурса (так как исходные vsnd-файлы не попадают под автокомпиляцию игровых ассетов). Система оснащена защитой от дребезга, поэтому перетаскивание ползунков или массовое выделение вызывают лишь один процесс компиляции на ассет, избавляя систему от шквала устаревших запросов.

Маскировка декалей по карте высот

Маскировка по высоте (Height Coverage) — новая функция для декалей, позволяющая использовать карту высот в качестве дополнительной маски видимости. Она доступна для любых декалей, к которым привязана корректная текстура карты высот. Управление осуществляется через два параметра компонента декали:

  • Степень покрытия (Coverage Amount): формирует маску диапазона высот на основе текущего значения, где 1 означает полную видимость, а 0 — полное исчезновение. Параметр имеет тип ParticleFloat, что позволяет задействовать настройки времени жизни декали и применять эффект не только для статики, но и в анимациях.
  • Диапазон покрытия (Coverage Range): регулирует мягкость границ маски: при значении 0 края будут резкими, а при 0.5 — сглаженными.

Вот как это выглядит на практике:

Открыть видео

Важно учитывать, что эта функция работает как дополнительная маска. Это значит, что она накладывается поверх существующих масок прозрачности и затухания декали. Хотя новая маска полностью совместима с параллаксом, использовать её не обязательно.

Для энтузиастoв кастомных шейдеров я также обновил документацию по классу Decals, добавив полезные сведения о чтении настроек покрытия высот из байтового буфера, их декодировании и применении.

Отсечение геометрии ландшафта (Terrain Culling)

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

Теперь меш разбит на более мелкие фрагменты, которые проверяются на попадание в поле зрения камеры для последующего отсечения. В большинстве случаев игрок находится в центре карты, и как минимум 70% ландшафта вообще не попадают в кадр. Отбрасывая все эти невидимые сегменты, мы получаем ощутимый прирост производительности.

Открыть видео

Это позволяет перераспределить детализацию туда, где она действительно важна — в поле зрения игрока. В видео отсечение намеренно сделано более агрессивным для наглядности.

Открыть видео

Оптимизация шейдеров ландшафта

Вторым серьёзным узким местом было колоссальное количество обращений к текстурам.

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

В лучшем случае количество обращений к текстурам сократилось с 24 до 1, а время рендеринга в бенчмарках уменьшилось вдвое.

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

Открыть видео

Поддержка игр на Serious Engine

Serious Engine пополнил список движков, игры на которых можно подключать (при наличии купленной и установленной копии). Теперь вы можете запускать карты, спавнить пропсы и персонажей из проектов на этом движке.

Открыть видео

Демо в режиме от первого лица

Запись демо-файлов теперь корректно поддерживает вид от первого лица, захватывая такие свойства, как теги рендеринга и флаг Absolute. Кроме того, мы исправили баг записи, из-за которого данные на разных треках могли слегка рассинхронизироваться, создавая эффект неприятного подёргивания моделей рук.

Открыть видео

Улучшения ключевых кадров в Movie Maker

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

Открыть видео

Продвинутая система панелей (Docking System)

В редакторе активно используются стыкуемые панели. В Qt есть встроенный инструмент для этого, но он ужасен, поэтому ранее мы использовали toolwindowmanager. Он неплох, но имел множество изъянов, поэтому теперь мы перешли на Qt Advanced Docking.

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

ADS предоставляет отличную базу для таких функций, как:

  • Центральные виджеты.
  • Закрепление и автоскрытие.
  • Подсветка фокуса.
  • Богатые меню вкладок.
  • Закрытие групп вкладок.
  • Плавающие группы панелей.
  • Улучшенная блокировка док-зон.
  • Контроль минимального размера.
  • Более предсказуемое сохранение макетов.
  • Потенциальные исправления под конкретные платформы в будущем.

К тому же, API для создания и добавления собственных панелей стал намного проще. Раньше код дублировался через DockManager.RegisterDockType, но теперь этот метод упразднён.

Центральный виджет сцены

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

Это спасает от множества проблем, когда случайное закрытие панели сцены могло полностью разрушить всю компоновку интерфейса. И если вы расстроены тем, что больше нельзя прилепить сцену внутрь браузера ассетов — что ж, извините.

Улучшения вертексной покраски в редакторе карт

Инструмент покраски вершин в редакторе карт нуждался в доработках, поэтому я реализовал всё то, о чём просили мы сами и наше сообщество.

Список нововведений включает:

Заливка (Flood Fill)

Открыть видео

Заливка с шумом (Flood Fill — Noise)

Открыть видео

Заливка по окклюзии (Flood Fill — Occlusion)

Открыть видео

Заливка по кривизне (Flood Fill — Curvature)

Открыть видео

Также добавлена поддержка инверсии и очистки данных покраски.

Помимо этого, появились полезные функции для экономии времени:

Улучшенное поднятие цвета (Improve Colour Lift)

Открыть видео

Быстрая пипетка (Quick Colour Pick)

Открыть видео

Масштабирование кисти по дистанции (Scale Brush Distance)

Открыть видео

Быстрый запуск в панели задач (Jump List)

Мы вернули эту функцию: если закрепить редактор s&box на панели задач, вы сможете быстро запускать свои проекты через контекстное меню.

Казус с метриками производительности

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

Даже без диплома математика очевидно, что наша система сбора метрик работала некорректно вплоть до прошлой недели:

Проблема крылась в двух вещах:

1. Мы неправильно агрегировали данные. Использовалась формула:

FrameTimeAvg = (FrameTimeAvg + FrameTimeNew) / 2.0f

Из-за этого среднее значение слишком сильно смещалось в сторону самых свежих замеров. Например, если усреднить тысячу кадров длительностью по 16 мс, а затем получить один кадр на 100 мс, итоговый показатель подскочил бы сразу до 58 мс.
Для исправления мы перешли на алгоритм Уэлфорда, обеспечивающий точное вычисление скользящего среднего.

2. Мы включали время простоя (idle) в общий показатель кадра:
Время простоя — это паузы, которые игра делает между кадрами при ограничении FPS. Из этого следует, что клиент с залоченными 60 FPS всегда отчитывался о 16.6 мс, даже если реальная нагрузка на кадр была намного ниже. Теперь мы отслеживаем простой отдельно, что позволяет видеть реальное время математических расчетов внутри кадра.

Как видно на графике, простой занимает львиную долю общего времени кадра, поскольку большинство пользователей играют с ограничением FPS.

Краткий итог: последние месяцы мы активно оптимизировали производительность, но сами улучшения не отражались в метриках должным образом. Мы усовершенствовали систему сбора данных и продолжим работу над оптимизацией.

Источник

Поделиться:

Похожие статьи

Поиск по играм, новостям и статьям…

Введите не менее двух символов

Введите не менее двух символов