Re: Патч от Hool1gan(антирелог)
Цитата:
|
Re: Патч от Hool1gan(антирелог)
Реальная причина такова, что из скриптов, это уж никак не пофиксить :D
У ладвы есть менеджемент хип, который используется для скриптовых объектов, а так же для объектов движка игры. Туда впиливаются текстуры, модели и много др. фигни. Реальная очистка хипа происходит при запуске сборщика мусора, который запускается только при загрузке уровня игры с нуля. Есть аж несколько причин почему FPS падает:) Первая из них - какие-то эффекты не возвращаются в пул (на более новых версиях клиента пофикшено). Вторая причина - фрагментация менеджемент хипа. Третья причина - загрузка левела, с нуля, происходит не то что редко, а очень редко, из-за чего запуск GC становится манной небесной. Четвертая причина - тупенький GC, который неумет разбирать сложные ссылки. Данные дефекты могут пофиксить только корейцы и только они, но уж ни как не парень "вася", который чето там подредактировал в скриптах :D Максимум, это исправить первую причину, которая лишь отсрочит "конец". Реальный вариант исправить "это" - вручную вызывать перезагрузку левела (при том надо дать серверу знать, что клиенту требуется заного переслать все объекты в регионе), попутно перефигачив половину core.dll & engine.dll. И да, ручной запуск GC, в процессе игры, выгрузит все загруженные ресурсы, поэтому такой вариант не канает. |
Re: Патч от Hool1gan(антирелог)
Цитата:
|
Re: Патч от Hool1gan(антирелог)
Цитата:
Ну и саму проблемы ты очень плохо описал, если простым языком, то объекты грузятся в память - по несколько раз, и не как оттуда не выгружаются, поскольку клиент не как это не регулирует(в плане источника - все очень разобщено(т.е не важно грузиться текстура либо скелетная модель, либо эмитер) все идет в общий поток, и на сколько я понял как раз эмитеры не передают флага - на выгрузку из памяти(когда игрок заюзал какой то скилл, предыдущий эмиттер остается) ибо время выполнения анимации скила - имеет не фиксированное значение, т.е от скила к скилу оно разное. А вот как это объяснить движку и стоит ли вообще - совсем другой вопрос. Цитата:
|
Re: Патч от Hool1gan(антирелог)
Цитата:
Добавлено через 2 минуты Цитата:
Даю подсказку: краш. Почему? Все отлично описано в моем посте выше. Цитата:
Вы можете сколько угодно устанавливать флаги в объектах (в объектах, КАРЛ!), только вот от фрагментации и от занятости памяти этими объектами, это не спасет. |
Re: Патч от Hool1gan(антирелог)
Цитата:
Но если бы такая потребность возникла, решалась бы она примерно по такой схеме(С проработкой механизма Garbage Collectora) возможно еще что-то, да я бы убил не мало времени на все это, но в целом это задача решаема(без костылей вроде перезагрузки всего уровня, который как раз запускает Garbage Collector и опять же, объясни мне как ты будешь определять когда нужно перезагрузить уровень, а когда нет ?) |
Re: Патч от Hool1gan(антирелог)
Цитата:
Добавлено через 9 минут Цитата:
фамильярность:Развернуть ↓Вы походу вообще не въежаете о чем речь. Окей, я объясню подробно. При вызове GC будет очищен выделенный хип, это означает: 1. Текстуры 2. Модели 3. Скриптовые объекты 4. Карты 5. ??? Будут ВЫГРУЖЕНЫ. Указатели на них могут сохраниться, где-то в недрах движка игры (unsafe, такой unsafe) и при обращении к памяти, где был раньше объект, либо ресурс, мы получим мусор. Далее поведение неопределенно, но, в большинстве случаев, это краш. Это понятно? Идем дальше. При загрузке нового левела игры, мы выгружаем старый, в этот момент, после выгрузки, мы по хорошему, должны запустить GC, а так же почистить указатели, там где требуется и уже после этого вгружать новый уровень. Все эти действия происходят при: 1. Телепорте (только GC не вызывается, плюс остаются референсы) 2. Входе в игру 3. Выходе из игры Вы бы убили всю свою жизнь, но не починили бы это, я это гарантирую. Вы даже не понимаете о чем идет речь:D Хотя, давайте попробуем. Вот флаг/маска, который должен передаваться на вызов GC, при телепорте: 67108864u, ах да, не забываем, что вызов GC деклалирован thiscall и нужно передавать в ecx указатель на объект. Если у Вас получится, то с меня пиво, в хорошем баре. Я даже облегчу задачу, вот код вызова GC, для Interlude:Развернуть ↓ |
Re: Патч от Hool1gan(антирелог)
n3k0nation, Почему никто из вас ещё не перепилил эту систему? Зубастик что-то пытался, но у него быстро иссяк энтузиазм.
|
Re: Патч от Hool1gan(антирелог)
Цитата:
|
Re: Патч от Hool1gan(антирелог)
Цитата:
И на счет GarbageCollector, он весь завязан на флагах, и обрабатывает все глобальные объекты, с пометкой GExitPurge(требующие выгрузки) RF_Native(загруженные в память)P.S> тот самый 67108864u, я не очень уверен что в самом классе эмиттеров - существует обработчик который эти самые флаги устанавливает, если условия соблюдены(к примеру объект создан), но скорее это в каком то более глобальном классе(Ибо только благодаря этим флагам происходит выгрузка из памяти по средствам GarbageCollect(по средствам того хука ты говоришь ему что все объекты с флагом native(т.е память), должны быть выгружены),и вообще их можно устанавливать и раньше и вызывать Destroy() намного раньше, но вот толку ? ). А решил бы я это как раз допиливанием класса эмитеров, и самого метода очистки, ибо он предназначен для более простой работы - нежели той где этот самый класс вызывают over9000 раз воимя хила ! Естественно он запускает рендер этих самых 9000 Объектов, тем самым грузит систему, и удаляет он их медленее чем они создаются, а возможно даже и не просчитывается это ввиду слишком быстрого запроса(отсюда и весь баг). Короче говоря это можно сделать(и без костылей, по канону), было бы желание. |
Текущее время: 10:00. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot