PrimeXT icon indicating copy to clipboard operation
PrimeXT copied to clipboard

Сильные лаги при стрельбе из гаусса

Open SNMetamorph opened this issue 4 years ago • 5 comments

Если стрелять в какие-либо модели на карте, то всё нормально, но если стрелять в пол или стены, то начинаются сильные лаги.

SNMetamorph avatar Aug 18 '21 19:08 SNMetamorph

Лаги исчезают если отключить PhysX. Начинаются в момент, когда спрайты падают на пол и отскакивают.

SNMetamorph avatar Aug 22 '21 15:08 SNMetamorph

Пальцем в небо: спрайты попадают в коллизии друг друга (и земли) и не выталкиваются, происходит рекурсия обратных вызовов (callback) физ движка друг на друге, пока спрайты не исчезают по времени. Так может происходит если анимация спрайтов для физического движка приходит извне и не помечена как isKinematic, это мало того что может заставить физ движок переиницилизироваться каждый кадр, так ещё и может вызывать это замыкание вызовов.

0x4E69676874466F78 avatar Sep 25 '21 09:09 0x4E69676874466F78

Пальцем в небо: спрайты попадают в коллизии друг друга (и земли) и не выталкиваются, происходит рекурсия обратных вызовов (callback) физ движка друг на друге, пока спрайты не исчезают по времени. Так может происходит если анимация спрайтов для физического движка приходит извне и не помечена как isKinematic, это мало того что может заставить физ движок переиницилизироваться каждый кадр, так ещё и может вызывать это замыкание вызовов.

Интересненько. Это что-ли какая-то распространненная проблема с физ. движками, или просто гипотеза?

SNMetamorph avatar Sep 25 '21 09:09 SNMetamorph

@SNMetamorph

Интересненько. Это что-ли какая-то распространненная проблема с физ. движками, или просто гипотеза?

Ну...

  1. С реинициализацией сцены физдвижка это что происходит с физиксом в юнити если начать двигать (крутить трансформы) без isKinematic на rigidbody (как и вообще двигать объекты у которых нет rigidbody). В идеале лучше анимировать самим физ. движком через его функции, если это возможно, но isKinematic на rigidbody тоже норм, либо (например в вашем случае это возможно) физ движок вообще не должен ничего знать про эти объекты будто их нет в сцене. Это я знаю по работе с юнити, где-то у них была статья на эту тему.
  2. Проблемы с callback это явным образом выяснилось когда помогал разгребать проблему тормозов одному инди проекту (которому симпатизирую) где использовался bullet и там гипотеза подтвердилась. Сам "баг" этот в физ. движах у разных игр я наблюдаю давно так что интуитивно это соотнёс с программерским опытом и опять же работой с юнити и пиксельлайт, то есть понял что там вызываются каллбеки и тупо замыкаются друг на друге, а чем больше таких пересечений тем "глубже" будет замыкание и потребление памяти с тормозами. Скорее всего физикс этому тоже подвержен, это по сути сама природа физ движков, кроме тех где это закостылено изначально (типа есть проверка на замыкание и стоит ограничение глубины вызовов). В обычной ситуации физ движок сам вытолкнет (когда что-то идёт не так он при этом ещё может накопить огромную силу выталкивания, именно поэтому видим неадекваты в играх где забыли закостылять), но учитывая что игровой движок контролирует анимацию извне (то есть перезаписывает координаты каждый кадр) он тупо не даёт физдвижку это делать.

Короче это опыт.

0x4E69676874466F78 avatar Sep 25 '21 11:09 0x4E69676874466F78

https://github.com/SNMetamorph/PrimeXT/blob/44a56c60ef037a3520d4814818e24447eb966179/server/cbase.h#L116-L121 вот режимы есть https://github.com/SNMetamorph/PrimeXT/blob/44a56c60ef037a3520d4814818e24447eb966179/server/physic.cpp#L702 у энтитей это похоже прописывается https://github.com/SNMetamorph/PrimeXT/blob/44638c90c79554bbda0b58f0506194f740b08f84/server/effects.cpp#L2056-L2057 не знаю связано ли с оружием, но AddForce признак что это использует апи физ движка и здесь должно быть хорошо. https://github.com/SNMetamorph/PrimeXT/blob/44a56c60ef037a3520d4814818e24447eb966179/server/cbase.h#L383 Логика терминов частично отличается от юнити, здесь RigidBody это только ACTOR_DYNAMIC Кстати ACTOR_KINEMATIC мало используется, если поиск не врёт.

Короче если переосмыслить на реалии прайма, то: ACTOR_STATIC нельзя двигать вообще, сразу реинициализация сцены ACTOR_DYNAMIC нужно двигать только через WorldPhysic https://github.com/SNMetamorph/PrimeXT/blob/44a56c60ef037a3520d4814818e24447eb966179/server/physic.h#L25-L71 двигаешь иначе -> реинициализация сцены ACTOR_KINEMATIC двигай как хочешь, хотя смотрю там есть MoveKinematic, значит наверное лучше через него?

ACTOR_KINEMATIC работает так что на него физика не распространяется, но он, если не путаю, может влиять на физику других объектов. Это стоит проверить в случае с анимированными частицами. Возможно есть смысл выставить ACTOR_INVALID.

0x4E69676874466F78 avatar Sep 25 '21 12:09 0x4E69676874466F78