Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DXTimer


Страницы:   1 2

breakmaster ©   (2004-08-01 22:58:00) 

Люди, никто не знает, почему когда я размещаю второй ДХТаймер, первый прекращает работу?


breakmaster   (2004-09-15 14:50:00) [1]

все понятно.
Я просто думал что есть такие зарезервированные процедуры, которые сами по себе выполняются постоянно.


NailMan   (2004-09-14 09:43:00) [2]

Если не пользоваться долбанными формами(VCL) для создания игры и прочих OnIdle, то все шикарно реализуется простым Repeat Until с каким-либо условием выхода(скажем переменная состояния приняла значение выхода).

У меня так вообще нет такого понятия как игровой цикл. У меня их сколько угодно. Если селектор процессов, в котором выбирается режим работы программы, а каждый "игровой процесс" есть процедура со своим уникальным игроывм циклом. Скажем когда игрок находится в режиме кокпита(основной вид изнутри корабля), то цикл имеет свой вид. Когда игрок смотрит на свой корабль снаружи, то игровой цикл совершенно другой, так как в этом виде рендерятся другие элементы сцены, а какие-то нет.

---
WBR, NailMan aka 2:5020/3337.13


cyborg   (2004-09-14 08:14:00) [3]


> [32] breakmaster ©   (13.09.04 21:37)
>- ЭТО где писать??  

Ты программист или где? :)
Откуда я знаю где в твоей программе это писать? Где тобой задумано, там и пиши!


breakmaster   (2004-09-13 21:37:00) [4]

Repeat
Until условие

или

While условие do
begin
end;
- ЭТО где писать??  

Ведь есть наверно специальные названия процедур, которые выполняются постоянно. Там, например, procedure TGameEngine


NikeOLD   (2004-09-13 08:38:00) [5]


> breakmaster ©   (07.08.04 12:14) [21]
> кстати, про QueryPerformanceCounter в хелпе ничего нет...

The QueryPerformanceCounter function retrieves the current value of the high-resolution performance counter, if one exists.

BOOL QueryPerformanceCounter(

   LARGE_INTEGER *lpPerformanceCount  // address of current counter value
  );


Parameters

lpPerformanceCount

Points to a variable that the function sets, in counts, to the current performance-counter value. If the installed hardware does not support a high-resolution performance counter, this parameter can be to zero.



Return Values

If the installed hardware supports a high-resolution performance counter, the return value is nonzero.
If the installed hardware does not support a high-resolution performance counter, the return value is zero.  

See Also

QueryPerformanceFrequency


cyborg   (2004-09-13 08:30:00) [6]


> Что нужно сделать, чтобы процедура работала постоянно?

Зациклить :)

Repeat
Until условие

или

While условие do
begin
end;

Выход из цикла - поменять условие или выполнить Break;


breakmaster   (2004-09-12 20:45:00) [7]

ладно, тогда спросим по-другому.
Что нужно сделать, чтобы процедура работала постоянно?


cyborg   (2004-09-12 14:40:00) [8]


> [27] breakmaster ©   (12.09.04 14:26)

Никак она не называется, как назовёшь, так и будет называться ;)
Например Procedure SuperPuperGiperCycle; :)


breakmaster   (2004-09-12 14:26:00) [9]

или по-другому игровой цикл.
Судя по-всему вопрос ламерский, но мне нужен на него ответ


breakmaster   (2004-09-11 16:45:00) [10]

а как называется главная процедура, которая постоянно выполняется?


breakmaster   (2004-09-09 20:39:00) [11]

nailman-у
Кстати когда у меня был нормальный таймер, у меня монстры на всех компьютерах нормально двигались. Может в синхронизации нет нужды вообще?


NailMan   (2004-08-09 17:49:00) [12]

Если в моем варианте, то вряд-ли у тебя все объекты будут одновременно что-то трабатывать. В теории они(их кванты времени) будут равномерно размазаны по секунде, что даст равномерный ФПС. Если что-то сильно нагрузит проц, то все остальные отмасштабируются по этому лагу.

Если же юзать какой-то фиксированный таймер где все будут изменяь состояния, то тормозить будет и еще как(в зависимости от эффективности алгоритмов изменения состояний).

---
WBR, NailMan aka 2:5020/3337.13


NikeOLD   (2004-08-09 17:15:00) [13]

Может так получиться, что код будет выполнятся все время до следующего "тика" таймера и дольше, что приведет к зацикливанию.


breakmaster   (2004-08-09 16:50:00) [14]

Люди, а если в таймер Очень много всякой фигни запихать, он тормозить будет?


breakmaster   (2004-08-07 12:14:00) [15]

кстати, про QueryPerformanceCounter в хелпе ничего нет...


pavel_pavel   (2004-08-05 10:19:00) [16]

Cool


NailMan   (2004-08-05 09:27:00) [17]

breakmaster ©
Я же написал - это увеличение изменения состояния объекта(скажем координаты) пропорционально производительности компьютера.
На медленных машинах будет увеличенный прирост координаты за "тик", а на быстрых он будет нормальным.

---
WBR, NailMan aka 2:5020/3337.13


breakmaster   (2004-08-04 19:57:00) [18]

надо же... сделал для себя открытие, что gettickcount использовать низзя...(а мне тока уже посоветовали)
только я не врублюсь что значит масштабирование(


NailMan   (2004-08-04 18:16:00) [19]

Дык точного определения не существует, есть только трактовки.
Суть синхронизации:
сделать обновления состояния объекта(анимация, движения и т.д.) с четко заданной частотой на любой машине(любой производительностью).

по нижеозначенной ссылке:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1089528478&n=9

я приводил реализацию своего варианта.

Суть моего метода: для каждого объекта есть набор параметров, которые отвечают за масштабирование его будущих изменений. Коэффициент масштабирования вычисляется как отношение фактически пройденого времени с момента предыдущего изменения состояния к теоретическому времени(ВремяЗадержки или интервал его персонального "таймера").

Моменты времени я беру из HighPerfomance счетчика процессора(не путать с командой asm-а RDTSC).

Скажем объект изменят состояние в момент A(будем считать это значением счетчика) и считаем это началом отсчета(в первый раз задаем время при создании объекта).
Мы говорим объекту что он будет изменять свое состояние каждые 20 милисекунд(50 раз в секунду), а потому задаем ему время задержки(в dx-таймере это интервал таймера) в 20мс(естественно переведенных в разрешение HP-системного таймера. см. в примере как это реализуется).

Далее в игровом цикле(OnIndle) мы делаем проверку для нашего объекта:
Если ТекущееВремя - А >= ВремяЗадержки тогда пора обновлять состояние объекта. Тоесть другими словами если прошедшее время с момента предыдущего изменения больше или равно задержке, то надо делать изменение. Естественно в конце операций изменения состояний(скажем обсчет колизий для объекта, анимация, перемещение и т.д.) мы должны задать ему новое время А - присваиваем переменной значение счетчика из системы, так как расчеты могут быть и не мгоновенными, и при следующем изменении будет очень небольшое масштабирование).

А самый главный параметр - коэффициент масштабирования процессов вычисляется по формуле:
КоэффМасшт = (ТекущееВремя - А) / ВремяЗадержки

Если время прошедшее с последнего изменения превысило время задержки, то коэф будет больше единицы иначе будет единицей(очень близко к ней).

Применять его очень просто. Скажем изменение координаты объекта каждый раз идет на какую-то определенную величину(скорость), значит чтобы у нас на дохлой тачке объект изменил координату на такое-же расстоние как и на быстрой тачке нам надо прибавить к координате значение скорости умноженное на полученный коэффициент. Т.е.
X := X + Vel * КоэфМасшт;

Визуально на дохлой тачке(если совсем все плохо) это будет как бы большое изменение координаты объектом или как бы "рывок". На нормальной тачке все будет плавно.

---
WBR, NailMan aka 2:5020/3337.13


breakmaster   (2004-08-04 14:28:00) [20]

А где можно почитать про синхронизацию или хотя бы надыбать определение?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо