• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

Готика 2: НВ Неофициальный фикс памяти

Ну как оно?


  • Всего проголосовало
    136

lviper

Участник форума
Регистрация
27 Дек 2015
Сообщения
60
Благодарности
74
Баллы
165
Шапка в разработке

Неофициальный фикс на память для игр Готика 1 - Готика 2: Ночь Ворона подменяет оригинальную библиотеку для работы с памятью SmartHeap на более новую Hoard, которая лучше работает на современных компьютерах. Особенно полезно для больших аддонов и модов, где уменьшает фризы и вероятность вылета с OutOfMemory, но может использоваться и на чистой игре без каких-либо модов.

Установка:
0) VS 2015 C++ Redistributable: https://www.microsoft.com/ru-ru/download/details.aspx?id=48145
1) Создание резервной копии shw32.dll из Г2НВ/System (не пропускайте этот шаг, это важно, правда!)
2) Распаковка архива и копирование из него dll файлов в Г2НВ/System с заменой
На x64 системах рекомендуется применять совместно с 4gb_patch (хотя и не обязательно).

Отписывайтесь, и пожалуйста указывайте версию виндовс, ее разрядность, процессор, объем оперативной памяти и установлен ли 4gb_patch. Если игра запускалась с модом/аддоном указывайте также его и его версию.

В настоящий момент библиотека еще не тестировалась с Готикой 1, но игра с ней нормально запускается и работает. Если будут какие-то проблемы, фаталы можете отписываться в этой же теме. Также у меня не было возможности проверить работоспособность на оригинальной Г2 без аддона, но скорее всего тоже должно работать,

Версия обновлена v06 (16.01.2016).
Изменения:
Уменьшено требование к резервированию памяти при включенном MessageBox
Добавлена опция bUseNewHandler в ini-файл, позволяющая выбирать способ отлова OutOfMemory как в версиях v03a- или v04+.
Исходники удалены из архива.

Полная история изменений содержится в Архиве версий.

Настройки, добавляемые в SystemPack.ini:
Код:
[SHW32]
reserveInMb=50     ; (v05+) Сколько резервировать (в Мб)
bShowGothicError=1 ; (v05+) Использовать обработчик ошибок Готики (показывать окно фатала со стеком)
bShowMsgBox=0      ; (v05+) показывать MessageBox
bUseNewHandler=1   ; (v06+) использовать обработчик OutOfMemory из (v04+)
reserveInMb - сколько памяти будет зарезервировано на случай OutOfMemory (в Мб). Значение по умолчанию: 50.
5 - минимальное значение, оптимально если отключать bShowGothicError или если у вас не установлен 4gb_patch и часты вылеты по OutOfMemory
30-60 - хороший выбор, если не включать bShowMsgBox, с большой вероятностью правильно сохраняет стек.
120-150 - применять только с 4gp_patch, хороший выбор, если включать bShowMsgBox и bShowGothicError или если важно что программа по возможности более корректно завершится при включенном bShowGothicError.
300 - максимальное значение

bShowGothicError - показывать ли ошибку готики (1 - да, по умолчанию), (0 - нет) в случае возникновения OutOfMemory.
Если выключенно, то в этом случае вы можете резервировать минимальное количество памяти, однако не будет сообщение о фатале и игра не сможет обработать эту ошибку. Это похоже на то, как если бы при OutOfMemory готика автоматически завершалась через диспетчер задач, не оставляя никакого сообщения об ошибке, что не рекомендуется. Если выключен также и bShowMsgBox, то игра просто закрывается при OutOfMemory, без каких-либо уведомлений.
В v05 отключение срабатывает не всегда и иногда игра все-таки окно Готики даже при bShowGothicError = 1.

bShowMsgBox - показывать стандартную для виндовс сообщение об ошибке с текстом OutOfMemory. Теперь-то вы точно будете знать, что произошел именно OutOfMemory, а не какой-то другой фатал. Правда при включенном bShowGothicError в v05 требует резервирования большого количества памяти.

bUseNewHandler - вид используемого обработчика OutOfMemory
0 - отлавливать только те OutOfMemory, которые произошли при вызове методов из shw32.dll. Этот метод применялся в версиях v03a-
1 (по умолчанию) - позволяет отловить OutOfMemory во всех модулях, даже если они используют свой аллокатор, а не обращаются к shw32.dll. Использовался в (v04-v05). Однако у некоторых пользователей он может вызывать микрофризы в городе, в этом случае рекомендуется установить 0.

Просьба для тех кто хочет залить фикс на другой ресурс:
Если у вас фикс запустился и помог, я вполне могу понять ваше возможное желание поделиться им с другими. И с формальной точки зрения, лицензия GPL 2.0, под которой был опубликован фикс из-за Hoard позволяет вам это сделать как угодно, даже не ставив меня в известность, так что запретить вам это я тоже не могу.
И тем не менее, у меня просьба, пока что не распространять его, поскольку в этом случае я не буду иметь большой статистики работоспособности и не смогу вносить исправления (если еще будут) и получать отзывы.
Даже если с текущим билдом все хорошо, мне еще хотелось бы подредактировать readme.
Спасибо за понимание.



Добавлены сборки с другими библиотеками аллокации, а именно с JeMalloc, TCMalloc и CRT. Забирать из архива версий. Если у вас проблема с Hoard, или просто есть желание протестировать с какой пойдет лучше, можете попробовать их.

Архив версий
 

Вложения

  • Gothic_1_2_mem_fix_v06.zip
    56,5 KB · Просмотры: 5.071
  • Gothic_1_2_mem_fix_v06_others.zip
    113,2 KB · Просмотры: 2.337
Последнее редактирование:

Imbaprofeeder

Участник форума
Регистрация
12 Авг 2015
Сообщения
54
Благодарности
35
Баллы
170
На удивление вылеты пропали, W10 x64
 

lviper

Участник форума
Регистрация
27 Дек 2015
Сообщения
60
Благодарности
74
Баллы
165
На удивление вылеты пропали, W10 x64
Спасибо что отписался. В теории совсем исправить вылеты невозможно по объективным причинам, т.к. фрагментация памяти неотвратимо, хотя и медленно приближается, как тепловая смерть вселенной:) Но по-моему тоже стало лучше.

Вот копипаста из моего отсчета проверок (с закрытого раздела возвращения 2.0):
Тестировал так: 1) Дошел до города, сохранился напротив Гарада, поставил максимальные настройки графики (обзор и текстуры).
2) CFF Explorer'ом снял ЛааХак, а в gothic.ini вернул значения кэшов по-умолчанию из Г2НВ (т.к. с новыми значениями, подогнанными под ЛааХак все совсем печально).
3) Запускал готику,
4) загружал сейв, делал полный оборот вокруг оси, сохранялся на соседний слот, повторял 4) до OutOfMemory
Считал количество полных циклов загрузка-оборот-сейв до возникновения OutOfMemory.
Итог:
1) Оригинальный shw32.dll: 1 (2 загрузки, 1 сейв - нормально, на втором сейве стабильно OutOfMemory).
2) Замена shw32.dll, используя malloc/free из стандартной библиотеки: 3 (аналогично - 4 загрузки и 3 сохранения нормально).
3) Замена shw32.dll, используя malloc/free из библиотеки hoard: 6 (7 загрузок, 6 сейвов).
Сразу предупреждаю, что я не рекомендую снимать 4gb_patch (ЛааХак), как-то специально менять кеши и устанавливать максимальные настройки графики (лучше обзор на 100% (=200%Г2НВ), а текстуры на одно деление меньше максимума, или еще ниже, смотрите сами), первые шаги сделаны исключительно в рамках тестирования, чтобы можно было быстрее получить пресловутою ошибку, чтобы понять имеет ли смысл в подобном исправлении. Но даже в таком синтетическом тесте, на В2 этот патч у меня уменьшил количество вылетов по OutOfMemory, условно говоря в 3-7 раз, поэтому решил что им уже можно делиться с сообществом.



