Откуда низкий FPS или развеивание мифов и суеверий о движке

Сообщения
105
Реакции
194
Стремление сделать так, чтобы на карте было как можно меньше wpoly и/или epoly наверняка не понаслышке знакомо каждому мапперу, стоит лишь добраться до какого-то порогового числа полигонов, как FPS на карте становится совсем неиграбельным. Хотя, казалось бы, на дворе уже 2020 год и любое компьютерное железо должно без проблем тянуть игру конца 20-го века? Однако, тут не всё так просто. Давайте разбираться.
Хотя прошло уже много лет, но GoldSrc за всё это время лишь незначительно изменился от своего первоначального состояния, то есть алгоритмы и методы отрисовки графики у него остались на уровне конца 90-х годов. Но видеокарты и графические API за это время как раз таки сильно изменились. Чтобы понять, в чём же лежит корень проблемы, нужно описать как происходит процесс рендеринга в игре. И ради понятности всего этого, я пренебрегу деталями и точностью описания этого процесса.
Начнём с того, что обьекты (мир, модели игроков/оружия, и т.д), которые рендерит игра, состоят из полигонов (как правило это треугольники, в контексте описания будем считать так). Но из чего же состоят треугольники? А они состоят из вершин, которые в свою очередь являются обычными точками в 3х-мерном пространстве и описываются тремя числами-координатами по осям X, Y, Z. И чтобы отрисовать что-нибудь, нужно сначала загрузить в видеокарту всю нужную информацию, включая эти самые вершины, конечно же. Вот как раз в этом плане графические API сильно изменились.
Примечание: GoldSrc для отрисовки графики использует API OpenGL, в его контексте и будет вестись описание.


Примерно такой алгоритм загрузки данных в видеокарту был во времена релиза Half-Life
Этот алгоритм повторяется каждый кадр отрисовки игры.
  1. Подготавливаем нужные данные для загрузки
  2. Отправляем вершину #1
  3. Отправляем вершину #2
  4. Отправляем вершину #3
  5. ...
  6. Отправляем последнюю вершину
  7. Отправляем видеокарте команду рендеринга
Но в отправке данных для рендеринга видеокарте есть одна особенность: мы можем отправить ей за один раз большое или малое количество данных, но именно сам процесс отправки займёт некоторый промежуток времени, которой нам придется подождать до отправки следующей части данных. Ну и как можно заметить, в приведённом выше алгоритме рендеринга, ждать приходится после отправки каждой вершины! Что конечно же очень и очень бьёт по производительности. :wacko:
Но это только раньше было так. Сейчас такой подход к отрисовке в OpenGL называется immediate mode и призван устаревшим и слишком медленным. Но в движке HL1 используется как раз он, ещё с тех самых времён, когда игра только вышла в свет.
Для сравнения, в современных играх процесс отрисовки выглядит примерно так: подготовка данных -> отправка всех вершин целиком за один раз (в OpenGL это достигается использованием VAO и VBO) -> отрисовка. А в некоторых случаях даже возможно отправлять данные не каждый кадр, а лишь единожды, если точно известно что эти данные не будут изменяться.

Но, к сожалению, проблема не в одном лишь immediate mode, в отрисовке мира тоже есть один немаловажный нюанс. Как многие слышали, GoldSrc использует BSP-дерево. Используется это дерево для некоторых задач, например:
  • просчёт физики игрока/монстров/предметов (обнаружение столкновений)
  • проверка чего-либо на видимость игроком (NPC/полигон/энтити и т.д.)
Во втором случае дерево используется для оптимизации процесса отрисовки мира, чтобы рисовать только те полигоны, которые игрок видит. И это в принципе хорошо работает на картах с закрытым пространством, но на картах с открытым пространством, наоборот, возникает парадоксальная ситуация, когда процесс определения видимых игроком полигонов происходит дольше, чем сама отрисовка этих обьектов. Логично, что такая "оптимизация" не имеет никакого смысла, а несёт только вред. Такая ситуация возникает потому, что BSP-дерево в таком виде, в каком оно реализовано в движке GoldSrc, плохо подходит для отрисовки открытых пространств - оно получается слишком избыточное и огромное, найти в нем нужную информацию быстро не получится. Именно поэтому, как правило, число wpoly сильнее влияет на итоговый FPS, чем число epoly.
Ещё стоит подметить, что несмотря на то, что у проблемы существуют обьективные причины, всё же с ней сталкиваются не все игроки и мапперы. Как правило эта проблема проявляется на ноутбуках, особенно с видеочипами от 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 кадров в секунду.
"Вот у вас лагает, потому что вы купили AMD, покупайте Nvidia и забудете о лагах."
Не факт. Хотя обычно на видеокартах Nvidia эта проблема реже выражена, но нет никаких гарантий что она перестанет себя проявлять.

Ну что же, самое важное я, вроде, описал. Теперь можно немного затронуть методы решения этой проблемы.
В случае GoldSrc в теории можно создать что-то вроде MetaRenderer'а, который будет прерывать процесс отрисовки внутри движка, и отрисовывать мир по-другому, оптимальным и быстрым путём. Заодно можно будет ещё и графические фичи прикрутить в виде различных шейдеров. В случае Xash3D возможностей, конечно, больше, но расписывать это в подробных технических деталях не вижу смысла, статья всё же создавалась в другой целью.
Надеюсь, что эта статья внесёт объективность и понимание в те самые просадки FPS, которые мучают и сильно ограничивают некоторых мапперов в возможностях и мешают игрокам комфортно играть.
 
Сообщения
2
Реакции
3
Отлично! Спасибо за статью.
Что нравится, это то, что написано простым, доступным языком без мудрствования. Класс!

