Разработчик
Участник
Пользователь
- Сообщения
- 105
- Реакции
- 194
Стремление сделать так, чтобы на карте было как можно меньше wpoly и/или epoly наверняка не понаслышке знакомо каждому мапперу, стоит лишь добраться до какого-то порогового числа полигонов, как FPS на карте становится совсем неиграбельным. Хотя, казалось бы, на дворе уже 2020 год и любое компьютерное железо должно без проблем тянуть игру конца 20-го века? Однако, тут не всё так просто. Давайте разбираться.
Хотя прошло уже много лет, но GoldSrc за всё это время лишь незначительно изменился от своего первоначального состояния, то есть алгоритмы и методы отрисовки графики у него остались на уровне конца 90-х годов. Но видеокарты и графические API за это время как раз таки сильно изменились. Чтобы понять, в чём же лежит корень проблемы, нужно описать как происходит процесс рендеринга в игре. И ради понятности всего этого, я пренебрегу деталями и точностью описания этого процесса.
Начнём с того, что обьекты (мир, модели игроков/оружия, и т.д), которые рендерит игра, состоят из полигонов (как правило это треугольники, в контексте описания будем считать так). Но из чего же состоят треугольники? А они состоят из вершин, которые в свою очередь являются обычными точками в 3х-мерном пространстве и описываются тремя числами-координатами по осям X, Y, Z. И чтобы отрисовать что-нибудь, нужно сначала загрузить в видеокарту всю нужную информацию, включая эти самые вершины, конечно же. Вот как раз в этом плане графические API сильно изменились.
Примерно такой алгоритм загрузки данных в видеокарту был во времена релиза Half-Life
Этот алгоритм повторяется каждый кадр отрисовки игры.
Но это только раньше было так. Сейчас такой подход к отрисовке в OpenGL называется immediate mode и призван устаревшим и слишком медленным. Но в движке HL1 используется как раз он, ещё с тех самых времён, когда игра только вышла в свет.
Для сравнения, в современных играх процесс отрисовки выглядит примерно так: подготовка данных -> отправка всех вершин целиком за один раз (в OpenGL это достигается использованием VAO и VBO) -> отрисовка. А в некоторых случаях даже возможно отправлять данные не каждый кадр, а лишь единожды, если точно известно что эти данные не будут изменяться.
Но, к сожалению, проблема не в одном лишь immediate mode, в отрисовке мира тоже есть один немаловажный нюанс. Как многие слышали, GoldSrc использует BSP-дерево. Используется это дерево для некоторых задач, например:
Ещё стоит подметить, что несмотря на то, что у проблемы существуют обьективные причины, всё же с ней сталкиваются не все игроки и мапперы. Как правило эта проблема проявляется на ноутбуках, особенно с видеочипами от AMD и Intel, притом что на ПК с Nvidia обычно никаких проблем нет. И причина тут далеко не том, что видеочипы недостаточно мощные, чтобы обеспечить нормальное число FPS, а в том, как в драйверах на эти чипы реализован тот самый immediate mode: Nvidia в этом плане не подкачали, а вот у AMD и Intel - полная беда. Можно даже сказать, что число FPS в играх на этом движке зависит не от мощности видеокарты, а от её совместимости с движком. Кстати говоря, в Sven Coop, хотя разработчики уже давно имеют исходники движка, там ничего не пофикшено и все вышеописанные проблемы точно так же актуальны на данный момент.
Ну, после того как я описал причины низкого FPS, можно перейти к рассмотрению заблуждений и мифов, которые имеют место быть в коммьюнити.
Но и мои знакомые до сих пор слышат это от многих мапперов, которые вообще не верят в эту проблему. А иногда и забивают на оптимизацию карт.
Как говорилось в начале, современное железо действительно в теории может спокойно тянуть графику HL1 и CS 1.6. Но на практике это не получается из-за вышеописанных проблем. А ещё на практике можно заметить, что компьютер в какой-либо тяжелой современной игре может выдавать 50-60 FPS, при этом на некоторых картах в CS может быть всего лишь 20-30 кадров в секунду.
Ну что же, самое важное я, вроде, описал. Теперь можно немного затронуть методы решения этой проблемы.
В случае GoldSrc в теории можно создать что-то вроде MetaRenderer'а, который будет прерывать процесс отрисовки внутри движка, и отрисовывать мир по-другому, оптимальным и быстрым путём. Заодно можно будет ещё и графические фичи прикрутить в виде различных шейдеров. В случае Xash3D возможностей, конечно, больше, но расписывать это в подробных технических деталях не вижу смысла, статья всё же создавалась в другой целью.
Надеюсь, что эта статья внесёт объективность и понимание в те самые просадки FPS, которые мучают и сильно ограничивают некоторых мапперов в возможностях и мешают игрокам комфортно играть.
Хотя прошло уже много лет, но GoldSrc за всё это время лишь незначительно изменился от своего первоначального состояния, то есть алгоритмы и методы отрисовки графики у него остались на уровне конца 90-х годов. Но видеокарты и графические API за это время как раз таки сильно изменились. Чтобы понять, в чём же лежит корень проблемы, нужно описать как происходит процесс рендеринга в игре. И ради понятности всего этого, я пренебрегу деталями и точностью описания этого процесса.
Начнём с того, что обьекты (мир, модели игроков/оружия, и т.д), которые рендерит игра, состоят из полигонов (как правило это треугольники, в контексте описания будем считать так). Но из чего же состоят треугольники? А они состоят из вершин, которые в свою очередь являются обычными точками в 3х-мерном пространстве и описываются тремя числами-координатами по осям X, Y, Z. И чтобы отрисовать что-нибудь, нужно сначала загрузить в видеокарту всю нужную информацию, включая эти самые вершины, конечно же. Вот как раз в этом плане графические API сильно изменились.
Примечание: GoldSrc для отрисовки графики использует API OpenGL, в его контексте и будет вестись описание.
Примерно такой алгоритм загрузки данных в видеокарту был во времена релиза Half-Life
Этот алгоритм повторяется каждый кадр отрисовки игры.
- Подготавливаем нужные данные для загрузки
- Отправляем вершину #1
- Отправляем вершину #2
- Отправляем вершину #3
- ...
- Отправляем последнюю вершину
- Отправляем видеокарте команду рендеринга
Но это только раньше было так. Сейчас такой подход к отрисовке в OpenGL называется immediate mode и призван устаревшим и слишком медленным. Но в движке HL1 используется как раз он, ещё с тех самых времён, когда игра только вышла в свет.
Для сравнения, в современных играх процесс отрисовки выглядит примерно так: подготовка данных -> отправка всех вершин целиком за один раз (в OpenGL это достигается использованием VAO и VBO) -> отрисовка. А в некоторых случаях даже возможно отправлять данные не каждый кадр, а лишь единожды, если точно известно что эти данные не будут изменяться.
Но, к сожалению, проблема не в одном лишь immediate mode, в отрисовке мира тоже есть один немаловажный нюанс. Как многие слышали, GoldSrc использует BSP-дерево. Используется это дерево для некоторых задач, например:
- просчёт физики игрока/монстров/предметов (обнаружение столкновений)
- проверка чего-либо на видимость игроком (NPC/полигон/энтити и т.д.)
Ещё стоит подметить, что несмотря на то, что у проблемы существуют обьективные причины, всё же с ней сталкиваются не все игроки и мапперы. Как правило эта проблема проявляется на ноутбуках, особенно с видеочипами от AMD и Intel, притом что на ПК с Nvidia обычно никаких проблем нет. И причина тут далеко не том, что видеочипы недостаточно мощные, чтобы обеспечить нормальное число FPS, а в том, как в драйверах на эти чипы реализован тот самый immediate mode: Nvidia в этом плане не подкачали, а вот у AMD и Intel - полная беда. Можно даже сказать, что число FPS в играх на этом движке зависит не от мощности видеокарты, а от её совместимости с движком. Кстати говоря, в Sven Coop, хотя разработчики уже давно имеют исходники движка, там ничего не пофикшено и все вышеописанные проблемы точно так же актуальны на данный момент.
Ну, после того как я описал причины низкого FPS, можно перейти к рассмотрению заблуждений и мифов, которые имеют место быть в коммьюнити.
Очень маловероятно. Если только человек по незнанию сам себе не ограничил FPS через консоль, или по-другому накосячил, но это уже исключительный случай."Это всё из-за неправильных конфигов!"
Я тоже так раньше думал, пока лично не встретился с этой проблемой и не разобрался в причинах."У тебя просто железо слабое, не морочь людям головы и просто купи себе новое - будет нормальный FPS"
Но и мои знакомые до сих пор слышат это от многих мапперов, которые вообще не верят в эту проблему. А иногда и забивают на оптимизацию карт.
Как говорилось в начале, современное железо действительно в теории может спокойно тянуть графику HL1 и CS 1.6. Но на практике это не получается из-за вышеописанных проблем. А ещё на практике можно заметить, что компьютер в какой-либо тяжелой современной игре может выдавать 50-60 FPS, при этом на некоторых картах в CS может быть всего лишь 20-30 кадров в секунду.
Не факт. Хотя обычно на видеокартах Nvidia эта проблема реже выражена, но нет никаких гарантий что она перестанет себя проявлять."Вот у вас лагает, потому что вы купили AMD, покупайте Nvidia и забудете о лагах."
Ну что же, самое важное я, вроде, описал. Теперь можно немного затронуть методы решения этой проблемы.
В случае GoldSrc в теории можно создать что-то вроде MetaRenderer'а, который будет прерывать процесс отрисовки внутри движка, и отрисовывать мир по-другому, оптимальным и быстрым путём. Заодно можно будет ещё и графические фичи прикрутить в виде различных шейдеров. В случае Xash3D возможностей, конечно, больше, но расписывать это в подробных технических деталях не вижу смысла, статья всё же создавалась в другой целью.
Надеюсь, что эта статья внесёт объективность и понимание в те самые просадки FPS, которые мучают и сильно ограничивают некоторых мапперов в возможностях и мешают игрокам комфортно играть.