Неуловимият проблем с тайминга на кадрите – първа част

4
2446
Техническият директор на Croteam Алън Ладавак (Alen Ladavac), участвал в разработването на игрите Serious Sam и Talos Principle, обяснява как е успял да намери причината за забавянето на графиката дори и при най-мощните компютърни системи. Историята е от средата на 2018 година и повдига актуални и към днешен ден въпроси.

Най-сетне се появи обяснение, защо някои игри бавят и при мощните персонални компютри. Има и надежда, че в най-близко бъдеще проблемът ще бъде решен.

З-з-забавяне

Може би с нетърпение очаквате появата на следващата суперинтересна видеоигра за персонален компютър и ето, че тя е излязла. Този път искате напълно да ѝ се насладите, спестили сте пари и предварително сте се подготвили. Сменили сте процесора с възможно най-мощния, добавили сте още RAM и дявол да го вземе, дори сте си изградили RAID масив с SSD. Няма начин играта да не е плавна и бърза.

Ето че играта е излязла, инсталирали сте я и нямате търпение да я пуснете. Засега всичко е добре – скоростта на изображението е 60 кадъра в секунда. Или поне това показва брояча на графичния процесор. Но нещо не е както трябва. Рязко помръдвате мишката наляво и надясно, и тук играта започва да бави… Но как е възможно това при едва 60 FPS?

Ако това никога не ви се е случвало, ситуацията може да ви се стори доста смешна. Но ако сте забелязали този ефект, то със сигурност от цялата си душа ненавиждате това коварно забавяне. Това съвсем не е лаг. Не е и ниска честота на кадрите. Това е просто забавяне в опресняването на изображението, което се проявява дори и при висока кадрова честота (това са различни понятия) при идеалните супербързи машини. Откъде се взема това нещо и как да се избавим от него? Нека да започнем историята…

Забавяне, плавност, скорост… Това не е ли едно и също?

Още от времената на аркадните автомати от 70-те години, видеоигрите работят с кадрова честота 60 Hz и скорост на обмен на кадрите 60 fps. Тогава се подразбираше, че опресняването на изображенията на екрана стават със същата периодичност, като кадровата честота на екрана. Така беше до популяризирането на 3D игрите, в които за първи път се допусна понижение на честотата на опресняване. През 90-те, когато 3D видеокартите, както се наричаха тогава, започнаха да заменят и изместват софтуерното рендиране, хората играеха при 25 fps, а 30 fps се считаха за твърде прилични при игрите със сериозни баталии. Не се шегувам.

Днес имаме супербързи геймърски машини и разбира се, те могат да работят при 60 fps. Но броят на разочарованите от скоростта на игрите геймъри е рекордно високо. Как е възможно това? Проблемът се оказа не в това, че игрите могат и работят достатъчно бързо, а че незнайно защо се забавят дори и когато със сигурност могат да работят бързо.

Ако се зачетем в геймърските форуми, можем да видим голям брой съобщения и оплаквания:

Може да помислим, че това са единични проблеми, но нека погледнем статистката на запитванията в търсачката на Google:

През последните пет години забавяният от този род (stutter) са станали по-сериозен проблем и от скоростта на игрите.

Графиката показва, че хората все повече се интересуват от забавянето в опресняването на изображенията, отколкото от кадровата честота на мониторите.

Десет години търсене на необяснимото забавяне

За първи път се сблъсках с този проблем някъде през 2003 година. Работехме върху Serious Sam 2, когато потребителите започнаха да ни изпращат отзиви, че пробват нещо на празно ниво, където преместванията на мишката не са плавни. Всичко това се съпровожда от много характерен шаблон в графиката на кадрите, който ние нарекохме „кардиограма“.

Първоначално помислихме, че някъде в кода има грешка. Но нямаше и нищо не открихме. Забелязахме, че сякаш проблемът се появява и изчезва случайно – след рестартиране на компютъра, след което геймърът променя някоя опция – всичко се оправя. Само че след това геймърите връщаха тази опция в предишното ѝ значение, но проблемът не се появяваше. Като някакъв призрак.

