Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.01.2009, 21:11
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 1  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
По умолчанию Как сохранить скорость игры при падении FPS?

Есть игровой движок, главная функция повешена на setInterval и вызывается каждые скажем 10 мс. Т.е. подразумевается что всё обсчитывается 100 раз в секунду. Однако в реале всё работает раза в 2 медленнее - вместо 100 fps выдаётся где-то 50. Но ладно если б это были только кадры, но ведь это и количество просчётов, т.е. за одно и то же реальное время на различных машинах будет проходить различное игровое время.

Вопрос: как поддерживать игровое время в соответствии с реальным? Чтобы состояния, которые не успевают просчитаться, отбрасывались, чтобы кадры пропускались, но текущее состояние всегда соответствовало реальному времени.
__________________
тонкий тролль, осеянный благодатью

Старый 11.01.2009, 21:38
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 2  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
нужно логику игры не зависящую от итераторов.
пример перемещение должно быть реализовано так:
Код AS3:
package {
 
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.TimerEvent;
	import flash.utils.Timer;
	import flash.utils.getTimer;
 
	public class Character extends EventDispatcher {
 
		public function Character(x:Number=0, y:Number=0) {
			super();
			this._x = x;
			this._y = y;
			this._timer.addEventListener( TimerEvent.TIMER, this.updatePosition );
		}
 
		private const _timer:Timer = new Timer( 100 );
 
		private var _start_time:Number;
 
		private var _end_time:Number;
 
		private var _start_x:Number;
 
		private var _start_y:Number;
 
		private var _end_x:Number;
 
		private var _end_y:Number;
 
		private var _d_x:Number;
 
		private var _d_y:Number;
 
		private var _x:Number;
 
		public function get x():Number {
			return this._x;
		}
 
		private var _y:Number;
 
		public function get y():Number {
			return this._y;
		}
 
		public function moveTo(x:Number, y:Number, speed:Number=1):void {
			var dt:Number =		Math.sqrt( x*x + y*y ) / speed;
 
			this._start_time =	getTimer();
			this._end_time =	this._start_time + dt;
 
			this._start_x =		this._x;
			this._end_x =		x;
			this._d_x =			( this._end_x - this._start_x ) / dt;
 
			this._start_y =		this._y;
			this._end_y =		y;
			this._d_y =			( this._end_y - this._start_y ) / dt;
 
			if ( !this._timer.running ) this._timer.stop();
		}
 
		private function updatePosition(event:Event=null):void {
			var time:Number = getTimer();
			if ( this._end_time > time ) {
				time -= this._start_time;
				this._x = this._start_x + this._d_x * time;
				this._y = this._start_y + this._d_y * time;
			} else {
				this._x = this._end_x;
				this._y = this._end_y;
				this._timer.stop();
			}
		}
 
	}
 
}
100 фпс, это ваще жёстко я бы даже сказал непомерно много. даже не знаю где может больше 30 пригодится

Добавлено через 32 секунды
P.S.: код не проверял. но смысл думаю понятен.

Старый 11.01.2009, 21:56
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 3  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Привязываться нужно к независимому времени, а не к сомнительным плавающим параметрам, типа FPS или интервалов.

Старый 11.01.2009, 21:58
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 4  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
BlooDHounD,
Цитата:
нужно логику игры не зависящую от итераторов
Раскройте эту фразу попрдробнее

Как просплюсь, разберусь в вашем коде - насколько я понял, самая суть его лежит в последних строчках.

__etc, я это и хочу узнать: как привязаться к независимому времени?
__________________
тонкий тролль, осеянный благодатью


Последний раз редактировалось Gaen; 11.01.2009 в 22:00.
Старый 11.01.2009, 22:14
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 5  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Ну, например, getTimer() и Date.

Старый 11.01.2009, 22:47
Яски вне форума Посмотреть профиль Отправить личное сообщение для Яски Найти все сообщения от Яски
  № 6  
Ответить с цитированием
Яски

блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
BloodHound, в вашем коде сам черт ногу сломит - вы понему, чтоли, обфускатором прошлись?
В общем суть такова, что все объекты движутся по линейной или нелинейной зависимости. Чаще всего нам нужно узнать положение объекта для его отрисовки. Поэтому задаем положение объекта каждый кадр на ENTER_FRAME. Для расчета перемещения объекта за кадр при постойной скорости пользуемся следующей формулой :
Код AS3:
   newX = lastX + speedX*time
   newY = lastY + speedY*time
Чтобы расчитать время кадра пользуемся следующим методом:
Код AS3:
var lastFrameTime:int = int.MAX_VALUE;
 
function onEnterFrame(e:Event):void {
   var time:int = getTimer();
   var frameTime:Number = time - lastFrameTime;
   if (frameTime > 0) {
      newX = x + speedX*frameTime;
      newY = y + speedY*frameTime;
   }
   lastFrameTime = time;
}
Для расчета координат объекта при нелинейном перемещении пользуемся твинерами.

Старый 11.01.2009, 22:58
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 7  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
Яски, гыыыы ...... Вы написали лучше? и в чём там ноги ломаются?

Старый 11.01.2009, 23:18
Яски вне форума Посмотреть профиль Отправить личное сообщение для Яски Найти все сообщения от Яски
  № 8  
Ответить с цитированием
Яски

блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
А я понял, это просто такой стиль форматирования - жутковат просто с непривычки.

UPD:
Вообще ваш подход лучше — если считать прошедшее время за каждый кадр, будет накапливаться погрешность из-за слишком маленьких значений.
Тут ошибочка:
Код AS3:
		public function moveTo(x:Number, y:Number, speed:Number=1):void {
			var dt:Number =		Math.sqrt( x*x + y*y ) / speed;
Код AS3:
		public function moveTo(x:Number, y:Number, speed:Number=1):void {
			var dt:Number =		Math.sqrt( (x - this._x)*(x - this._x) + (y - this._y)*(y - this._y) ) / speed;
Видимо автор устал писать все эти this и подчеркивания.


Последний раз редактировалось Яски; 11.01.2009 в 23:34.
Старый 11.01.2009, 23:33
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 9  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
Яски, ваще-то не устал тупо механическая ошибка, о которой я даже не подумал.

Старый 13.01.2009, 00:33
puzzlesea вне форума Посмотреть профиль Отправить личное сообщение для puzzlesea Найти все сообщения от puzzlesea
  № 10  
Ответить с цитированием
puzzlesea

Регистрация: Jan 2009
Сообщений: 15
Я использовал такой подход:
1. Логика четко фиксирована по времени - так гораздо легче считать, если есть события и их последствия, а не только простое перемещение.
2. Частота отрисовки подстраивается под производительность: Нам известен интервал между циклами отрисовки. Засекаем время обсчета логики и время отрисовки кадра. Если времени и на то и на другие не хватает, переходим к рассчету след. кадра, увеличиваем запас времени на отрисовку (время общего интервала минус время на обсчет). Обсчитываем логику пока не накопится достаточно времени для отрисовки. И так по циклу. Еще я отрисовку делал в бэкбуфер, а он по-любому выводился с фиксированной частотой, т.к. это занимало ничтожно мало времени в сравнении даже с обсчетом логики и картинка получалась достаточно плавной и при низком ФПС. И еще я использовал самонастройку, которая уменьшала количество не нужных особо объектов (частиц в эффектах) и ФПС был на достаточно хорошем уровне.
Недостаток: вариант, когда на просчет логики не хватает времени, не рассматривался. Когда просчет съедает все время, отрисовки может не быть вообще, но это можно предусмотреть в алгоритме.
И еще это было не на флеше, но, считаю, применить метод можно.
Еще любят делать отдельные потоки для логики и отрисовки. Логика расчитывается отдельно, и картинка отрисовывается отдельно. Если это как-то объединить с подстройкой ко времени отрисовки, то можно получать нужное и при падении ФПС.

зы: кстати у тебя в вопросе и ответ, просто внимательно его прочитай и подумай. - Просто не рисуй те кадры, которые не успевают отрисоваться, а логику считай всю. И будут кадры пропускаться, а текущее состояние соответствовать реальному времени


Последний раз редактировалось puzzlesea; 13.01.2009 в 00:40.
Создать новую тему Ответ Часовой пояс GMT +4, время: 00:00.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 00:00.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.