AMX MOD X
Воскресенье, 25.01.2026, 12:58:04



Приветствую Вас Гость | RSS
[ Главная ] [ Время между фреймами engine - AMX Mod X Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/

  • Страница 1 из 1
  • 1
Модератор форума: slogic, AlMod  
Время между фреймами engine
LtRATДата: Пятница, 14.11.2008, 01:56:45 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 33
Репутация: 1
Статус: Не в сети
сабж

Для вычислений требуется знать, через какой промежуток времени engine вычисляет положения игрока и.т.п, основанное на времени между тиками...
Данные тики в системе являются дискретными, для 50 фпс это будет ровно 0,02сек, для 91-100фпс (именно диапазон) это будет 0,01сек

Вопрос: как получить или вычислить точное значение дискретов?

 
DaTaДата: Пятница, 14.11.2008, 02:10:57 | Сообщение # 2
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Репутация: 16
Статус: Не в сети
пфф

public frame()
{
static flTime
new flGameTime = get_gametime()
new flFrameTime = flGameTime - flTime
flTime = flGameTime
}

 
LtRATДата: Пятница, 14.11.2008, 19:39:01 | Сообщение # 3
Сержант
Группа: Пользователи
Сообщений: 33
Репутация: 1
Статус: Не в сети
Если было бы так просто - я бы не спрашивал
Маленький лог для 100 фпс, в котором flFrameTime - из выше описанного кода, и OtherTime - расчитывающийся из вертикальной скорости
Code

flFrameTime: 0.001953
OtherTime: 0.009999
flFrameTime: 0.010000
OtherTime: 0.009999
flFrameTime: 0.013101
OtherTime: 0.009999
flFrameTime: 0.009998
OtherTime: 0.009999
flFrameTime: 0.011426
OtherTime: 0.009999
flFrameTime: 0.010000
OtherTime: 0.009999

Делаю вывод, что выше описанный метод из-за погрешностей в моем случае мало применим...

Ну и для 50 фпс - для наглядности...

Code

flFrameTime: 0.020629
OtherTime: 0.020000
flFrameTime: 0.021087
OtherTime: 0.020000
flFrameTime: 0.023925
OtherTime: 0.020000
flFrameTime: 0.010864
OtherTime: 0.020000
flFrameTime: 0.024597
OtherTime: 0.020000
из наглядности видно, что значения и рядом не лежали с точными значениями дискретов...

ЗЫ OtherTime вычисляется из velocity[2] как (Vel(i-1)-Vel(i))/gravity , значения получаются вполне приемлимые, но в задаче есть моменты когда необходимо найти flFrameTime и нам неизвестно velocity[2] - те когда стоим на земле, вычислять через другие скорости - больше погрешность да и она (скорость по [0]/[1]) тоже должна быть...

Сообщение отредактировал LtRAT - Пятница, 14.11.2008, 19:41:53
 
DaTaДата: Пятница, 14.11.2008, 23:04:16 | Сообщение # 4
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Репутация: 16
Статус: Не в сети
Через жопvelocity[2] неточно, потому что на скорость влияет не только гравитация, смотри pm_shared из hlsdk, player.cpp из dlls, а так же остальные файлы с исходным кодом(который в кс закрыт), которые влияют на атрибут игрока velocity.

Самый точный метод - хукать плагином metamod PM_Move и смотреть ppmove->frametime.

 
LtRATДата: Воскресенье, 16.11.2008, 17:43:13 | Сообщение # 5
Сержант
Группа: Пользователи
Сообщений: 33
Репутация: 1
Статус: Не в сети
Формула давалась в упрощенном виде, и так-то понятно что в общем случае влияет не только sv_gravity, да и практически всегда средствами АМХХ можно свести только к frametime...

Да и все как то у вас сложно, лезть в метамод итп... Надо что-нибудь попроще - стандартными средствами АМХХ, например:

Code
public plugin_init()
{
  register_forward(FM_CmdStart, "cmdStart");
}

public cmdStart(id, uc_handle, seed)
{
  ////if (gHasSpeed[id])
  {
   static msec;
   msec = get_uc(uc_handle, UC_Msec);
   client_print(id,print_console,"CmdStart:    msec:%d  frametime:%f", msec ,msec*0.001);
  }
}

будут выводиться точные значения frametime, но и у данного метода есть минусы... Поэтому хочется что-то проще чем этот метод но столь же точный.

 
DaTaДата: Воскресенье, 16.11.2008, 18:42:41 | Сообщение # 6
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Репутация: 16
Статус: Не в сети
Это время между кадрами на стороне клиента, а не сервера.
 
LtRATДата: Воскресенье, 16.11.2008, 22:53:03 | Сообщение # 7
Сержант
Группа: Пользователи
Сообщений: 33
Репутация: 1
Статус: Не в сети
Когда меня в очередной раз тыкнули носом в hlsdk, я умудрился не просмотреть как формируется серверный frametime:
PM_PlayerMove >> pmove->frametime = pmove->cmd.msec * 0.001;

Данный метод еще полностью не тестил, но теоретически должен подойти...

Но поскольку многие вещи можно сделать несколькими способами - может будут идеи как получить frametime проще и без лишнего Форварда.

 
DaTaДата: Понедельник, 17.11.2008, 00:24:20 | Сообщение # 8
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Репутация: 16
Статус: Не в сети
Quote (LtRAT)
pmove->frametime = pmove->cmd.msec * 0.001;

O_o

Зачем тогда frametime нужен в структуре pmove? :D Valve жжет...

 
  • Страница 1 из 1
  • 1
Поиск:

AMX Mod X Russian Community © 2006-2026