Независима от рамка анимация в разработката на игри за android

Добре, така че делта времето е 1/fps, нали? Да кажем, че fps е 50, тогава делта времето ще бъде равно на 1/50= 0,02. Въпросът ми е, че честотата на кадрите варира (една секунда може да е 50, друга може да е 52). Да кажем, че за една секунда fps е 50, това означава, че делта времето ще бъде равно на 0,02, но в СЛЕДВАЩАТА секунда fps ще бъде 52, но ние все още не знаем това. Така че нашите анимации се правят с делта време от 1/50, но fps всъщност е 52. Докато не приключи следващата секунда, няма да разберем, че fps се е променил. Това може да не изглежда като голяма работа, ако промените са малки, но ако станат много големи, тогава имаме проблем. Така че работата е там, че винаги правим изчисления въз основа на fps за предходната секунда. Искам да знам как да реша това. Благодаря!


person user3843164    schedule 12.08.2014    source източник


Отговори (1)


Прав си, че 1/fps = делта време. Понастоящем обаче кадърите в секунда не са известни и, както посочихте, това ще създаде проблем! На практика формулата се пренарежда така, че 1/dt = fps.

И така, ние определяме делта-времето, като определяме колко време е минало от последната актуализация ( deltaTime = (CurrentTime - LastTime)). Ако трябваше да имаме променлива, която добавяме делта време към всяка актуализация (да речем deltaCounter += deltaTime), и друга променлива, която е брояч, добавяме един към всяка актуализация (Counter++), ще видим, че когато deltaCounter стане равна на 1, променливата на брояча е нашата fps за тази секунда.

Допълнителна информация за Delta Time и неговото внедряване

person DetectivePikachu    schedule 12.08.2014
comment
Връзката, която предоставихте, все още има същия проблем, който споменах.. И какво имате предвид колко е минало от последната актуализация? Делта-времето е колко време НЕОБХОДИМО за завършване на една актуализация, нали? И за да може вашата пренаредена формула да работи, все още трябва да знаете делта времето на първо място, което просто ни връща в началото... - person user3843164; 13.08.2014
comment
По принцип имам нужда от начин да знам fps ПРЕДИ РЪКА, така че след това да мога да изчисля делта-времето въз основа на това и за следващата секунда да използвам това делта-време за изчисленията. - person user3843164; 13.08.2014
comment
Можете ли да уточните как делта времето е изминало от последната актуализация? Това ще ви даде известно количество милисекунди, нали? Това означава, че когато делта броячът е равен на 1000, променливата на брояча в този момент ще бъде fps. Също така ще трябва да преизчислите делта времето при всяка отделна актуализация за това, което правите. Прав ли съм? - person user3843164; 13.08.2014
comment
Това, което имам предвид под колко време от последната актуализация е, че взимате системното време в милисекунди и изваждате системното време, записано в последната актуализация. Ето как определяте делта времето на първо място, така че не сме на изходна точка! Така че да, вие преизчислявате делта времето при всяка актуализация по този начин. Когато разделите (1 / deltaTime), това ще ви покаже относителното увеличение за този кадър. Да кажем, че искате герой да се движи наляво със скорост от 1 единица в секунда, 1/dT ви дава колко трябва да се движи в една актуализация или кадър. За n единици в секунда трябва да преместите ( n * ( 1 / dT ) ) единици! - person DetectivePikachu; 13.08.2014
comment
Добре, опитах това, но има проблем: Да кажем за по-лесно, че една секунда има кадъра в секунда 10 и dT е равен на 100 всеки път (отнема 100 милисекунди от последната актуализация). Да приемем, че искате да се движите с 30 единици в секунда. Така че разделяте 1/100, което е 0,01. След това умножавате това по 30, което ви дава 0,3. Сега, тъй като fps е 10 в моя сценарий, нека умножим 0,3 по 10. Това ви дава 3 единици в секунда, а не 30... - person user3843164; 13.08.2014
comment
Трябва да преобразувате deltaTime от милисекунди в секунди или да преобразувате 1 в 1000 ms, така че вашето уравнение да стане dT = (1000/100) или dT = ( 1 * (0,1) ) или просто dT = (0,1), за да опростите . След това, когато преместите 30 единици, ще бъде движение = (30 * (1000 / 100) ), което ще бъде 3 единици на кадър или 30 единици в секунда. - person DetectivePikachu; 13.08.2014