Меня особенно интересует как этот патч себя проявит на 32-битных системах, особенно если на WinXP. Я даже не уверен, что игра с этими библиотеками там вообще запуститься (но на всякий случай при проблемах с запуском на старых системах можно попробовать переименовать shw32.dll_xp в shw32.dll и скопировать его в Г2НВ/System (эта тот же самый код, просто скомпилирован с немного другими настройками, хотя по-хорошему там имело смысл компилировать программу и libhoard с более старым Windows SDK, но у меня сейчас нет возможности сделать это, да и к тому же может окажется что заработает и так)).
 
Последнее редактирование:

DAN_52rus

Участник форума
Регистрация
11 Мар 2015
Сообщения
108
Благодарности
43
Баллы
190
Большое спасибо! Попробовал сыграть в Возвращение 2.0 с этим фиксом, фризы исчезли, а Аут ов Мемори убирал до установки данного фикса 4gb_patch'ем. Наиграл примерно полтора часа, вернулся из далёкой локи в Хоринис, там тоже всё было нормально (180% обзор, прочие настройки на максимуме), но потом, при перезагрузке сейва вылетело с ошибкой (Я в этом особо не разбираюсь, но там была 1 строчка, в конце которой написано то ли по русски Неизвестно, то ли по инглишу Unknown). Впрочем, до этого ошибки вылетали либо сразу, либо приходили вместе с фризами после 30-60 минут игры. Ещё раз спасибо, ОС - Windows 7 x64.
 

lviper

Участник форума
Регистрация
27 Дек 2015
Сообщения
60
Благодарности
74
Баллы
165
Спасибо, если еще будет повторяться ошибка Unknown, либо поймешь как ее воспроизводить, можешь описать и приложить сейв? Потому что если ошибка Unknown, то скорее всего она произошла в этой библиотеке (так и не разобрался как передать готике2 отладочную информацию, поэтому любой фатал внутри этой реализации shw32.dll будет отображен ей как Unknown).
Мне кажется наиболее вероятным, что произошел OutOfMemory (рекомендую все-таки уменьшить обзор до 100% (из-за SP это равно 200% оригинальной Г2НВ)). Тогда там сначала должен был быть мессаджбокс с OutOfMemory, который ты мог не увидеть, если играл в фулскрине, но случайно выбрал Retry, что вызвало срабатывание брейкпоинта, что движок игры и воспринял как неизвестную ошибку, т.к. отладчик подключен не был.
Наверно мне имело смысл вообще выпилить этот выбор и сразу выкидывать при OutOfMemory, что скорее всего и сделаю, если буду обновлять фикс.
 
Последнее редактирование:

DAN_52rus

Участник форума
Регистрация
11 Мар 2015
Сообщения
108
Благодарности
43
Баллы
190
Хорошо, отпишусь ещё. Ну и да, играю на фулскрине, но раньше, без ЛааХака, OutOfMemory частенько вылазил и выбор был, причём по русски (Выбирал "Повторить"). А сейчас именно при перезагрузке сейва вылетело, без намёков на OutOfMemory (игру пока не запускал).
 

lviper

Участник форума
Регистрация
27 Дек 2015
Сообщения
60
Благодарности
74
Баллы
165
Это плохо, т.к. я не представляю что еще могло пойти не так.
Но при OutOfMemory у меня тоже должно быть похожее окно с выбором из этих трех кнопок (язык кнопок выбирается системой автоматически).
 

DAN_52rus

Участник форума
Регистрация
11 Мар 2015
Сообщения
108
Благодарности
43
Баллы
190
Ясненько, ну в общем, если будет что то ещё, то я обязательно отпишусь.
 

Imbaprofeeder