Стана очевидно, че проблемът не е при нас. След като наблюдавахме неговото възникване и в други игри, помислихме, че са виновни драйверите. Само че същото се получаваше при видеокартите на различни производители. И дори при различни API (OpenGL, DirectX 9, DirectX 11 и т.н.). Единственото общо беше, че се появяват в различните марки компютри и много рядко при едни и същи сцени.

Ние направихме още няколко игри, като това странно поведение както преди продължи да се появява и изчезва. Някои потребители ужасно се дразнеха от това, а ние препоръчвахме да променят някоя опция, която оказва влияние на скоростта – това понякога помагаше, а понякога – не. Такъв е животът.

Но в един слънчев зимен ден в началото на 2013 година, моят колега Дийн ме извика да погледна още един случай с този проблем, който той най-после успя да предизвиква по желание. Този път проблемът се появи в едно от нивата на Serious Sam 3. Започнахме да експериментираме с графичните опции в тази сцена, когато внезапно ми просветна. Разбрах каква е причината! Всъщност тя се оказа твърде проста и не е за учудване, че се изплъзваше на всички през последните 10 години.

След промяната на само една съвсем опростена опция на гейм енджина, ние можехме да накараме проклетия проблем да се появява и изчезва в тази сцена. Но веднага стана очевидно, че за представянето на качествено решение са необходими много по-големи усилия. Усилия не само от наша страна, а и от цялата геймърска PC екосистема – драйверите за GPU, разработчиците на API, създателите на операционни системи – от всички.

Каква бе причината през цялото това време

Този коварен ефект се проявява част от сцена на The Talos Principle, където всичко ясно се вижда и е възможно да се направи анализ.

Но преди да започнем, убедете се, че наистина гледате видеото при резолюция 1080р и скорост 60 кадъра в секунда, както е показано по-долу:

Ако направите всичко правилно, а вашият компютър и уеб браузър могат да показват подобно видео с честота 60 Hz, то всичко трябва да се произвежда плавно и двете посоки. Ако не е така – именно това е и въпросният ефект и много други приложения и не само игри демонстрират подобно поведение. Опитайте да прегледате видеото на друг, дори по-бавен компютър и/или при малко по-ниска резолюция. Разликата е очевидна.

Да се върнем към практиката. Ако виждате забавяния от този тип, вероятно всичко изглежда по следния начин:

Точно този ефект нарекохме симптома на „кардиограмата“.

Именно по този начин изглежда това забавяне, дори когато играта работи при 60 fps. Навярно сте се сблъскали с нещо подобно в всяка една съвременна игра. Мнозина считат, че „играта не е оптимизирана“. Но това не е вярно. Ако играта е твърде бавна, това значи, че тя в даден момент не успява да рендира кадъра и на монитора се налага отново да покаже предишни кадър. Въпреки, че кадровата честота на монитора е 60 Hz, честотата на опресняване от страна на играта е по-ниска. Ето защо, когато записваме видео от подобна игра, имаме „пропуснати кадри“. Видеокартата не е успяла навреме да рендира съответния кадър и предишният кадър се показва два пъти – тоест, кадърът със закъснялото рендиране е изгубен, пропуснат.

Сега да се върнем към предишното видео със забавянията (кардиограмата). Нека да да го сложим на пауза и да го гледаме кадър по кадър (символа „.“ точка). Опитайте да забележите, кога точно един и същи кадър се появява два пъти. Аз ще почакам…

Няма нали? Странно е това.

Когато гледаме клипа, видеото изобщо не е плавно, но когото го разгледаме кадър по кадър, нищо подобно на прекъсвания и двойни кадри няма!

Как може да стане това?

Нека се спрем, малко по-подробно. Ето едно сравнение на идеално плавно видео с видео с характерните забавяния във вида на нашата кардиограма, което се възпроизвежда с 1/20 от нормалната скорост, за да могат да се видят отделните кадри:

Отгоре е правилното видео с 60 fps, а отдолу е с ефекта кардиограма.

