Многопоточность в STALKER New Project
Давняя проблема с отсутствием многопоточности в оригинальном движке XRay сильно ограничивала модмейкеров в творчестве, вынуждая сокращать уровень детализации своих проектов в угоду приемлемому FPS. Говоря простыми словами, огромное количество сложных вычислительных задач игры «сливались в бутылочное горлышко», что значительно замедляло их совокупную обработку, и как следствие — заметно снижало FPS при в высоко детализованных сценах. Однако в последние несколько лет многие программисты известных проектов вселенной STALKER в той или иной степени решили проблему путём глубокой модификации движка, создав возможность распределения задач по нескольким вычислительным потокам. Мы не стали исключением и также адаптировали систему многопоточности в движок STALKER New Project. В этой статье мы расскажем, как с её помощью нам удалось кратно увеличить стабильность и производительность нашей игры.
🔸 История проблемы
Многие знают, что оригинальный движок XRay не обладал какой-либо значимой многопоточностью. В частности, движок игры располагал всего двумя потоками для подготовки и отрисовки кадра: основной, который выполнял ~95% всех задач, и вспомогательный, выполняющий небольшие периферийные задачи.
Оригинальный движок хорошо справлялся с отрисовкой большинства игровых сцен оригинальной трилогии. Однако для сложных и высоко детализированных модификаций, не говоря уже о масштабных аддонах, возможностей оригинального XRay было недостаточно. Эту проблему уже хорошо заметно во всем известном проекте STALKER Lost Alpha, хотя изобилием детализации и широким A-life он явно не обладает.
На выходе из бункера Сидоровича можно было заметить кратное снижение FPS в виду того, что в кадр одновременно попадало большое количество объектов. Так, на выходе из бункера Сидоровича можно было заметить кратное снижение FPS в виду того, что в кадр одновременно попадало большое количество объектов.
Локации STALKER New Project могут похвастаться, пожалуй, самой высокой детализацией из всех известных проектов. Однако, чтобы вся эта детализация не была испорчена низким FPS нам пришлось потратить много времени на оптимизацию движка, в том числе на внедрение многопоточности.
Стоит также отметить, что в оригинале все NPC, монстры и другие игровые объекты за радиусом 150 метров отсекаются из полноценной обработки. Для STALKER New Project мы сделали очень большие локации, и чтобы на всём их пространстве A-life действительно выполнял то, что от него ждут игроки, мы увеличили его радиус до 1000 метров. Однако на таких дистанциях возможности оригинального движка также сводят на нет стабильность игры и частоту кадров. Это ещё одна причина почему мы посвятили много времени разработке системы многопоточности для нашей игры.
🔸 Разработка системы многопоточности
Нами был разработан собственный планировщик распределения и выполнения многопоточных задач. Он способен правильно распределить задачи по имеющимся потокам, учитывая их загруженность и приоритеты задач. Так же была проведена очень трудоемкая и сложная работа по адаптации оригинального кода под возможность параллельного выполнения большого количества вычислительных задач.
Проделанная работа дала плоды: стабильность и производительность игры кратно возросли. Приведём наглядный пример. Ниже представлены скриншоты игры в нашей самой сложной на данный момент сцене – Депо и бар «Последний вагон», главное пристанище сталкеров на Свалке. Чтобы сравнение было наиболее честным, мы приложили три скриншота: без многопоточности, c включением многопоточности только оригинального движка и с полной многопоточностью, разработанной для New Project. Обратите внимание на счётчик FPS, расположенный в правом верхнем углу.
Без проделанной работы по внедрению полноценной многопоточности нам пришлось бы отказаться от высокой детализации, или же игрокам пришлось бы довольствоваться 9-14 FPS даже на самых мощных ПК.
Стоит ли говорить о многочисленных оптимизациях кода игры, которые хоть и не связаны с многопоточностью, но тем не менее кратно увеличивают стабильность и быстродействие движка.
Взгляните на скриншот профайлера. Здесь в левом столбце находится список потоков движка, а правее от каждого потока располагается линейка одного взятого кадра. На ней уже можно разглядеть, что конкретно выполнял поток за время этого кадра.
Так же в качестве пищи для размышлений мы прикладываем скриншоты диспетчера задач Windows с запущенным на фоне STALKER New Project.
Здесь можно увидеть, как сильно изменилась утилизация потоков ЦП после внедрения многопоточности в наш движок. Тесты проводились на ноутбуке с процессором Intel 12900HK с отключенными E-ядрами при средней скорости процессора 3.8-4.2 ГГц.
🔸 Вместо заключения
Стоит отметить, что порой внедрение многопоточности несёт за собой многие подводные камни в виде логических и визуальных багов. Однако нам удалось провести грамотную интеграцию без ущерба стабильности игры.
Таким образом благодаря системе многопоточности нам удалось настолько сильно повысить производительность движка нашей игры, что дало нам возможность реализовать все наши идеи по level-дизайну и геймплею без ущерба производительности.
В дальнейшем мы планируем сделать еще больше улучшений по многопоточности рендера, игровых вычислений и других аспектов движка. Если вы хотите быть в курсе хода этой разработки, а также и остальных аспектов игры, то подписывайтесь на VK Donut или Boosty. Там мы выкладываем более детальные посты про ход разработки каждые 5 дней, а подписчики 2 и 3 уровней получают очень приятные бонусы, в том числе ранний доступ к игре раз в полгода.
Следите за разработкой:
🔹 Сервер Discord
🔹 Страница Ap-Pro
🔹 Страница ModDB