![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DXTimer
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]А где можно почитать про синхронизацию или хотя бы надыбать определение?