HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Кажется, я починил DispatchAnimEvents
Досконально не тестировал
Страницы (10): « Первая ... « 6 7 8 9 [10]   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6749
Возраст: 33

Рейтинг



Цитата:
[CFR] B@N@N писал:
зомби тоже надо как-то улучшить. Их тупняки теперь становятся ещё более бросающимися в глаза.

Я тестировал на двух картах с барниками и зомбями. Ничего подозрительного не увидел. Нужно протестить на картах каких-то модов, у меня пока нет времени. Да и код такой себе, опять же, решает не проблему, а следствие. Это немного изменённый вариант того, что предложил Sigurth в этой теме.

Короче, как бы вам объяснить попроще... В общем, в оригинальном коде StudioFrameAdvance делает так:
C++ Source Code:
pev->frame += flInterval * m_flFrameRate * pev->framerate;

Прибавляет кадр, умножая интервал на фреймрейт секвенции (это фпс анимации в самой модели) и на фреймрейт энтити, который множитель от 0 до n раз.
А DispatchAnimEvents так:
C++ Source Code:
float flStart = pev->frame + (m_flLastEventCheck - pev->animtime) * m_flFrameRate * pev->framerate;
float flEnd = pev->frame + flInterval * m_flFrameRate * pev->framerate;

flStart получается равен pev->frame, или почти равен из-за погрешности. flEnd всегда больше pev->frame на определённое значение, поскольку flInterval фиксированный и равен 0.1. В сорсе flStart чётко равен предыдущему pev->frame, а flEnd текущему pev->frame. В промежутке от flStart до flEnd ищутся эвенты. Если они на этих кадрах есть, они играются. Если сорсовский код применить к голдсорсу, затупы уменьшаются, поскольку flInterval в DispatchAnimEvents становится не 0.1, а такой же, как в StudioFrameAdvance. То есть, он вообще внутри функции не используется, т.к. кадры уже посчитаны в StudioFrameAdvance. Это приводит к пропуску эвентов на последнем кадре, т.к. flStart и flEnd совпадают. Чтобы это побороть, я завёл дурацкий хак, увеличивающий значение flEnd внутри функции GetAnimationEvent.

Удачного решения проблемы пока нет. По логике, каждые 0.1 секунды (частота тчинка монстров) StudioFrameAdvance прибавляет кадр, а DispatchAnimEvents ловит эвенты в промежутке от конца предыдущего кадра включительно, до конца текущего не включая. Так вот, из-за фпс самой секвенции-анимации и игрового фпс при их высоких значениях, StudioFrameAdvance иногда просто не успевает поймать эвент на таком маленьком промежутке кадров и пропускает. Думаю, что выходом может стать отвязка функции DispatchAnimEvents от частоты тчинка монстров. Чтобы она срабатывала без паузы в 0.1 сек. Тогда надо как-то запоминать уже проигранные эвенты, чтобы они не дублировались, ведь анимация ещё может не успеть продвинуться достаточно далеко до нового вызова DispatchAnimEvents. Для этого Sigurth завёл массив m_rgiLastEventIndex.

Ещё кое-что забыл упомянуть. Указывайте, что пробуете под ксашем. Поведение с голдсорсом несколько разное. Да и вообще, в ксаше есть квар sv_fps, который позволяет фиксировать серверный фпс независимо от клиентского, и по идее ничего там делать не нужно, кроме фиксации самого квара на значении, когда энтити будут двигаться достаточно плавно при любых клиентских фпс.

Добавлено 18-08-2022 в 15:38:

Цитата:
[CFR] B@N@N писал:
А стрелять на бегу, как в свенкоопе, барник может?

Насколько я помню, барники в свенкоопе на бегу не стреляют. Это можно сделать, надо научить ИИ переключать активности движения независимо от других активностей. В ксашмоде есть необходимая база, нужно именно работать с ИИ. Вообще, проблема по большому счёту одна: нет нужных анимаций у моделей, ведь нужны стрейфы, ходьба и бег спиной вперёд. При наличии анимаций можно уже думать, использовать ли древний механизм с gaitsequence или красиво смешивать анимации, как в сорсе. Уже давно бы попросили кого-нибудь заанимировать и барников, и солдат и вообще всех, да задонатили Дяде Мише на полноценный код. Я же буду продолжать свои исследования, но чтобы серьёзно этим заняться нужны не только анимации, но и пара (десятков) ящиков пива новый SSD.

Добавлено 18-08-2022 в 19:01:

Кому интересно: вывод в консоль срабатываний GetAnimationEvent. Первый - обычный код, второй изменённый.
C++ Source Code:
1
GetAnimationEvent: event = 2, start = 0.000000, end = 0.000000
2
GetAnimationEvent: event = 2, start = 0.000000, end = 1.999998
3
GetAnimationEvent: event = 2, start = 1.999998, end = 3.999996
4
GetAnimationEvent: event = 2, start = 3.999996, end = 5.999994
5
GetAnimationEvent: event = 2, start = 5.999994, end = 7.999992
6
GetAnimationEvent: event = 2, start = 7.999992, end = 9.999990
7
GetAnimationEvent: event = 2, start = 9.999990, end = 11.999989
8
GetAnimationEvent: event = 2, start = 11.999989, end = 13.999987
9
GetAimationEvent: event = 2, start = 13.999987, end = 15.941406
10
GetAnimationEvent: event = 2, start = 14.941406, end = 15.941406
11
GetAnimationEvent: event = 2, start = 14.941406, end = 15.941406
12
] condump

C++ Source Code:
1
GetAnimationEvent: event = 2, start = 0.000000, end = 2.000000
2
GetAnimationEvent: event = 2, start = 2.000008, end = 4.000008
3
GetAnimationEvent: event = 2, start = 4.000015, end = 6.000016
4
GetAnimationEvent: event = 2, start = 6.000023, end = 8.000023
5
GetAnimationEvent: event = 2, start = 8.000031, end = 10.000031
6
GetAnimationEvent: event = 2, start = 10.000039, end = 12.000038
7
GetAnimationEvent: event = 2, start = 12.000047, end = 14.000047
8
GetAnimationEvent: event = 2, start = 14.000054, end = 16.000055
9
etAnimationEvent: event = 2, start = 14.941406, end = 16.941406
10
GetAnimationEvent: event = 2, start = 14.941406, end = 16.941406
11
] condump

Это для барника. Анимация draw_as, состоящая из 16 кадров. На последнем кадре эвент BARNEY_AE_DRAW 2. Если посмотреть внимательно, интервал в обоих случаях примерно одинаковый: 2 кадра. Оригинальный код делает лишний прогон в самом начале. Новый код выскакивает за пределы 16-тикадрового лимита (flEnd > 16) - это результат работы хака.

Добавлено 18-08-2022 в 21:27:

В какой-то из тем, посвящённых сабжу, кажется в теме Sigurth'a, поднималась проблема стрельбы у грантов: что первой очередью они стреляют четыре раза, а последующими уже по три, как положено, или наоборот... А ещё, что у грантов-дробашистов иногда пропадают маззлфлеши. Так вот. Отношения к коду это никакого не имеет. Это дерьмовые модели. Для решения первой проблемы нужно снять флаг loop у анимаций crouching_mp5 и standing_mp5. Для решения второй проблемы - переместить эвент маззлфлеша с 0-го кадра на 1-ый.
Половина глитчей исчезнет, если: не располагать эвенты на нулевом и последнем кадрах и не делать лупленными никакие анимации, где требуется высокая точность отлова эвентов. Если вы делаете мод со своими моделями, следуйте этому правилу, и даже со стандартным кодом некоторые мелочи исправятся.

Отредактировано Ku2zoff 18-08-2022 в 08:23

Сообщить модератору | | IP: Записан
Сообщение: 210717

Старое сообщение 18-08-2022 14:27
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32130
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
Ku2zoff писал:
да задонатили Дяде Мише на полноценный код

В ксаш-моде и параное полный набор всех фичей студиомоделей из сорса.
Ну за исключением рагдоллов, разве что. Надо только сам код монстров портировать из сорса и сделать модельки с соответствующими анимками.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 210719

Старое сообщение 19-08-2022 06:27
-
SNMetamorph
Житель форума

Дата регистрации: Jun 2018
Проживает: Ижевск
Сообщений: 559

Рейтинг



Цитата:
Ku2zoff писал:
Думаю, что выходом может стать отвязка функции DispatchAnimEvents от частоты тчинка монстров. Чтобы она срабатывала без паузы в 0.1 сек.

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

__________________
PrimeXT
GoldSrc Monitor
SMD Splitter
mdl-flip (gFlip analog)
Xash3D Modding Discord

Сообщить модератору | | IP: Записан
Сообщение: 210720

Старое сообщение 19-08-2022 06:28
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 02:00. Новая тема    Ответить
Страницы (10): « Первая ... « 6 7 8 9 [10]   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Кажется, я починил DispatchAnimEvents
Досконально не тестировал
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024