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

Итак, дельта-время равно 1/fps, верно? Допустим, кадров в секунду было 50, тогда дельта времени будет равна 1/50 = 0,02. Мой вопрос в том, что частота кадров меняется (одна секунда может быть 50, другая может быть 52). Итак, скажем, в течение одной секунды fps составляет 50, это означает, что дельта-время будет равно 0,02, но в СЛЕДУЮЩУЮ секунду fps будет 52, но мы этого еще не знаем. Таким образом, наша анимация выполняется с дельта-временем 1/50, но на самом деле частота кадров составляет 52. Пока не закончится следующая секунда, мы не узнаем, что частота кадров изменилась. Это может показаться не таким уж большим делом, если изменения небольшие, но если они становятся очень большими, у нас возникает проблема. Итак, дело в том, что мы всегда делаем расчеты на основе кадров в секунду за предыдущую секунду. Я хочу знать, как это решить. Спасибо!


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


Ответы (1)


Вы правы, что 1/fps = дельта-время. Однако в настоящее время частота кадров в секунду неизвестна, и, как вы указали, такой способ может вызвать проблему! На практике формула перестраивается таким образом, что 1/dt = fps.

Итак, мы определяем дельта-время, определяя, сколько времени прошло с момента последнего обновления ( deltaTime = (CurrentTime - LastTime) ). Если бы у нас была переменная, которую мы добавляем к каждому обновлению (скажем, deltaCounter += deltaTime), и другая переменная, которая является счетчиком, который мы добавляем к каждому обновлению (Counter++), мы бы увидели, что когда deltaCounter становится равно 1, переменная Counter — это наш fps за эту секунду.

Дополнительная информация о дельта-времени и ее реализации

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. Теперь, поскольку в моем сценарии частота кадров равна 10, давайте умножим 0,3 на 10. Это даст вам 3 единицы в секунду, а не 30... - person user3843164; 13.08.2014
comment
Вам нужно преобразовать deltaTime из миллисекунд в секунды или преобразовать 1 в 1000 мс, чтобы ваше уравнение стало dT = (1000/100) или dT = (1 * (0,1)), или просто dT = (0,1) для упрощения . Затем, когда вы переместитесь на 30 единиц, это будет перемещение = (30 * (1000/100)), что будет равно 3 единицам за кадр или 30 единицам в секунду. - person DetectivePikachu; 13.08.2014