Принцип загрузки моделей

Tema05

Известный
Автор темы
1,637
547
На Аризоне есть система скейта и спрыгнув с него есть вероятность зацепить его персонажам до того как сервер удалит транспорт. Из-за этого будут бесконечно лететь варнинги и все процессы в игре заморозятся. Проблуждав много часов с дебаггером и смотря файл сампа в иде я выяснил, что проблема в том, что коллизия скейта не загружена из-за чего её обработка приводит к невозможности игрой продолжить обработку фрейма.

Я решил просто вызывать опкод 0247: load_model для загрузки модели, связи с чем погрузится и её коллизия, благодаря чему меня отпускает и игра продолжает работать.

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

Пока я это всё чинил скачал ultimate model viewer. И заметил, что если я через него открою скейт, то после этого коллизия никогда не выгружается. Я пока так и не понял почему.

Кто знает по каким принципам модели загружаются, выгружаются и как можно намертво оставить загруженной коллизию определённой модели?
 

Tectrex

Известный
154
185
опкод 0247 помечает модель в состояние "нужно загрузить", движок начинает подгружать DFF/текстуры и связанные ресурсы, следом как не удивительно идет опкод 0248 который проверяет, завершилась ли загрузка. Дальше ебать 0249 идет, классно да? Опкод 0249 снимает пометку "нужно", после этого движок может выгрузить модель по своему усмотрению. Внутренне движок стриминга держит счётчики ссылок для каждого ресурса, collision может подгружаться вместе с DFF или запрашиваться отдельно. Движок выгружает модели когда: пометка снята и ресурс не используется/не виден и/или при очистке стрима (освобождение памяти, удаление неактивных лодов). Программа Model Viewer, держит ссылку ну или создает экземпляр хз не шарю.

собственно ты вызываешь опкод 0247, коллизия загружается, но вскоре движок уменьшает счётчик и выгружает ресурс. Поэтому приходится дергать 0247 каждый раз. Тебе лучше хукать или пропатчить сам стриминг и найти функцию выгрузки модели в памяти клиента, и перехватывать вызов, блокируя выгрузку нужного model id.