Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.01.2012, 12:36
Аспирант
Отправить личное сообщение для BorodinKO Посмотреть профиль Найти все сообщения от BorodinKO
 
Регистрация: 31.03.2011
Сообщений: 47

setInterval(); и FPS
Делаю игру,
где в в функции
function frame(){
находится все вычисления и отрисовка, затем я запускаю ее
setInterval(frame, 10);

Но тут возникает одна проблема, в разных браузерах, на разных устройствах скорость игры - разная. и это из за того что некоторые браузеры тормозят на подсчете и отрисовки.
Вопрос: как сделать так чтобы те кадры которые не успевают прорисоваться "проглатывались".
Или как правильно реализуются подобные игры?
Ответить с цитированием
  #2 (permalink)  
Старый 05.01.2012, 12:53
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Например так, для 20-и кадров в секунду
setInterval(function() {
    if((new Date) - last_time > 1000/20) {
        last_time = new Date;
        frame();
    }
}, 10);
Ответить с цитированием
  #3 (permalink)  
Старый 05.01.2012, 13:28
Аспирант
Отправить личное сообщение для BorodinKO Посмотреть профиль Найти все сообщения от BorodinKO
 
Регистрация: 31.03.2011
Сообщений: 47

Спасибо, а как теперь подсчитать сколько кадров в секунду отрисовывается?
Ответить с цитированием
  #4 (permalink)  
Старый 05.01.2012, 14:07
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

Как делают настоящие пасоны)))!!1

//requestAnimFrame
setAnimation = (function() {
	return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ||
	function(/* function */callback, /* DOMElement */element) {
		return window.setTimeout(callback, 1000 / 60);
	};

})();
//canselRequestAnimFrame
clearAnimation = (function() {
	return window.cancelRequestAnimationFrame || window.webkitCancelRequestAnimationFrame || window.oCancelRequestAnimationFrame || window.msCancelRequestAnimationFrame ||
	function(id) {
		clearTimeout(id)
	}

})();



Как юзать:

function ня() {
	myAnimation = setAnimation(function() {
		ня()
	})
}

//чтоб остановить
clearAnimation(myAnimation)


как настоящие пасоны получают fps:
function ня(f) {
	log(f)

	setAnimation(function() {
		var thisLoop = new Date;
		var fps = 1000 / (thisLoop - lastLoop);
		lastLoop = thisLoop;
		// получили сколько кадров в секунду
		ня(fps)
	})
}
lastLoop = new Date;
ня()

Последний раз редактировалось Livaanderiamarum, 05.01.2012 в 14:52.
Ответить с цитированием
  #5 (permalink)  
Старый 06.01.2012, 01:43
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

Есть умельцы которые папкин вариант побьют)?
Ответить с цитированием
  #6 (permalink)  
Старый 06.01.2012, 05:29
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

а, ну вот вам еще, петлевая анимация)
аналог setInterval

//start loop animation
 function loopAnimation(call, fpsEnable, last) {
		last = last || new Date
		return setAnimation(function() {
			if (fpsEnable) {
				var now = new Date
				var fps = 1000 / (now - last)
				call(fps)
			} else {
				call()
			}
			loopAnimation(call, fpsEnable, now)
		})
}


называется loopAnimation(call, fpsEnable) ,
принимает калбак и булеан значение означающее передавать в калбак FPS или нет,
калбак вызывается каждый раз когда браузер рендерит страничку)
loopAnimation возвращает айдишник анимации для того чтобы можно было остановить clearAnimation'oм

Применяется так
loopAnimation(function(fps) {
	log(fps)
}, true)

Последний раз редактировалось Livaanderiamarum, 06.01.2012 в 05:54.
Ответить с цитированием
  #7 (permalink)  
Старый 06.01.2012, 10:59
Аспирант
Отправить личное сообщение для miha-ha Посмотреть профиль Найти все сообщения от miha-ha
 
Регистрация: 03.09.2010
Сообщений: 39

Для разделения обработки перемещений и отрисовки можно так:
run:function () {
        var me = this,
            loops = 0,
            skipTicks = 33, // ~1000/30
            nextGameTick = (new Date()).getTime();

            var loop = function () {
                loops = 0;

                while ((new Date).getTime() > nextGameTick) {
                    me.update();
                    nextGameTick += skipTicks;
                    loops++;
                }

                me.render();
                requestAnimFrame(loop);
            };

            loop();
    }
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
setInterval взбесился snizhok Events/DOM/Window 1 08.09.2011 00:10
setInterval - наколько вреден? ЭмМэмДэмс Общие вопросы Javascript 3 05.09.2011 08:49
Переменный в setinterval не видно вне него zeraid Общие вопросы Javascript 12 13.04.2011 10:29
setTimeout setInterval и др. mycoding Общие вопросы Javascript 6 28.10.2010 17:26
Проблема в document.write при использовании setInterval() GOll Общие вопросы Javascript 21 06.10.2008 17:38