Участник форума
Регистрация
12 Авг 2015
Сообщения
54
Благодарности
35
Баллы
170
Вылеты раньше были даже в башне Ксардаса, не говоря уже про лес. После фикса выбежал из башни, пробежался в миненталь, всё было гладко. Приду с работы и потестирую на W7 x32, мб попробую на убунте поднять для фана, раз либа кроссплатформенная.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
но потом, при перезагрузке сейва вылетело с ошибкой (Я в этом особо не разбираюсь, но там была 1 строчка, в конце которой написано то ли по русски Неизвестно, то ли по инглишу Unknown). Впрочем, до этого ошибки вылетали либо сразу, либо приходили вместе с фризами после 30-60 минут игры. Ещё раз спасибо, ОС - Windows 7 x64.
Если словил еррор, и есть возможность поработать из проводника Винды, то:
1. сразу открываем Блокнот, и скидываем в него все что есть в буфере обмена, если конечно туда передалось что либо. Сохраняем файл в виде *.тхт
2. делаем скрин еррора по возможности, и сохраняем кго в *.жпг или *.пнг.
3. создаем какую нить папку новую, например "еррор", закидываем в нее, текстовый файл что указан выше, скрин ошибки, сейв(ы), если таковые были или требуются, Готик2.рпт файл, может валятся в корне диска с установленной игрой, в корне каталога игры или в каталоге систем игры.
Обязательно посмотреть содержимое файла *.рпт, чтобы не высылать тестировочные отчеты РВ, от 2001 года..))) Открыть его можно любым текстовым редактором...
4. все это дело с каталогом в архив, и прицепухой к вашему сообщению во вложение форума...
Профит..

(из-за AST это равно 200% оригинальной Г2НВ).
Это не АСТ, а СП, в нем видимость умножается в двое.
 

lviper

Участник форума
Регистрация
27 Дек 2015
Сообщения
60
Благодарности
74
Баллы
165
Если словил еррор, и есть возможность поработать из проводника Винды, то
Спасибо, у меня там правда была проблема в том, что готика2 не видела кол стек, а на любую ошибку выдавала сообщение из одной строки Unknown, из чего было нельзя сделать какие-то выводы. Но вроде понял как компилить, чтобы движок видел что нужно.

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

DAN_52rus

Участник форума
Регистрация
11 Мар 2015
Сообщения
108
Благодарности
43
Баллы
190
Фикс обновил. Играл примерно 3 часа и наиграл бы больше, если бы не надо было кое-куда поехать. Полёт шикарный - вылетов не было, фризов тоже. Посетил самую лагающую, на мой взгляд, локацию - Долину Рудников, с этим фиксом не заметил ни одного лага, серьёзно. Проделал маршрут Долина Древних - Яркендар - Хоринис - ДР - Кладбище Орков - ДР - Хоринис - Яркендар - Долина Древних. Перезагружался не так уж много и не так уж часто, примерно 5 раз. Хотя в прошлый раз ошибка вылетела при первой же перезагрузке (не совсем уверен). Ещё раз спасибо за фикс!
 

unknown111

Участник форума
Регистрация
5 Фев 2013
Сообщения
1.075
Благодарности
1.586
Баллы
290
Большие моды, вроде Возвращения 2 выявили проблемы с управлением памятью в игре Готика 2: Ночь Ворона.
В связи с вылетами было принято решение написать подмену библиотеки Shw32.dll (из Smartheap), отвечающую за распределение памяти, которая бы делегировала заботу о памяти более современной библиотеке Hoard.

т.е. для того что бы об этом задумались нужно было просто наклепать в моды кучу 2048 текстур?

а вообще если это действительно работает, то это довольно круто... можно усе обвешать в 2048p :D
потом как-нибудь проверю
 

lviper

Участник форума
Регистрация
27 Дек 2015
Сообщения
60
Благодарности
74
Баллы
165
а вообще если это действительно работает, то это довольно круто... можно усе обвешать в 2048p :D
потом как-нибудь проверю
Вы там поаккуратнее, товарищи мододелы) Смотрите и эту библиотеку не положите рядом с умной кучей)
 

Gor

Участник форума
Регистрация
26 Дек 2009
Сообщения
977
Благодарности
547
Баллы
245
SP1.5 Патчи: AST, 4GB

1) OS Win 7 x64, CPU AMD Athlon 64 X2, RAM 4GB
До установки патча G2NR_SHW32 ошибок и вылетов не было. Только увеличивающиеся со временем фризы. После установки первой версии патча ничего не изменилось.

2) OS Win7 x64, CPU i5 3470K, RAM 8GB
До установки патча G2NR_SHW32 ошибок и вылетов не было. Фризов практически нет. Со временем слегка увеличиваются. После установки первой версии патча начало сильно фризить. После установки третей версии патча чуть-чуть сильнее стало фризить, чем в оригинале.

ЗЫ Я вижу некоторым людям помогло. Интересно, в чем причина таких разных результатов?
 

Imbaprofeeder

Участник форума
Регистрация
12 Авг 2015
Сообщения
54
Благодарности
35
Баллы
170

lviper

Участник форума
Регистрация
27 Дек 2015
Сообщения
60
Благодарности
74
Баллы
165
ЗЫ Я вижу некоторым людям помогло. Интересно, в чем причина таких разных результатов?
Без понятия, я не пытался разбираться как именно работает библиотека. Выбрал именно ее, потому что на моей машине она дала лучший результат, из всех которые я пробовал. К слову без понятия почему у тебя разные фризы на разных версиях библиотек, потому что там очень небольшие изменения и по производительности они отличаться не должны, вообще. К слову, а как долго ты играл с этой библиотекой? Я просто предполагаю, что возможно лаги сойдут на нет через пол минуты игры, просто возможно эта библиотека более продвинута и ей нужно больше времени на то, чтобы "разогреться" и инициализировать все свои структуры данных, а после того, как она поймет что программа использует много памяти, дальше уже лаги исчезнут. Соответственно, если ты, например, запустил, загрузился, побегал секунд 20 и в ужасе удалил, то ты возможно просто не дал библиотеке раскрыть свой потенциал.

Я могу дать тебе попробовать dll без Hoard, но из стандартной библиотекой VS C++ (у меня на ней лаги были больше, но вдруг именно у тебя она почему-то пойдет лучше). Приложил, если захочешь проверить, но лично я сомневаюсь что поможет.
Как еще один вариант можешь найти знакомого C++ программиста, который согласился бы подключать библиотеки аллокации памяти и перекомпилировать, чтобы найти ту, которая будет идти хорошо, благо из-за Hoard исходники этой dll открыты и подключить туда любую другую скомпилированную библиотеку должно быть делом пяти минут. Я этим не занимаюсь, потому что у меня и так хорошо идет, а мне не хочется возиться с настройками и компиляцией разных библиотек (я очень не люблю подобные вещи).
 

Вложения

  • G2NR_SHW32_VS.zip
    6,7 KB · Просмотры: 396

Gor

Участник форума
Регистрация
26 Дек 2009
Сообщения
977
Благодарности
547
Баллы
245
К слову, а как долго ты играл с этой библиотекой?
По прошествию нескольких часов третья версия работает отлично на этом компе
OS Win7 x64, CPU i5 3470K, RAM 8GB
Стало лучше чем было, однозначно. Почему с первой версией тормозило неизвестно. Может что-то другое мешало?..
На первом компе
OS Win 7 x64, CPU AMD Athlon 64 X2, RAM 4GB
все как было так и осталось. Никаких различий. Что есть патч, что нет. Думаю дело в слабом процессоре и большом количестве полигонов.
Спасибо.
 

lviper

Участник форума
Регистрация
27 Дек 2015
Сообщения
60
Благодарности
74
Баллы
165
Стало лучше чем было, однозначно. Почему с первой версией тормозило неизвестно. Может что-то другое мешало?..
Ну в коде я не вижу ничего, что могло бы влиять на производительность, так что даже не знаю. Может антивирь, например, обнаружил подмену файла и решил следить за ним с особым пристрастием первое время? А так без понятия.

все как было так и осталось. Никаких различий. Что есть патч, что нет. Думаю дело в слабом процессоре и большом количестве полигонов.
Скорее всего. Возможно производительность и правда во что-то другое упирается, а может просто выбранная библиотека хорошо работает в первую очередь с более новыми компами (собственно на своем сайте в рекламных статьях они в первую очередь упирают на хорошую работу с многопоточными программами на многопроцессорных/многоядерных системах, так что скорее всего оптимизируют в первую очередь под самое последнее железо).
 
Последнее редактирование:
Сверху Снизу