Можно бы даже сделать список карт АМД и Нвидиа, на которых тормозят и не тормозят игры на голде.
По моему опыту, на GTX 550Ti и GTX 1080 Ti ничего не тормозит. И тормозит на большинстве карт АМД.
По утверждению моего друга, тормозит на Nvidia 9600 GT.
Вы тоже пишите свой опыт использования разных карт на этом двигле.
 
Сообщения
105
Реакции
194
Из моего опыта расклад такой
GeForce 9800 GT - не тормозит
GT 420 - тормозит
GTX 650 - не тормозит
GTX 1050 - не тормозит
Radeon HD 6320 - тормозит
 

ssx

Сообщения
289
Реакции
73
На более менее слабых видяхах нвидиа по стандарту в дыму просадка ФПС, нужно выкручивать 3d ползунок на "производительность".

На Слабых видяхах, в том числе встроенных - юзаю конфиг для максимальной производительности, low poly модели игроков\оружия и желательно линукс.

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

Radeon HD 6320 - тормозит
У меня раньше была radeon hd 5350, 100 фпс стабильно без просадок.
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
ssx, тут, скорее, проблема в самой игре.
 
Сообщения
105
Реакции
194
У меня раньше была radeon hd 5350, 100 фпс стабильно без просадок.
При каких значениях wpoly/epoly?
19 Июл 2020
Вот кстати говоря, на некоторых видеокартах порой помогает попробовать разные версии драйверов, правда это довольно рискованно, т.к. некоторые программы наоборот могут перестать работать (из-за кривости драйвера, конечно).
 

ssx

Сообщения
289
Реакции
73
При каких значениях wpoly/epoly?
При стандартных настройках в кс и выкрученных на производительность настройках видеокарты.
В те времена ещё не заморачивался с low poly модельками и т д настройками чтоб выжать максимум производительности ибо и так было не менее 100.

А вот на ноутбуке с Intel HD Graphics 3000 пришлось выкручивать макс производительность (видяха, конфиг, low poly модели игроков\оружия) чтобы 60-100 фпс получить на WIN10. Хотя на линукс (минт) при тех же конфигах и модельках не менее 100 фпс.
 
Сообщения
225
Реакции
90
Помог
1 раз(а)
ssx, в десятке в реестре покопаться нужно. Там были помню значения вроде superfetch и prefetch.
 
Сообщения
225
Реакции
90
Помог
1 раз(а)
SNMetamorph, наблюдения показали, что влияет. Один из параметров вообще рудимент насколько помню.
 
Сообщения
105
Реакции
194
Теперь можно немного затронуть методы решения этой проблемы.
В случае GoldSrc в теории можно создать что-то вроде MetaRenderer'а, который будет прерывать процесс отрисовки внутри движка, и отрисовывать мир по-другому, оптимальным и быстрым путём.
Я бы даже мог попробовать за это взяться, есть понимание того как это реализуется, но к сожалению не могу сразу несколькими делами заниматься. Либо же можно было бы скооперироваться с несколькими программистами, которые знакомы с движком и HLSDK.
 
Сообщения
3,579
Реакции
1,569
Помог
137 раз(а)
А почему про процессор ничего не сказано? Производительность не только от видеокарты зависит.
 

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
344
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Сообщения
105
Реакции
194
А почему про процессор ничего не сказано? Производительность не только от видеокарты зависит.
Та же история и с оперативной памятью, ибо от неё тоже многое зависит.
Разумеется, что это всё влияет, но в контексте этого движка едва ли встретятся связанные с процессором/ОЗУ проблемы так как в движке узкое место - код рендеринга.
Кроме этого, сейчас тяжело найти процессор, из-за которого в игре были бы проблемы с FPS: у меня всё прекрасно работало на одноядерном целероне. Аналогичная ситуация с оперативной памятью - 1 гигабайта для движка вполне достаточно, но уже давно у всех стоит гораздо больше.
 
Сообщения
499
Реакции
271
Помог
6 раз(а)
Кроме этого, сейчас тяжело найти процессор, из-за которого в игре были бы проблемы с FPS: у меня всё прекрасно работало на одноядерном целероне. Аналогичная ситуация с оперативной памятью - 1 гигабайта для движка вполне достаточно, но уже давно у всех стоит гораздо больше.
Считайте, вы нашли человека с такими проблемами) У меня одноядерный процессор 2 ГГц + 700 ОЗУ ДДР1 :D
 
Сообщения
105
Реакции
194
Считайте, вы нашли человека с такими проблемами) У меня одноядерный процессор 2 ГГц + 700 ОЗУ ДДР1 :D
Жесть, это ноутбук такой? Ну по идее и этого всего должно хватать.
 
Сообщения
499
Реакции
271
Помог
6 раз(а)
SNMetamorph, не, компьютер именно. И для полного антуража монитор SamTron 76E. На серве с минимумом нагрузки на клиента, картой до 650 wpoly в кадре и настройкой производительности, просадок нет почти. На модовых не тяжёлых серверах может аж до 9 просесть, в зависимости от карты и количества человек в кадре. Ну, короче, такое себе.
 
Сообщения
8
Реакции
-4
Тема уже заброшена, но всё же. Интересно почему у меня в ксго на порядок выше ФПС чем в 1.6, видеокарта не слишком слабая(1080Ти), для 1.6 вообще перебор и процессор R5 2600x, ОЗУ 32 Гб 3000 МГц, с 16-17-17-17-36-60 таймингами, по итогу в 1.6 ФПС на дефолтном конфиге и сервере без моделей и подобной ху**те нагружающей всё что движется на мираже имею 217-240 ФПС, с выключенным худом 400-500, в ксго 380-420 ФПС на мираже в мм.
 
Последнее редактирование:

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу