|
Время между фреймами engine
|
|
| LtRAT | Дата: Пятница, 14.11.2008, 01:56:45 | Сообщение # 1 |
|
Сержант
Группа: Пользователи
Сообщений: 33
Статус: Не в сети
| сабж Для вычислений требуется знать, через какой промежуток времени engine вычисляет положения игрока и.т.п, основанное на времени между тиками... Данные тики в системе являются дискретными, для 50 фпс это будет ровно 0,02сек, для 91-100фпс (именно диапазон) это будет 0,01сек Вопрос: как получить или вычислить точное значение дискретов?
|
| |
|
|
| DaTa | Дата: Пятница, 14.11.2008, 02:10:57 | Сообщение # 2 |
|
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Статус: Не в сети
| пфф public frame() { static flTime new flGameTime = get_gametime() new flFrameTime = flGameTime - flTime flTime = flGameTime }
|
| |
|
|
| LtRAT | Дата: Пятница, 14.11.2008, 19:39:01 | Сообщение # 3 |
|
Сержант
Группа: Пользователи
Сообщений: 33
Статус: Не в сети
| Если было бы так просто - я бы не спрашивал Маленький лог для 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
Статус: Не в сети
| Через жопvelocity[2] неточно, потому что на скорость влияет не только гравитация, смотри pm_shared из hlsdk, player.cpp из dlls, а так же остальные файлы с исходным кодом(который в кс закрыт), которые влияют на атрибут игрока velocity. Самый точный метод - хукать плагином metamod PM_Move и смотреть ppmove->frametime.
|
| |
|
|
| LtRAT | Дата: Воскресенье, 16.11.2008, 17:43:13 | Сообщение # 5 |
|
Сержант
Группа: Пользователи
Сообщений: 33
Статус: Не в сети
| Формула давалась в упрощенном виде, и так-то понятно что в общем случае влияет не только 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
Статус: Не в сети
| Это время между кадрами на стороне клиента, а не сервера.
|
| |
|
|
| LtRAT | Дата: Воскресенье, 16.11.2008, 22:53:03 | Сообщение # 7 |
|
Сержант
Группа: Пользователи
Сообщений: 33
Статус: Не в сети
| Когда меня в очередной раз тыкнули носом в hlsdk, я умудрился не просмотреть как формируется серверный frametime: PM_PlayerMove >> pmove->frametime = pmove->cmd.msec * 0.001; Данный метод еще полностью не тестил, но теоретически должен подойти... Но поскольку многие вещи можно сделать несколькими способами - может будут идеи как получить frametime проще и без лишнего Форварда.
|
| |
|
|
| DaTa | Дата: Понедельник, 17.11.2008, 00:24:20 | Сообщение # 8 |
|
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Статус: Не в сети
| Quote (LtRAT) pmove->frametime = pmove->cmd.msec * 0.001; O_o Зачем тогда frametime нужен в структуре pmove? Valve жжет...
|
| |
|
|