PrimeXT
PrimeXT copied to clipboard
Сильные лаги при стрельбе из гаусса
Если стрелять в какие-либо модели на карте, то всё нормально, но если стрелять в пол или стены, то начинаются сильные лаги.
Лаги исчезают если отключить PhysX. Начинаются в момент, когда спрайты падают на пол и отскакивают.
Пальцем в небо: спрайты попадают в коллизии друг друга (и земли) и не выталкиваются, происходит рекурсия обратных вызовов (callback) физ движка друг на друге, пока спрайты не исчезают по времени. Так может происходит если анимация спрайтов для физического движка приходит извне и не помечена как isKinematic, это мало того что может заставить физ движок переиницилизироваться каждый кадр, так ещё и может вызывать это замыкание вызовов.
Пальцем в небо: спрайты попадают в коллизии друг друга (и земли) и не выталкиваются, происходит рекурсия обратных вызовов (callback) физ движка друг на друге, пока спрайты не исчезают по времени. Так может происходит если анимация спрайтов для физического движка приходит извне и не помечена как isKinematic, это мало того что может заставить физ движок переиницилизироваться каждый кадр, так ещё и может вызывать это замыкание вызовов.
Интересненько. Это что-ли какая-то распространненная проблема с физ. движками, или просто гипотеза?
@SNMetamorph
Интересненько. Это что-ли какая-то распространненная проблема с физ. движками, или просто гипотеза?
Ну...
- С реинициализацией сцены физдвижка это что происходит с физиксом в юнити если начать двигать (крутить трансформы) без isKinematic на rigidbody (как и вообще двигать объекты у которых нет rigidbody). В идеале лучше анимировать самим физ. движком через его функции, если это возможно, но isKinematic на rigidbody тоже норм, либо (например в вашем случае это возможно) физ движок вообще не должен ничего знать про эти объекты будто их нет в сцене. Это я знаю по работе с юнити, где-то у них была статья на эту тему.
- Проблемы с callback это явным образом выяснилось когда помогал разгребать проблему тормозов одному инди проекту (которому симпатизирую) где использовался bullet и там гипотеза подтвердилась. Сам "баг" этот в физ. движах у разных игр я наблюдаю давно так что интуитивно это соотнёс с программерским опытом и опять же работой с юнити и пиксельлайт, то есть понял что там вызываются каллбеки и тупо замыкаются друг на друге, а чем больше таких пересечений тем "глубже" будет замыкание и потребление памяти с тормозами. Скорее всего физикс этому тоже подвержен, это по сути сама природа физ движков, кроме тех где это закостылено изначально (типа есть проверка на замыкание и стоит ограничение глубины вызовов). В обычной ситуации физ движок сам вытолкнет (когда что-то идёт не так он при этом ещё может накопить огромную силу выталкивания, именно поэтому видим неадекваты в играх где забыли закостылять), но учитывая что игровой движок контролирует анимацию извне (то есть перезаписывает координаты каждый кадр) он тупо не даёт физдвижку это делать.
Короче это опыт.
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.