скачет frametime как исправить
Время кадра в играх
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Вытащить время кадра
Доброго времени суток. Подскажите, как вытащить время кадра из видео? #Активировать устройство.
Загрузка ЦП 80-100% во время лагов в играх
Здраствуйте! И так, начнем. У меня существует такая проблема, когда играю в игры (не важно.
С коробки пробовал. Тот что винда автоматически ставит. И загрузкой с официального сайта невидии.
Мне пришёл ответ от производителя
«Параметр время построения кадра (Frame time) зависит от разных
факторов, в частности, от игрового движка, игровых настроек, версии
драйверов видеокарты, производительности процессора, которая в
сочетании с производительностью подсистемы памяти при таком количестве
кадров в секунду, как правило, является определяющим фактором, так что
по количеству кадров в секунду причина не в видеокарте, объёма
оперативной памяти, производительности дисковой подсистемы, в сетевых
играх от качества сетевого соединения и сетевого кода и т. д., так что
можете проверить влияние соответствующих факторов»
Тему драйверов думаю, можно закрыть.
Игра абосолютно любая, так что это тоже не то.
Вот реально, из всех подозреваемых остаётся только мать, а ты попробуй докажи в сервисе что она в чем-то виновна. Я конечно не разбираюсь, может между процессором и видеоадаптером пропускная способность шалит?
Добавлено через 40 секунд
Или как это называется, терминами не владею
Добавлено через 6 часов 18 минут
kumehtar, слушай, а вот в порядке бреда, если это не видеокарта и не оперативк, даже не бп. Что может быть виновником?
Процессор частоты не сбрасывает, с ним вроде все окей. Но какой косяк может быть в материнке, чтобы такую проблему вызывать..
Как избавиться от разрывов изображения в играх: о вертикальной синхронизации V-sync
Содержание
Содержание
Проблемы с качеством изображения в видеоиграх могут возникнуть у любого геймера. Независимо от того насколько мощный у вас ПК. Хотя на старых «машинах» такое встречается все же чаще. В статье разберем, что такое V-sync и чем отличается от G-Sync или FreeSync.
Tearing
Разрывы кадров (известные также как тиринг, от англ. Tearing), словно некто порезал картинку в игре на части и неровно склеил, могут серьезно попортить нервы геймеру. Не дав вам возможности, не то что с головой погрузиться в игру, но и просто нормально ее пройти. Выглядит это так:
Чтобы понять, как бороться с разрывами изображения, нужно знать причину их появления. Тут все предельно просто — тиринг вызван отсутствием синхронизации работы видеокарты и монитора. То есть видеокарта генерирует кадры с непостоянной частотой (это называется FPS, фреймрейт). Скорость создания новых кадров зависит от сложности 3D-сцены в видеоигре. Монитор же способен выводить кадры только с фиксированной частотой. Вот из этого несоответствия и рождаются разрывы изображения.
Если бы видеокарта по умолчанию успевала бы отрисовывать кадры перед отправкой их на монитор (как показано на схеме), то разрывы картинки канули бы в Лету. Но это недостижимая мечта.
Для плавной картинки, которую способно воспринимать человеческое зрение нужно минимум 25 к/с, иначе задержки становятся видны невооруженным глазом. Например, у вас монитор с частотой обновления 60 Гц (60 к/с). И слабенькая видеокарта, которая не справляется с генерацией кадров. Она не поспевает за монитором — тот обновляет картинку быстрее, чем видеокарта обрабатывает новые сцены. Поэтому, вместо нового целого кадра, который видеочип не успел создать полностью, монитору приходится показывать половину нового и половину старого кадра. Это и есть разрыв изображения.
Понятно, что эта конкретная проблема вызвана программной стороной медали. Поэтому и исправлять ее мы будем тоже программно.
Частота обновления монитора
Но прежде небольшое лирическое отступление про мониторы. Разные модели могут отличаться частотой обновления изображения. Стандартные 60 Гц — для обычных геймеров, максимальные 240 Гц — для киберспортсменов. Чем выше частота (известная также как вертикальная разверстка монитора), тем чаще обновляется изображение. И тем выше шанс, что задержек изображения и разрывов станет меньше. Однако в корне это проблему не решает. Есть куда более изящное решение, не требующее от вас покупки нового «киберспортивного» монитора.
Схема, наглядно показывает разницу во времени для мониторов с разной частотой обновления.
Еще лучше разницу частоты обновления в мониторах демонстрирует данное видео.
V-Sync — вертикальная синхронизация
И тут на сцену выходит технология V-Sync, известная как вертикальная синхронизация. Каждый внимательный геймер находил такой пункт в настройках практически любой видеоигры. При желании ее можно найти и в интерфейсе для вашей видеокарты под названием «Вертикальный синхроимпульс» (для интерфейса Nvidia). Это пригодится, если в настройках игры нет пункта «Вертикальная синхронизация» (такое часто можно наблюдать в инди-играх).
Вертикальная синхронизация — это технология, которая синхронизует работу видеокарты и монитора. При ее включении генерация кадров графическим процессором привяжется к частоте отображения кадров монитора.
Какие плюсы несет игроку такая привязка? Во-первых, гарантированно исчезнут разрывы изображения.Теперь кадры будут поступать на монитор в такт с частотой обновления изображения. Картинка в видеоигре станет плавной и красивой.
Во-вторых, если видеокарта мощная и выдает FPS больше, чем позволяет отобразить стандартный монитор (60 Гц), то вертикальная синхронизация снизит нагрузку на видеочип. Это позволит уменьшить нагрев видеокарты и шум системы охлаждения. Нетрудно догадаться, что это продлит срок службы графического процессора.
Казалось бы, все прекрасно. Врубай V-Sync и наслаждайся игрой. Но не тут то было. Подводные камни вертикальной синхронизации куда больше айсберга, потопившего легендарный Титаник. Большинство геймеров V-Sync выключают и терпят разрывы кадров. Почему?
Схематичная работа видеокарты и монитора при отключенной вертикальной синхронизации. Картинку рвет на две части.
Потому что включенная V-Sync может вызывать задержки вывода картинки (тормоза, фризы, инпут-лаг) во время игры. Это связано с тем, что рендеринг кадра в сложной сцене занимает больше времени, чем цикл отображения изображения на мониторе. И, если без V-Synk монитор покажет нам разорванную картинку из двух кадров, но без задержек, то в обратном случае мы увидим на экране снова старый кадр. То есть игра, хоть и на короткое время, но подвиснет.
Схематичная работа видеокарты и монитора при включенной вертикальной синхронизации. Один и тот же кадр нам показывают два раза. А это означает подвисание картинки.
Тогда зачем она нужна? Вертикальная синхронизация хороша для «медленных» игр с одиночным прохождением. Таких, где вопрос визуальной красоты стоит важнее, чем скорость геймплея. Например, The Vanishing of Ethan Carter. Также ее рекомендуют включать, если вы играете в старую игру на мощном ПК (чтоб увеличить срок службы видеочипа).
Существует еще Adaptive Sync — адаптивная синхронизация, которая представляет собой улучшенную версию вертикальной. Она «адаптируется» под ситуацию и работает так: если появились разрывы — убирает их, включая V-Sync. А если картинка сильно тормозит — ускоряет ее, отключая V-Sync. Что приводит к появлению тиринга. Это, своего рода, «костыль», который кардинально проблему не решает.
В итоге игроки оказываются перед выбором: плавная картинка с задержками или рваное изображение, но без тормозов. Куда не кинь — всюду клин. Однако разработчики NVIDIA сумели избавить игровую индустрию и от этой дилеммы.
G-Sync — синхронизация от Nvidia
Отличие G-Sync от V-Sync заключается в том, что за рендеринг кадров и вывод их на монитор здесь полностью отвечает видеокарта. Она генерирует кадры и «приказывает» монитору их выводить только тогда, когда кадр полностью отрисован. При таком подходе частота обновления изображения из постоянной величины превращается в динамическую (при V-Sync или без нее — время обновления всегда жестко фиксировано). То есть, как только кадр готов, он сразу же появляется на экране — игроку не приходится ждать окончания цикла обновления изображения.
Плавность изображения – результат работы G-Synk. Кадры поступают на монитор сразу же после их полной отрисовки
Технология G-Sync избавляет геймера от разрывов изображения, зависаний картинки, рывков и артефактов, связанных с выводом кадров на монитор. Плавная быстрая цельная картинка — предел мечтаний true-геймера, но…
Во-первых, G-Sync имеет ограниченный диапазон использования, выраженный в FPS: от 30 к/с до 240 к/с. Максимальная планка зависит от вашего монитора. Например, 30–60 к/с для стандартного 60 Гц экрана. И если FPS упадет ниже границы и станет 25 к/с, то толку от G-Sync будет не больше, чем от обычной вертикальной синхронизации.
Во-вторых, воспользоваться G-Sync смогут только те пользователи, у которых и видеокарта, и монитор поддерживают данную технологию. И к тому же, оснащены популярным интерфейсом DisplayPort 1.2. И если с видеочипом все просто (G-Sync поддерживают все видеокарты, начиная с GeForce GTX 650 Ti Boost и выше), то монитор, возможно, придется сменить. А модели, поддерживающие данную технологию, стоят дороже, чем устройства без нее. Но и тут у нас есть альтернатива…
FreeSync — синхронизация от AMD
FreeSync — это аналог и ответ компании AMD на технологию Nvidia G-Sync. Она обеспечивает все те же прелести, что и ее предшественник, но за меньшую стоимость. Это объясняется тем, что G-Sync это запатентованная технология от Nvidia, использование которой требует лицензии (то есть дополнительных трат от производителей мониторов). FreeSync от AMD распространяется бесплатно.
Для ее использования вам понадобятся: подходящая видеокарта, монитор и интерфейс DisplayPort. Здесь подойдет видюха, начиная с серии Radeon HD 7000, выпущенной в 2012 году и любые новые экземпляры. Мониторов, поддерживающих данную технологию, тоже немало. И стоят они значительно дешевле, чем их G-Synk конкуренты. Еще один плюс FreeSync — увеличенный диапазон использования от 9 к/с до 240 к/с.
Отметим, что FreeSync можно запустить, даже имея на борту связку — видеокарта Nvidia+FreeSync монитор. Нужна лишь любая видеокарта Nvidia Geforce серии 10 (с архитектурой Pascal) и более новые, поддерживающие DisplayPort Adaptive-Sync. И немного сноровки для включения FreeSync в настройках NVidia.
Существует несколько уровней технологии FreeSync. На скриншоте хороша видна разница между ними.
Оценить разницу в ощущениях от изображения без вертикальной синхронизации, с ней, а также с G-Sync (на FreeSync будет аналогично) можно на видео ниже.
Когда целесообразно использовать G-Sync или FreeSync? Если у вас частота монитора существенно выше FPS. Например, у вас топовый 144 Гц монитор и устаревшая видеокарта выдающая, например, 30 к/с. В таком случае использование этих технологий эффективно и оправдано. Если ситуация обратная — современная видеокарта последних серий и монитор 60 Гц — читаем дальше.
FastSync и Enhanced Sync
Чтобы окончательно вас запутать в ворохе всех этих технологий, добавим, что существуют еще два вида синхронизаций — FastSync (быстрая синхронизация) от Nvidia и Enhanced Sync (улучшенная синхронизация) от AMD. Это две аналогичные технологии, которые условно можно назвать промежуточным звеном между V-Sync и G-Sync (FreeSync).
Преимущества быстрой/улучшенной синхронизаций налицо: они убирают разрывы и задержки изображения и при этом не требуют покупки нового монитора. Только наличие подходящей видеокарты. Для Fast Sync это видеокарты с архитектурой Pascal и Maxwell, включая Geforce GTX 1080, GeForce GTX 1070 и GeForce GTX 1060. Enhanced Sync поддерживается любыми графическими процессорами и их комбинациями на основе архитектуры GCN и (или) дисплеями с поддержкой технологии AMD Eyefinity.
Но и здесь есть свои ограничения. Чтобы вышеупомянутые технологии приносили толк, нужно чтобы FPS был значительно выше, чем частота монитора. Например, при FPS 120 к/с и частоте монитора 60 Гц использовать быструю/улучшенную синхронизацию имеет смысл.
Кому это нужно? Обладателям мощных видеокарт и стандартных мониторов 60 Гц. Если монитор 144 Гц, а видеокарта устаревшая и выдает FPS в 75 к/с, то FastSync и Enhanced Sync вам не нужны. Здесь необходимо использовать G-Sync или FreeSync.
Важный момент! Технологии синхронизации могут работать в связке, выдавая максимальную плавность картинки и отсутствие задержки.FastSync+G-Sync, Enhanced Sync+FreeSync — это лучшие на сегодняшний день сочетания, гарантирующие великолепные впечатления от игрового процесса.
Стоит знать еще и то, что быстрая синхронизация (Fast Sync) пока не поддерживается для игр DX12.
Артефакты изображения
С разрывами, подергиваниями и подвисаниями, связанными с проблемами вывода кадров с видеокарты на монитор разобрались. Все остальные неприятности, вызванные другими причинами — это артефакты изображения.
Они представляют собой различные искажения картинки. Это не разрывы кадра. Чаще всего полосы на экране, точки, квадратные и прямоугольные скопления, фантомы и другие искажения. Отметим, что неполадки должны наблюдаться именно во время запуска игр или других «тяжелых» графических приложений, нагружающих видеокарту. Если точки на мониторе висят постоянно, то это битые пиксели. Не перепутайте!
Вот здесь на скриншоте явно не артефакт изображения:
Артефакты изображения могут иметь программное или аппаратное происхождение (как показывает практика, чаще всего второй вариант).
Что можно сделать, чтобы избавиться от артефактов программно:
Проблема может крыться и в самой игре. Скачали пиратский репак — получили проблему с изображением. Крайне редкое явление, но может случиться. Тут поможет установка другой версии игры.
Большинство аппаратных проблем, вызывающих артефакты изображения, своими руками решить невозможно. Просто перечислим их для развития кругозора:
Единственный момент, который можно исправить самостоятельно — это если искажения возникают из-за перегрева видеокарты (проверяем температуру специальной программой, например Everest). Можно почистить ее от пыли, заменить термопасту или поменять систему охлаждения на более мощную.
Но и здесь стоит понимать, что если графический процессор устаревший и не справляется с современными играми, то хоть лед к нему приложите (так делать точно не стоит) — кардинально ситуацию это не исправит.
В случае возникновения подозрения, что шалит именно «железо», несем его в специализированный сервисный центр.
Заключение
Если вы заядлый геймер или киберспортсмен и сталкмиваетесь с вышеперечисленными проблемами, то покупка монитора с частотой 144 Гц (и выше) с поддержкой G-Sync или FreeSync технологии + соответствующая видеокарта — вопрос решенный.
Если же вы просто играете время от времени и динамичные шутеры — это не про вас, то вполне можно обойтись стандартным монитором 60 Гц и маломощной видеокартой. В таком случае не забудьте включить виртуальную синхронизацию!
Вступление
На просторах интернета можно найти бессчетное множество статей про видеокарты, но большинство их созданы по одному и тому же принципу: все авторы меряют минимальный и средний FPS, а кто-то еще и максимальный. Насколько ценны эти замеры, насколько объективно они отражают уровень комфорта во время игры? Я пришел к выводу, что не очень, а всё потому, что такая методика совершенно не учитывает микрозадержки, они же микролаги или фризы.
Проблема микролагов известна давно, особенно остро она стояла лет пять назад у владельцев карт ATI. Суть в том, что на долю секунды FPS падает до неприлично низкого уровня, причем делает это с раздражающей регулярностью. В такой ситуации средний FPS будет в полном порядке, поскольку на пару «медленных» кадров приходится тысяча нормальных, а минимальный FPS покажет только худший лаг, он может быть не очень сильным, но проблема в том, что лаги частые!
реклама
В наши дни микролаги преследуют владельцев multi-GPU систем или компьютеров с недостаточным объемом оперативной/видео памяти, а также с банально неудачными версиями драйверов. Кроме того, они проявляются при быстрых перемещениях в плохо оптимизированных для такого поведения движках. Типичные примеры это демо сцены полёта над открытой местностью в шутерах. Огромные локации с высокой детализацией, а тем более «бесшовный» мир обязывают подгружать данные с жесткого диска на лету. Если диск не успевает, фризы не заставят себя долго ждать.
Стоит упомянуть и лаги, возникающие при резком усложнении сцены, а именно при красочных взрывах и разрушениях с реалистичной физикой. С ними такая же проблема: минимальный FPS выявит последствия только самого большого взрыва, а средний FPS практически не будет зависеть от числа этих взрывов.
В такой ситуации не остается ничего другого, кроме как записывать время отрисовки каждого кадра. Тут может помочь популярнейшая программа FRAPS, а точнее ее способность записывать лог frametimes, хотя это еще полдела. Результаты нужно переработать так, чтобы их было удобно воспринимать, и чтобы получить возможность объективно сравнивать разные системы между собой. В данной статье описан мой способ это сделать.
Тестовый стенд и настройки.
Демонстрационные примеры снимались на следующем тестовом стенде:
Скачет frametime как исправить
В первую очередь, стоит понимать, почему лок на каком-то стабильном значении fps настолько важен для комфортной игры. Я бы даже сказал, в каких случаях он важен. Дело все в особенностях работы вертикальной синхронизации. Если ее нет, то никаких проблем с восприятием фреймрейта не возникает, разве что придется потерпеть разрывы экрана. Но, если хотите поиграть с комфортом для глаз, то тут начинается самое интересное.
Несмотря на непостоянный фреймрейт, Xbox-версия Titanfall играется без каких либо неприятных задержек, благодаря отсутствию v-sync.Дело в том, что синхроимпульс заставляет фреймбуферы ждать обновление экрана. То есть появляется определенная фиксированная задержка вывода кадров (frame-time, frame latency), которая влияет не только на плавность картинки, но и на отзывчивость управления. В случае с 60 fps она равна 16 мс, в случае с 30 – 33 мс. Но вот каких-то промежуточных значений при использовании вертикальной синхронизации достичь нельзя. В результате, на тех же 40 fps мы получаем дерганную камеру, так как время рендеринга постоянно скачет между 16 и 33 мс. И чем больше таких резких скачков, тем некомфортнее становится играть – вполне логично.
Наиболее яркий пример – Killzone: Shadow Fall. Это видео наглядно показывает разницу между двумя режимами: 30 и 30-45 fps.Неуловимая проблема тайминга кадров
Технический директор Croteam Ален Ладавач, участвовавший в разработке Serious Sam и Talos Principle, рассказывает, как ему удалось найти причину торможения графики даже на самых мощных машинах.
Наконец-то появилось объяснение того, почему некоторые игры тормозят на вашем PC (и луч надежды на то, что в ближайшем будущем они тормозить перестанут).
Т-т-тормоза
Вы с нетерпением ждали следующей части вашей любимой серии видеоигр для PC и она наконец вышла. На этот раз вы хотите насладиться ею во всей полноте, поэтому потратили деньги и время на тщательную подготовку. Вы заменили процессор, поставили сверхсовременную видеокарту, добавили ещё ОЗУ — чёрт возьми, даже купили RAID на SSD. Игра должна быть плавной с самой заставки.
Предзаказ наконец разблокирован и вы только что завершили установку. В нервном предвкушении вы впервые запускаете игру. Пока всё хорошо — она работает с частотой 60 кадров в секунду. Или, по крайней мере, так сообщает счётчик кадров тюнера GPU. Но что-то не так. Вы делаете мышью резкие, хаотичные движения. Стрейфитесь влево-вправо, и тут игра… начинает тормозить! Блин, да как такое возможно? Как она может тормозить при 60 кадрах в секунду?
Если такое с вами никогда не случалось, то это может показаться смешным. Но если вы их испытали, то, скорее всего, ненавидите тормоза всей душой. Тормоза в играх. Это не старый добрый «лаг». Не низкая частота кадров. Это просто «тормоза», происходящие при высоких частотах кадров на идеальных, супербыстрых машинах. Что это, откуда они взялись и как от них избавиться? Позвольте мне рассказать вам историю…
Тормоза, плавность, скорость… это ведь одно и то же?
Видеоигры работали с частотой 60 fps ещё со времён первых аркадных автоматов в 70-х годах. Обычно ожидается, что игра работает с той же частотой, которая используется дисплеем. Так было до популяризации 3D-игр, в которых впервые стала допустимой пониженная частота кадров. В 90-х, когда «3D-карты» (так мы называли их до того, как они стали «GPU«) начали заменять программный рендеринг, люди играли в игры при 20 fps, а 35 fps считались приличным значением для серьёзных сетевых боёв. Я не шучу.
Сегодня у нас есть супербыстрые машины и «разумеется, они могут работать при 60 fps«. Однако количество разочарованных скоростью игр пользователей как никогда велико. Как такое возможно? Проблема оказывается не в том, что игры не могут работать достаточно быстро, а в том, что они тормозят, даже когда могут работать быстро!
Если почитаете разные игровые форумы, то наверняка найдёте подобные сообщения:
Можно подумать, что это единичные проблемы, но посмотрите на статистику поисковых запросов Google:
За последние пять лет тормоза (stutter) стали (относительно) более серьёзной проблемой, чем скорость!
(Учтите, что это относительные значения. Они не значат, что в целом люди спрашивают о торможениях больше, чем о частоте кадров. Они значат, что запросы о частоте кадров (frame rate) остаются на том же уровне, а количество запросов о тормозах растёт, особенно в последнее время.)
Десяток лет в поисках причины необъяснимых тормозов
Пациент скорее жив, чем мёртв, просто тормозит чуть больше, чем нужно.
Впервые я столкнулся с этой проблемой ещё примерно в 2003 году. Мы работали над Serious Sam 2, и пользователи начали отправлять нам отчёты о том, что они тестировали что-то на пустом уровне, и при перемещениях мыши движения не были плавными. Это сопровождалось очень характерным паттерном на графике частоты кадров, который мы прозвали «кардиограммой».
Мы думали, что где-то в коде есть баг, но не могли его найти. Казалось, что проблема появляется и исчезает случайным образом — после перезапуска приложения, перезагрузки машины… а потом игрок менял какую-нибудь опцию скорости и она исчезала. Потом игрок снова включал эту опцию, но проблема не возвращалась. Она была похожа на призрака.
Очевидно, что эта проблема возникала не только у нас. Наблюдая за теми же проблемами в других играх, мы начали думать, что виноваты драйверы. Но это происходило на видеокартах разных производителей. Даже на разных API (OpenGL, DirectX 9, DirectX 11…) — единственным общим у них было то, что они появлялись на разных машинах, в некоторых сценах… иногда.
Несси, бигфут… почти столь же неуловимые, как и проблема с «кардиограммой».
Мы выпустили ещё несколько игр, но это странное поведение по-прежнему появлялось и исчезало. Некоторых пользователей оно раздражало, и мы рекомендовали им изменить опции скорости — иногда это помогало, иногда нет. Такова жизнь, не правда ли?
Но однажды, в отличный зимний день в начале 2013 года мой коллега Дин позвал меня, чтобы я увидел ещё один пример этой проблемы, который он на тот момент мог относительно стабильно воспроизводить. На этот раз проблема возникала на уровне из Serious Sam 3. Мы экспериментировали с опциями в этой сцене, пока до меня внезапно не дошло. Я понял, в чём была причина! И она была очень проста — неудивительно, что она ускользала от всех в течение десятка лет.
Изменив всего одну очень простую опцию игрового движка, мы смогли заставить эту проблему появляться и исчезать в этой конкретной сцене. Но нам стало сразу же очевидно, что на её качественное решение потребуется гораздо больше усилий. Усилий не только с нашей стороны, но и всей игровой экосистемы PC — программистов драйверов GPU, разработчиков API, поставщиков ОС — каждого.
В чём же была причина всё это время
Хотел бы я показать вам её на примере сцены из Serious Sam 3, которую мы с Дином исследовали пять лет назад. Или даже ещё лучше — на примере тестовой сцены из Serious Sam 2, в которой мы впервые её увидели. Но, к сожалению, после замены «железа» этот ускользающий зверь может переместиться в другую сцену. У меня есть сцена из The Talos Principle, в которой мне недавно удалось воспроизвести эту проблему, и я заснял несколько видео, позволившие проанализировать её более подробно.
Но прежде чем мы начнём, убедитесь, что вы на самом деле смотрите видео в 60 fps. Для просмотра представленных ниже примеров переключитесь в 1080p60, как показано на картинке:
Чтобы смотреть видео в 60 fps, переключитесь в YouTube на 1080p60.
Если вы всё сделаете правильно, а ваш компьютер и веб-браузер способны показывать видео с частотой 60 fps, то представленное ниже видео должно воспроизводиться плавно и без всяких тормозов. Если это не так, то именно поэтому мы и говорим об этом — многие другие приложения тоже демонстрируют такое поведение, не только игры. Пока я могу только рекомендовать вам попробовать посмотреть видео на какой-нибудь другой машине, или просто читать текст.
Проверка, проверка, раз, два, три… Вы должны видеть это видео в плавных 60 fps.
А теперь перейдём к делу. Если вы сталкиваетесь с тормозами, то вероятнее всего это выглядит примерно так:
Вот как выглядят «тормоза при 60 fps». Мы называем этот симптом «кардиограммой».
Да, именно так выглядят «тормоза», даже когда игра работает с 60 fps. Вы могли сталкиваться с чем-то подобным в любой современной игре, и вероятно думали, что «игра не оптимизирована». Так вот, вам стоит пересмотреть свою теорию (о том, что такие тормоза возникают из-за «медленного» рендеринга игры). Если игра «слишком медленная», то это значит, что в какие-то моменты она не сможет достаточно быстро отрендерить один кадр, а монитору придётся заново показывать предыдущий кадр. Поэтому когда мы записываем видео такой игры в 60 fps, то видим «пропущенные кадры». (Это такие кадры, при которых следующий кадр не был отрендерен вовремя, поэтому текущий кадр показывается дважды.)
Ну как, нашли? Нет? Странно, не правда ли.
Видео выглядит не плавным, когда смотришь всю анимацию в целом, но когда рассматриваешь покадрово, разрывов нет!
Как такое может быть?
Позвольте мне объяснить более подробно. Вот сравнение идеально плавного видео и видео с тормозами в виде «кардиограммы», воспроизводимые на 1/20 от исходной скорости, чтобы мы могли видеть отдельные кадры:
Сверху правильное видео с 60 fps, снизу «кардиограмма». Воспроизведение замедлено в 20 раз.
Можно заметить две вещи: во-первых, они действительно воспроизводятся с одинаковой частотой — когда сверху есть новый кадр, снизу тоже есть новый кадр. Во-вторых, они по какой-то причине движутся немного по-разному — есть заметный «разрыв» в середине изображения, который становится то более, то менее заметным.
Внимательный зритель может заметить и ещё одну любопытную деталь: нижнее — тормозящее — изображение — которое считается «медленным»… на самом деле «опережает» правильное. Странно, правда?
Если мы посмотрим на два соседних кадра и их тайминги (заметьте, что во всех показанных мной видео были точные таймеры (с точностью 1/10 000 секунды), то можем заметить нечто очень интересное: первые два кадра идеально синхронизированы, но третий…
Шесть идущих друг за другом кадров из видео с точными таймингами. Верхние — правильные, нижние — с «кардиограммой».
…на третьем кадре мы видим, что дерево в «тормозящем» видео значительно опережает свою копию из правильного видео (обведено красным). Также можно заметить, что на этот кадр, похоже, ушло больше времени (обведено жёлтым).
Постойте… если видео «медленнее», и на кадр «ушло больше времени», то как он может опережать правильный?
Чтобы разобраться в этом, вам нужно понять, как в наше время игры и другие трёхмерные интерактивные приложения реализуют анимации и рендеринг. (Опытные разработчики должны простить меня за то, что я надоедаю им с очевидными вещами, но мне нужно быть уверенным, что текст смогут понять все читающие этот текст игроки.)
Краткая история таймингов кадра
Давным-давно, в далёкой-далёкой галактике… Когда разработчики создавали первые видеоигры, они обычно подстраивались под точную частоту кадров, с которой работает дисплей. В регионах NTSC, где телевизоры работали при 60 Гц, это означало 60 fps, в регионах PAL/SECAM, где телевизоры работали при 50 Гц, это означало 50 fps. Они даже и думать не могли о какой-то возможности «пропуска кадра».
Большинство игр было очень вылизанными и упрощёнными концептами, работавшими на конкретном оборудовании — обычно на аркадном компьютере, или на «домашнем микрокомпьютере», наподобие ZX Spectrum, C64, Atari ST, Amstrad CPC 464, Amiga и т.д. По сути, разработчик создавал дизайн, реализовывал и тестировал игру под конкретную машину и конкретную частоту кадров, и был на 100% уверен, что она никогда не пропустит ни кадра.
Скорости объектов тоже хранились в единицах «кадров». Поэтому говорили, не на сколько пикселей в секунду должен двигаться персонаж, а на сколько пикселей за кадр. Известно, что в Sonic The Hedgehog для Sega Genesis скорость вращения, например, была равна 16 пикселям за кадр. У многих игр даже были отдельные версии для регионов PAL и NTSC, в которых анимации вручную рисовались специально под 50 fps и 60 fps. По сути, запуск при любой другой частоте кадров даже не рассматривался.
Поэтому было очень сложно предсказать, сколько займёт симуляция и рендеринг одного кадра. (Стоит заметить, что на современных консолях «железо» по-прежнему неизменно, но сами игры всё равно часто непредсказуемы и сложны.)
Если мы не можем быть уверенными, при какой частоте кадров будет работать игра, нам приходится измерять текущую частоту кадров и постоянно адаптировать физику и скорость анимаций игры. Если один кадр занимает 1/60 секунды (16,67 мс), а персонаж бежит со скоростью 10 м/с, то в каждом кадре он перемещается на 1/6 метра. Но если кадр перестаёт занимать 1/60 секунды, а вместо этого внезапно начал занимать 1/30 секунды (33,33 мс), то надо начать перемещать персонажа на 1/3 метра (в два раза «быстрее») за кадр, чтобы на экране он продолжал двигаться с кажущейся постоянной скоростью.
Как же игра это делает? По сути она измеряет время в начале одного кадра, а затем в начале следующего и вычисляет разность. Это довольно простой способ, но он очень хорошо работает. То есть простите, он работал хорошо. В 90-х (вспомните фразу «35 fps считались приличным значением для серьёзных сетевых боёв» из начала статьи), людей более чем устраивал этот способ. Но в то время графическая карта (не забывайте, их даже ещё не называли GPU) была очень «тонким» элементом «железа», и попаданием объектов на экран непосредственно управлял основной ЦП. Если в компьютере не было 3D-ускорителя, процессор даже сам отрисовывал эти объекты. Поэтому он точно знал, когда они появятся на экране.
Что происходит сегодня
Со временем у нас появились более сложные GPU, и они становились всё более и более «асинхронными». Это значит, что когда ЦП отдаёт GPU команду отрисовать что-то на экране, то GPU просто сохраняет эту команду в буфер, чтобы ЦП занимался своими делами, пока GPU выполняет рендеринг. В результате это привело к тому, что когда ЦП сообщает GPU, что «это конец кадра», GPU просто сохраняет сообщение как ещё один фрагмент данных. Но он не относится к нему как чему-то особо срочному. Да и как он может — ведь ему по-прежнему нужно обрабатывать часть из ранее переданных команд. Он покажет кадр на экране, когда закончит всю работу, которую ему дали раньше.
Поэтому когда игра пытается вычислить тайминги, вычитая метки времени начала двух кадров, то актуальность этого, грубо говоря… весьма сомнительна. Давайте вернёмся к нашему примеру из коротких видео. У нас есть эти кадры, где камера перемещается вдоль деревьев:
Шесть идущих друг за другом кадров из видео с точными таймингами. Верхние — правильные, нижние — с «кардиограммой».
Теперь вспомните то, что я говорил о таймингах и перемещениях. В первых двух кадрах тайминг кадра равен 16,67 мс (то есть 1/60 секунды), и камера движется на одну и ту же величину и сверху, и снизу, поэтому деревья синхронизированы. На третьем кадре (внизу) игра увидела, что время кадра равно 24,8 мс (что больше 1/60 секунды), поэтому она думает, что частота кадров снизилась и торопится переместить камеру чуть дальше… только для того, чтобы обнаружить, что тайминг четвёртого кадра составляет всего 10,7 мс, поэтому камера движется здесь чуть медленнее, и деревья снова более-менее синхронизируются. (Синхронизация восстановится полностью только спустя два кадра.)
Здесь происходит следующее: игра измеряет то, что она считает началом каждого кадра, а эти тайминги кадров иногда по разным причинам колеблются, особенно на такой высоконагруженной многозадачной системе, как PC. Поэтому в некоторые моменты игра думает, что не успевает обеспечить 60 fps, и в какие-то моменты генерирует кадры анимации, рассчитанные на меньшую частоту кадров. Но из-за асинхронной природы работы GPU он на самом деле успевает обеспечить 60 fps для каждого отдельного кадра этой последовательности.
Именно это мы воспринимаем как тормоза — анимация, сгенерированная под изменяющуюся частоту кадров («кардиограмму») на самом деле отображается с правильной постоянной частотой кадров.
То есть, по сути, здесь нет никакой проблемы — всё действительно работает плавно, просто игра об этом не знает.
При этом мы возвращаемся к началу статьи. Наконец обнаружив причину проблемы (на самом деле, это иллюзия проблемы — ведь её на самом деле нет, так?), вот что мы сделали для проверки:
Сначала мы наблюдаем «кардиограмму», а затем используем небольшой трюк, чтобы избавиться от неё.
В первой части видео вы с самого начала можете увидеть проблему с «кардиограммой». Затем мы изменяем «магическую» опцию, после чего всё становится идеально плавным!
И на этом всё? Достаточно сделать так и всё станет замечательно?
Неужели решение настолько простое?
К сожалению — нет. Это всего лишь тест разработчиков. Если мы перестанем замерять частоту кадров в реальных ситуациях и просто будем предполагать, что она всегда равна 60, то когда она упадёт ниже 60 — а на PC она рано или поздно обязательно упадёт по тем или иным причинам: ОС запустит какой-нибудь фоновый процесс, включится экономия энергии или защита от перегрева GPU/ЦП… кто знает — то всё замедлится.
Итак, если мы изменяем частоту кадров, то возникают торможения, если нет — то всё в какие-то моменты может замедляться. Что же нам делать?
Реальное решение заключается в том, чтобы измерять не начало/завершение рендеринга кадра, а время отображения картинки на экране.
Как же нам сообщить игре, что изображение кадра уже показывается на экране? Вы можете удивиться, узнав это — но на сегодняшний день такого способа нет!
Это шокирует, я понимаю. Можно было ожидать, что это базовая функция каждого графического API. Но оказывается, в процессе постепенных улучшений тут и там все, в сущности, упустили сам смысл проблемы. Мы все забыли о тонких деталях своей работы, продолжая повторять одно и то же, а графические API эволюционировали во всех других аспектах, кроме этого: приложение никаким образом не может точно узнать, что кадр на самом деле отображается на экране. Мы можем узнать, когда закончится его рендеринг, но не когда он будет показан.
Что дальше?
Уже ведётся работа по созданию аналогичных и более качественных систем для всех основных графических API. Когда она закончится? Сложно сказать, потому что проблема лежит довольно глубоко внутри различных подсистем ОС.
Однако я заверяю вас, что Croteam безустанно работает над тем, чтобы эта проблема была решена как можно скорее, и все участники экосистемы интерактивной графики понимают и поддерживают наши усилия.
Мы стремимся сделать это решение доступным для более широкой аудитории, и когда это случится, мы подготовим апдейт The Talos Principle с реализацией этой функции.
Различные помехи и другие подробности
Последнюю фразу можно считать концом основного текста. Ниже представлены «бонусные разделы», практически не связанные друг с другом и основным текстом. Вероятно, я буду обновлять их, когда ситуация станет меняться, или в случае возникновения более сложных вопросов, требующих решения в ближайшем будущем.
«Композитор»
Эффект матового стекла? Да, для него нам определённо нужен композитор. Он просто-таки необходим, правда?
За кулисами со всем этим связан концепт под названием «композитный менеджер окон», или композитор. Это система, существующая теперь во всех ОС, которая позволяет окнам быть прозрачными, иметь размытый фон, тени, всплывающие поверх окна Skype и т.д. Композиторы даже могут отображать окна в 3D. Для этого композитор перехватывает управление над последним этапом создания картинки кадра и решает, что ему сделать с ней, прежде чем она попадёт на экран монитора. Это ещё больше всё усложняет.
В некоторых ОС композитор можно отключить в полноэкранном режиме. Но это не всегда возможно, а даже если и возможно — то разве можно запретить запускать игру в оконном режиме?
Управление питанием и тепловыделением против сложности рендеринга
Мы также должны учитывать, что современные ЦП и GPU не работают с фиксированной частотой, а имеют системы, изменяющие их скорости в соответствии с нагрузкой и температурой. Поэтому игра не может просто предполагать, что GPU и ЦП будут иметь одинаковую скорость в каждом кадре. С другой стороны, ОС и драйверы не могут ожидать, что у игры в каждом кадре будет одинаковый объём работы. Чтобы учесть это, необходимо разработать сложные системы для общения этих двух сторон.