Показать сообщение отдельно
Старый 22.06.2007, 22:35   #2
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Re: Уход от привязки к FPS

Нужно выяснить смысл величины delta_t.
Когда разрабатывается игра, она нацелена на такую-то частоту обновления, допустим, 100 кадров в секунду. Это значит, что если у игрока игра выдает 100 ФПС, delta_t должна быть равна единице. Если реальный показатель ФПС ниже расчетного, нужно ускорить все движения, то есть delta_t > 1. Если же игра идет слишком быстро, delta_t < 1.
Теперь можно подумать о реализации:
time = 0

; Главный цикл
While 1
	ticks = Millisecs()	; текущее время

	elapsed = ticks - time
	time = ticks
После первого кадра значение time инициализируется текущим временем (это можно сделать и раньше, при желании). В elapsed хранится время, потраченное на обработку одного кадра (прошлого кадра).
При ФПС = 100, на обработку одного кадра уходит времени
const TARGET_FPS = 100

; 1000 миллисекунд / n кадров в секунду
period# = Float(1000) / Float(TARGET_FPS)
Мы уже знаем, что при ФПС = 100 delta_t = 1. Т.е. уже должно быть понятно, что надо что-то делить на что-то еще. Если ФПС > 100, delta_t должно быть меньше единицы. При этом на один кадр тратится времени меньше, чем при ФПС = 100. А если поделить меньшее число на большее, мы получим значение меньше единицы. Таким образом,
const TARGET_FPS = 100

; 1000 миллисекунд / n кадров в секунду
const period# = Float(1000) / Float(TARGET_FPS)


time = 0

; Главный цикл
While 1
	ticks = Millisecs()	; текущее время

	elapsed# = ticks - time
	time = ticks

	delta_t# = elapsed / period

	UpdateGame(delta_t)
	
	Render()
Wend
Если же ФПС < 100, elapsed будет больше, чем period, и delta_t соответственно примет значение больше 1.
(Offline)
 
Ответить с цитированием