Можем да забележим две неща: първо, те наистина се възпроизвеждат с еднаква честота – когато отгоре има нов кадър, отдолу също има нов кадър. Второ, те по някаква причина се движат малко по-различно – в средата на изображението има известно прекъсване, което понякога добре се вижда, а понякога съвсем изчезва.

Внимателният зрител ще забележи и още една подробност: долното изображение, което се счита за „бавно“, всъщност изпреварва правилното. Много странно.

Ако погледнем два съседни кадъра и техните тайминги (във всички показани тук видеа се използват таймери с точност 1.10 000 от секундата), можем да забележим нещо наистина интересно: първите два кадъра са идеално синхронизирани, но третият…

На третия кадър виждаме, че дървото в „забавящото се“ видео значително изпреварва своето копие от правилното видео (отбелязано е с червено). Можем да видим и че за този кадър е изминало повече време (отбелязано е с жълто).

Но чакайте малко, ако видеото е със забавяния, а за този кадър е отишло повече време, по какъв начин той може да изпревари правилния кадър?

За да схванем как става това, трябва да разберем по какъв начин в наше време игрите и другите 3D интерактивни приложения реализират анимацията и рендирането.

Накратко за таймингите на кадъра

„Преди много години, в една далечна галактика…“ Когато разработчиците са създавали първите видеоигри, те са съобразявали обновяването на сцените с точната кадрова честота на дисплеите. В районите с NTSC стандарта, където телевизорите работят с кадрова честота 60 Hz, това означава опресняване с точно 60 кадъра в секунда. А в районите с PAL/SECAM, където телевизорите работят с кадрова честота 50 Hz., задължително имаме 50 fps. Тогава никой не е можел и да си помисли за пропускане на кадър.

Скоростта на обектите също са се описвали в кадри. Ето защо не се е казвало, че даден обект се движи с определен брой пиксели в секунда, а с колко пиксела в кадър. Известно е, че в Sonic The Hedgehog за Sega Genesis, скоростта на въртене е 16 пиксела на кадър. Редица игри имат различни версии за PAL и NTSC, в които анимациите ръчно са прерисувани и направени за 50 или 60 fps, като всъщност, дори и не се предвижда играта да се стартира в друга кадрова честота.

Когато игрите започнаха да работят на мощните персонални компютри с възможност за ъпгрейд на хардуера, разработчиците вече няма как да знаят какво точно ще е опресняването на изображението. Няма как точно да се предскаже, колко време ще отнеме симулацията и рендирането на един кадър – това зависи твърде много от сцената, от скоростта на движение на обектите в нея и т.н.

Но ако не можем да сме сигурни, каква е честотата на обновяването на изображението в дадена игра, ще трябва да променяме текущата кадрова честота на дисплея и постоянно да я адаптираме към физиката и скоростта на анимациите в играта. Така например, ако един кадър отнема 1/60 от секундата (16,67 милисекунди), а персонажът се движи със скорост 10 метра в секунда, то той във всеки кадър ще се придвижи с 1/6 от метъра. Но ако честотата на кадрите внезапно се промени на 1/30 от секундата (33,33 милисекунди), то персонажът ще трябва да се движи със скорост 1/3 от метъра или два пъти по-бързо, за да може на екрана да продължи да се движи с изглеждаща постоянна скорост.

Как играта постига това? Всъщност, тя измерва времето в началото на кадъра, след това в началото на следващия кадър и изчислява разликата. Съвсем опростен метод, който работи много добре. Тоест, работил е много добре. Това се случва само, когато появата на обектите върху екрана се управлява от централния процесор. Ако в компютъра няма 3D карта, процесорът самостоятелно рисува обектите и с голяма точност знае кога ще се появят на екрана.

 


В следващата част ще се спрем на причините за появата на това забавяне и придръпване, проявяващо се при използването на най-съвременните видеокарти и мощни процесори, както и на различните решения за справяне а проблема.

 

Alen LadavacThe Elusive Frame Timing

0 0 глас
Оценете статията
Абонирай се
Извести ме за
guest
4 Коментара
стари
нови оценка
Отзиви
Всички коментари