Просмотр полной версии : Стабилизация скорости обработки
Hacker VBI
07.11.2013, 14:39
Вопрос следующий: в разные моменты работы игры колеблется загрузка проца - несколько противников на экране - всё за прерывание, всё бегает, десяток - уже больше прерывания и всё медленнее.
Какие есть подходы для "выравнивания" течения времени в игре?
Особо смущает возможные варианты турбы...
Sanchez, newart говорят о дельта-тайминге, давайте обсудим возможные подходы.
introspec
07.11.2013, 14:47
Я бы просто привязал исполнение к прерываниям. Т.е. программа должна осознавать, за сколько прерываний произошёл рендер (простой счётчик в обработчике прерывания). Далее - 2 варианта. Либо тормозить быстрые машины к скорости самой медленной (не романтично, но работать будет), либо пытаться подгонять хар-ки рендера к наблюдаемой скорости. Второе, имхо, в 2д неактуально.
Hacker VBI
07.11.2013, 14:52
сейчас так и есть, в прерывании смотрю - всё-ли отработало, потом обновление - по методу Санчеса. можно считать кол-во прерываний, но что это даст? выравнивание до самого затупного места и дальше жизнь в задержке? ;)
или пусть пляшет с разной скоростью?
в общем, беспокоит следующее - выбегает противник, такой быстрый, за ним ещё один скоростной, потом появляется ещё парень и они, уже толпой, не спешаа, двиигаааююютттссяя :)
Есть два простых метода:
а) игровая логика висит на прерываниях.
б) игровая логика в главном цикле. Перед вызовом игровой логики смотрим, сколько прерываний прошло с прошлого раза. И либо вызываем логику соответствующее количество раз, либо шаг движения устанавливаем пропорционально.
NovaStorm
07.11.2013, 14:59
Я собираюсь жёстко ограничить кол-во объектов на экране, то есть не впускать лишних.
Если врагов много, тормозить так или иначе придётся.
introspec
07.11.2013, 15:02
сейчас так и есть, в прерывании смотрю - всё-ли отработало, потом обновление - по методу Санчеса. можно считать кол-во прерываний, но что это даст? выравнивание до самого затупного места и дальше жизнь в задержке? ;)
или пусть пляшет с разной скоростью?
в общем, беспокоит следующее - выбегает противник, такой быстрый, за ним ещё один скоростной, потом появляется ещё парень и они, уже толпой, не спешаа, двиигаааююютттссяя :)
Ну смотри. Пусть у тебя не то 1 фрейм, не то 2 (смотря сколько врагов). После рендера программа смотрит - нарендерили за фрейм. ОК, тогда враги шагают с половинным шагом (скорость позволяет). Если вышли за фрейм, тогда враги начинают шагать с единичным шагом. Т.е. в обоих случаях шаг на единицу делается за 2 фрейма, но в первом случае, когда врагов поменьше, подрастает плавность. В 2д это почти нереально использовать, имхо. Но в 3д имеет смысл.
Я бы просто привязал исполнение к прерываниям. Т.е. программа должна осознавать, за сколько прерываний произошёл рендер (простой счётчик в обработчике прерывания). Далее - 2 варианта. Либо тормозить быстрые машины к скорости самой медленной (не романтично, но работать будет), либо пытаться подгонять хар-ки рендера к наблюдаемой скорости. Второе, имхо, в 2д неактуально.
Актуально, актуально.
Hacker VBI, для начала определяешься, с какой скоростью (пикселей/прерывание) у тебя должен передвигаться тот или иной объект, затем считаешь сколько прерываний занял рендер предыдущего игроцикла и умножаешь получившееся на скорость. Все просто ;)
Или вызываешь логику объекта соответствующее число раз (так в surve сделал).
Старая статья про это: http://www.zxpress.ru/article.php?id=8531
Hacker VBI
07.11.2013, 15:47
Мужики, спасибо!!!
вот это и есть дельточка, по ходу.
у меня сейчас отдельный обсчёт, отдельно отображение. MVC, блина :)
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot