После выпуска Q2PRO-X 1.5 занялись следами попаданий. Пятно на стене оставалось там, где прошёл выстрел; рана на движущейся модели перемещалась вместе с ней. В Player Contact Effects вошли кровь, брызги, последствия длинной очереди, состояние тела после смерти и отдельное изображение воздействия BFG. Урон по-прежнему определял сервер. Клиент собирал из полученных событий видимую картину боя.
Одно попадание могло оставить два пятна. Клиент успевал показать предсказанный эффект, а затем получал подтверждение по сети и считал его новой атакой. Слишком широкое объединение событий давало обратную ошибку — терялось настоящее следующее попадание. Система стала хранить происхождение признаков и сопоставлять подтверждения. Следили также за номером сущности: старую рану нельзя переносить на нового игрока, которому достался освободившийся номер.
Пятно на полу и рана на персонаже требуют разных координат. Первое связано с поверхностью уровня; вторую нужно закрепить на анимированной геометрии. MD2 хранит последовательности вершинных кадров, MD5 использует скелет и веса. Приблизительная оболочка, подходящая одному формату, начинала скользить или мерцать на другом. Рядом развивались визуальная подсветка и управление частями моделей: окрашивание головы, корпуса или других участков должно было совпадать с настоящей позой, а не с предположенной формой. Проверять приходилось игрока в движении, его оружие, тени и отражения.

Подсветку игроков и предметов делали ещё весной. Теперь она проходила через большее число графических слоёв: полупрозрачный цвет внезапно становился плотным, в одном режиме сохранялась текстура, в другом исчезала. Скриншота хватало, чтобы увидеть неверное смешивание. С мерцанием было сложнее — записывали последовательность кадров и сверяли позу модели, глубину и порядок рисования.
У крови на стене, на воде и в AVFX-луже были разные поверхности назначения. Ошибка выбора пола оставляла пятно в воздухе; неправильная граница бассейна выпускала его на сухой камень. Следы проверяли на движущихся элементах и в комнатах, которые временно скрылись из вида. Отдельные пресеты и слоты настроек позволяли менять контактные эффекты, сохраняя остальное оформление. Собственную кровь подбирали так, чтобы она не закрывала обзор в бою.
Остановки при повороте камеры
Осенью большой FPS перестал быть достаточным описанием скорости клиента. Кирпичная геометрия могла долго рисоваться быстро, затем неожиданно перестраиваться при повороте. Кэш выбрасывал недавно использованные данные, а возвращение камеры заставляло строить их снова. В диагностическом проходе насчитали 329 построений и 320 вытеснений; отдельные задержки приближались к половине секунды. Ускорение одной операции не устраняло бы главную причину: тяжёлая подготовка постоянно возвращалась внутрь игрового кадра.

Устойчивые данные стали готовить при загрузке карты или изменении настройки. Поворот камеры больше не заставлял постоянно перестраивать кирпичи, зато кэш занимал около 1,7 гигабайта на одной тяжёлой тестовой карте и 3,3 гигабайта на другой. Первоначальная подготовка тоже никуда не исчезла. Выигрыш состоял в том, что её убрали из обычного движения; за ровный кадр заплатили памятью и ожиданием до начала игры.
В отражениях нашлась другая лишняя работа. Для нескольких плоскостей заново рисовали мир, причём сложное небо успевало вычислиться раньше стен, которые затем его закрывали. Небо перенесли после непрозрачной геометрии, используя уже известную глубину. В самом тяжёлом из замеренных вариантов это дало лишь 43,6 → 44,6 кадра в секунду. Ненужных вычислений стало меньше, но отражённый мир по-прежнему стоил дорого. Проверки других сочетаний эффектов продолжили отдельно.

Осенний пресет помог проверить отбрасывание невидимой работы. Не рисовать то, что закрыто от камеры, полезно; останавливать там развитие луж — уже ошибка. Дождь должен продолжать наполнять их и без наблюдателя. Разделив состояние мира и его представление, удалось получить в одном контролируемом тяжёлом сценарии рост средней частоты с 75,5 до 86 кадров в секунду, примерно на четырнадцать процентов. Сравнения включали одинаковое ожидание под дождём, десятки тысяч вариантов и проверку кадров. Запуски с потерей фокуса или включившимся скринсейвером исключали: они не измеряли то, что собирались сравнить.
В текущей линии Q2PRO-X 1.6 продолжалась работа с частицами, освещением, отражениями, растительностью и сезонными материалами. Performance HUD показывал их стоимость, масштаб рендера и постобработка позволяли подобрать нагрузку. На 10 октября эта версия ещё развивалась. Тем временем появился другой вид испытаний: вместо сравнения кадров приходилось пересматривать матчи и разбирать, почему новый компьютерный соперник проиграл.
Эффекты по отдельности
В Q2PRO-X 1.6 обычные частицы разделили на 68 Standard-семейств. Кровь, след бластера, дым ракеты, искры, телепорты и частицы рейлгана можно было независимо включать, выключать и окрашивать. Ещё десять семейств обычного AVFX получили собственные настройки: изменение стандартного следа оружия не должно было незаметно перекрасить атмосферное оформление. Метеоры в небе, падающие метеоры и кометы сохраняли отдельные цветовые решения — это разные явления, даже если каждое оставляет светящийся след.
Свет и заметность объектов получили собственные пресеты. Среди игровых вариантов были яркое, насыщенное, монохромное оформление и «Ничего лишнего»; отдельно подбирались световые решения для AVFX. Такой пресет не включал вместо пользователя дождь или растения: он задавал условия освещения. Настройки подсветки моделей, их частей и обычного bloom сохранялись своим набором. Это позволяло менять атмосферу карты, не теряя однажды подобранную читаемость противника.
Появился и необязательный музыкальный эмбиент здоровья и брони. Девять состояний связывали настроение фоновой музыки с запасом защиты; переходы плавно перекрывались. Одиночная игра и deathmatch включались раздельно, а явно выбранный онлайн-трек или музыкальный пресет имели преимущество. Это был дополнительный способ чувствовать состояние персонажа, а не новый источник сведений о сопернике.
Пользователь мог заменять звуковые материалы и музыку вступления. Для интро не требовалось пересобирать клиент или ограничиваться заводскими именами композиций: поддерживался свой набор FLAC с разделением по языку, а продолжительность учитывалась по самому файлу. При отсутствии подходящей музыки визуальное вступление оставалось. Подробности упаковки относились уже к руководству; для игрока важнее было, что его оформление не обязано звучать только так, как выбрали при выпуске.
Небольшое, но полезное дополнение сохраняло историю успешных подключений. Она была общей для модов: после нового запуска можно было вернуться на последний сервер, а при желании — входить туда автоматически. Неудачная попытка и простое обновление пинга историю не засоряли. На фоне сложной графики такая функция легко теряется в перечне изменений, хотя именно она каждый день сокращает путь от запуска клиента до игры.
