Долгий запуск Skyrim LE при использовании ENB ...

  • Author
  • Message
Offline
Posts: 7
Joined: 09 Jan 2018, 19:52
Location: Россия

Долгий запуск Skyrim LE при использовании ENB ...

Здравствуй Борис.

Я разрабатываю мод-менеджер который совмещает все моды и игру в одну виртуальную папку и сейчас я его тестирую. Без ENB Skyrim из смонтированной папки запускается примерно за 1.5 минуты, это приемлемо. При использовании ENB (Wrapper или Injector неважно) для полного запуска от (от запуска exe до появления меню игры) требуется 12 минут. Проверяя что программа делает во время запуска я вижу что всё это время тратится на постоянное открытие и закрытие файлов в папке %SkyrimRoot%\ENBSeries (01_Clear_02.ini, 04_Storm_Rain_02 и т. п.). Версия ENB для Fallout 4 (0.283 по крайней мере) таких проблем не вызывает, возможно потому что в моём пресете в папке ENBSeries нет погодных файлов.

Мне интересно как именно ENB обращается к этим файлам и сколько раз он их открывает и закрывает и вообще много ли I/O запросов выполняет ENB.

Offline
User avatar
*blah-blah-blah maniac*
Posts: 17427
Joined: 27 Dec 2011, 08:53
Location: Rather not to say

Re: Долгий запуск Skyrim LE при использовании ENB ...

Много раз считывает, но не на столько много, чтоб тормозить. На реальном компьютере с hdd погода считывается за пару секунд даже когда файлов погоды много (каждая переменная отдельно считывается). Не думаю, что это истинная причина тормозов, скорее что-то заставляет мод постоянно считывать параметры, перезапускаться (ресет девайса?).
_________________
i9-9900k, 64Gb RAM, RTX 3060 12Gb, Win7

Offline
Posts: 7
Joined: 09 Jan 2018, 19:52
Location: Россия

Re: Долгий запуск Skyrim LE при использовании ENB ...

Что ты имеешь в виду под "перезапускаться"? После 10-12 минут ожидания игра всё таки запускается и вполне играбельна, но например кнопка "Load config" во внутриигровом меню заставляет игру зависнуть пока параметры пишутся в погодные и прочие конфигурационные файлы. При простом удалении все этих файлов игра запускается за приемлемое время.

Пожалуй я теперь понимаю почему Mod Organizer работает только с папкой Data - это избавляет от многих проблем с нестандартными модами. А я то думал что главной проблемой будет SKSE, но нет он работает и не жалуется.
ресет девайса?
Не думаю. Папка остаётся монтированной всё время и всё это время выполняются IO запросы.
каждая переменная отдельно считывается
Эээ, но зачем? Не легче ли сразу считать весь файл в память и уже потом брать параметры, а не грузить каждый раз с диска. Не думаю что кто-то пострадает от использования лишней пары мегабайт памяти. Понимаю что тебе нет никакой нужды менять что-либо ради меня, но всё же я не понимаю этого. Или ты используешь функции GetPrivateProfileString/GetPrivateProfileInt?

И ещё несколько вопросов которые я всё равно хотел тебе задать.
  • Просто интересно. На каком языке ты пишешь ENB? Ясно что C или C++, но который именно?
  • В моём мод-менеджере ещё есть и конфигуратор игровых настроек. Помимо самой игры он позволяет настраивать и некоторые параметры ENB. Есть где-нибудь хорошее описание имеющихся параметров или хотя бы их граничные значения? Конечно я могу узнать их в самой игре, но спорю что у тебя есть какой-нибудь документ где всё это написано.

Offline
User avatar
*blah-blah-blah maniac*
Posts: 17427
Joined: 27 Dec 2011, 08:53
Location: Rather not to say

Re: Долгий запуск Skyrim LE при использовании ENB ...

кнопка "Load config" во внутриигровом меню заставляет игру зависнуть
Если игра в этом случае зависает больше чем на несколько секунд, то речь конечно не о ресете девайса. Либо работа с файлами, либо создание пунктов для редактора приводят к тормозам.
Или ты используешь функции GetPrivateProfileString/GetPrivateProfileInt?
GetPrivateProfileString/WritePrivateProfileString использую. Зачем мне делать чтение файлов целиком, если на нормальном компьютере пару секунд грузится все и никаких требований к скорости не предъявляется? Просто чтоб время потерять и реализовать читалку строк? Я не велосипедист. В общем ненормально такую производительность иметь и не мод пинать надо, ибо даже с антивирусом такого не будет происходить.
На каком языке ты пишешь ENB? Ясно что C или C++, но который именно?
c++, использую msvc++ 2005/2008
Есть где-нибудь хорошее описание имеющихся параметров или хотя бы их граничные значения? Конечно я могу узнать их в самой игре, но спорю что у тебя есть какой-нибудь документ где всё это написано.
На step project или как там он называется, только с ошибками некоторые вещи.
Хочу заметить, что мод нельзя вкладывать в состав другого софта, зачем тогда все это, не понимаю.
_________________
i9-9900k, 64Gb RAM, RTX 3060 12Gb, Win7

Offline
Posts: 7
Joined: 09 Jan 2018, 19:52
Location: Россия

Re: Долгий запуск Skyrim LE при использовании ENB ...

Если игра в этом случае зависает больше чем на несколько секунд, то речь конечно не о ресете девайса. Либо работа с файлами, либо создание пунктов для редактора приводят к тормозам.
На несколько минут, как и при запуске. Не вижу тут ничего удивительного.
GetPrivateProfileString/WritePrivateProfileString использую. Зачем мне делать чтение файлов целиком, если на нормальном компьютере пару секунд грузится все и никаких требований к скорости не предъявляется? Просто чтоб время потерять и реализовать читалку строк? Я не велосипедист. В общем ненормально такую производительность иметь и не мод пинать надо, ибо даже с антивирусом такого не будет происходить.
Я бы потратил и реализовал, но как знаешь. Тем более что в интернете есть уже готовые. Я пользуюсь SimpleINI.
На step project или как там он называется, только с ошибками некоторые вещи.
Я смотрел там. Всё неплохо, но я думал у тебя есть документация полнее, разработчик всё же. Или ты не содержишь документацию?
Хочу заметить, что мод нельзя вкладывать в состав другого софта, зачем тогда все это, не понимаю.
Никто и не вкладывает. Ну по крайней мере не я. Не все параметры можно настроить во внутриигровом меню, поэтому хочется иметь удобный настройщик и вне игры. Кстати, на чём написан внутриигровой конфигуратор? Может я угадаю и это CEGUI.

В любом случая я выпустил альфа версию, можешь посмотреть. Я буду искать способы решения этой проблемы. Должен быть способ это сделать монтируя всю папку целиком, а не только Data (наиболее простое решение).

Offline
User avatar
*blah-blah-blah maniac*
Posts: 17427
Joined: 27 Dec 2011, 08:53
Location: Rather not to say

Re: Долгий запуск Skyrim LE при использовании ENB ...

Я не пишу документацию, это убивает весь энтузиазм, все равно люди ничего не понимают, очевидное для меня описание оказывается для них квантовой физикой.
Гуй это anttweakbar.
Я бы потратил и реализовал, но как знаешь. Тем более что в интернете есть уже готовые. Я пользуюсь SimpleINI.
Зачем мне это делать, если уже есть готовые функции? Велосипедизм это плохой признак. С тем же успехом надо значит и редактор гуя свой писать, а можно за это время что-то полезное сделать и в сроки вписаться. Я не могу думать о том, что на некой экзотической системе отсутствует кэширование диска на чтение и будет тормозить, это проблема юзеров, у них все тормозить будет. Не знаю, что там у вас за виртуальная папка и кэш не работает или как-то функции медленнее выполняются/вызываются. Более того, мне не раз тут репортили, что с enbseries.ini игра крашит и в этих файлах куча комментариев, в том числе на тех же строках, что и параметры, не понятно чем все это редактировалось. Учесть кривые ручки и не поиметь проблем не так уж просто в самопальной читалке конфига. Выпущу новую версию и начнут писать, что старые пресеты не работают, оно мне надо?
_________________
i9-9900k, 64Gb RAM, RTX 3060 12Gb, Win7

Offline
Posts: 7
Joined: 09 Jan 2018, 19:52
Location: Россия

Re: Долгий запуск Skyrim LE при использовании ENB ...

Зачем мне это делать, если уже есть готовые функции?
И поэтому ты решил использовать самый плохой из доступных вариантов просто потому что скорость обычного дискового IO позволяет не задумываться о производительности.
Велосипедизм это плохой признак.
Ты уже второй раз пишешь это. Я тебя понял, я и сам не люблю делать бесполезную работу, но что всё же мешало взять нормальный INI парсер?

Offline
User avatar
*blah-blah-blah maniac*
Posts: 17427
Joined: 27 Dec 2011, 08:53
Location: Rather not to say

Re: Долгий запуск Skyrim LE при использовании ENB ...

Зачем мне задумываться о каком-то левом коде, проверять его на ошибки? Функции мелкософта отполированы десятилетиями и именно они породили исходный стандарт конфига в приложениях. Свое чтение из файла делал только для мода под заказ, там зашифрованный конфиг используется и такой же вшит в сам мод.
_________________
i9-9900k, 64Gb RAM, RTX 3060 12Gb, Win7

Offline
Posts: 7
Joined: 09 Jan 2018, 19:52
Location: Россия

Re: Долгий запуск Skyrim LE при использовании ENB ...

Хочешь несколько тестов? В моём пресете 51 погодный файл, в каждом примерно 1000 параметров. Округлив получаем примерно 50000 параметров. И вот восемь тестов. Первые четыре на виртуальной папке, остальные на реальной.

Как видишь чтение и запись всех этих параметров из виртуальной папки через GetPrivateProfileStringW/WritePrivateProfileStringW занимает от 8 до 10 минут. Использование SimpleIni занимает меньше чем 0.5 секунды.
С реальной папкой ситуация лучше, но всё же использование GetPrivateProfileStringW/WritePrivateProfileStringW тратит слишком много времени (больше минуты). Использование SimpleIni также требует не больше чем 0.5 секунды.

Не думаю что при загрузке ENB считывает значение *абсолютно* всех переменных иначе бы такие тормоза были бы заметны и без любых виртуальных папок. Полагаю очевидно, что комбинация GetPrivateProfileStringW/WritePrivateProfileStringW крайне не производительна.

Code: Select all

// Минуты и микросекунды округлены до целых в сторону нуля.
Virtual folder:

WritePrivateProfileStringW:
Write test for 50000 elements
Time: 767855688 microsec (12 min)

GetPrivateProfileStringW:
Read test for 50000 elements
Time: 495962324 microsec (8 min)

CSimpleIniW::SetValue
Write test for 50000 elements
Time: 456464 microsec (0 min)

CSimpleIniW::GetValue
Read test for 50000 elements
Time: 85410 microsec (0 min)



Real folder:

WritePrivateProfileStringW:
Write test for 50000 elements
Time: 99727038 microsec (1 min)

GetPrivateProfileStringW:
Read test for 50000 elements
Time: 72299993 microsec (1 min)

CSimpleIniW::SetValue
Write test for 50000 elements
Time: 123448 microsec (0 min)

CSimpleIniW::GetValue
Read test for 50000 elements
Time: 71648 microsec (0 min)
Зачем мне задумываться о каком-то левом коде, проверять его на ошибки? Функции мелкософта отполированы десятилетиями и именно они породили исходный стандарт конфига в приложениях. Свое чтение из файла делал только для мода под заказ, там зашифрованный конфиг используется и такой же вшит в сам мод.
Ты вообще сторонние библиотеки не используешь если только они не имеют в запасе пару десятков лет использования и не сделаны известной компанией?

Тот же SimpleIni лежит на гитхабе. Думаю если там что-то и не работало, то это уже поправили. Я бы не пожалел времени и сам переписал бы тебе всё с использованием этого или любого другого INI-парсера если бы твой мод был с открытым исходным кодом.

Offline
User avatar
*blah-blah-blah maniac*
Posts: 17427
Joined: 27 Dec 2011, 08:53
Location: Rather not to say

Re: Долгий запуск Skyrim LE при использовании ENB ...

Блин, ну нафига, неужели так сложно просто прислушаться к моему опыту? Теперь пришлось тратить время и свой тест писать.

Code: Select all

	char	filepath[512]; filepath[511]=0;
	GetCurrentDirectoryA(511, filepath);
	char	str[1024];
	memset(str, 0, 1024);
	sprintf(str, "1");

	DWORD	elapsed=GetTickCount();

#define EWRITE

	for (int fn=0; fn<50; fn++)
	{
		char	filename[512];
		memset(filename, 0, 512);
		sprintf(filename, "%s\\test%d.txt", filepath, fn);
		for (int cat=0; cat<10; cat++)
		{
			char	scat[64];
			memset(scat, 0, 64);
			sprintf(scat, "SOMECATEGORYNAME%d", cat);
			for (int key=0; key<100; key++)
			{
				char	skey[64];
				memset(skey, 0, 64);
				sprintf(skey, "SomeKeyName%d", key);

#ifdef EWRITE
				WritePrivateProfileStringA(scat, skey, str, filename);
#else //EWRITE
				char	tempdefaultdata[32];
				tempdefaultdata[0]=0;
				tempdefaultdata[1]=0;
				sprintf(tempdefaultdata, "enbblahblahblahenb");
				DWORD	res=GetPrivateProfileStringA(scat, skey, tempdefaultdata, skey, 63, filename);
#endif //!EWRITE
			}
		}
	}
	elapsed=GetTickCount() - elapsed;
	sprintf(str, "Time passed sec: %f", ((float)elapsed)/1000.0f);
	MessageBoxA(NULL, str, "Result", MB_OK);
Запись 1000 переменных в 50 файлов 9.29 секунды. Чтение потом из них (перекомпиляция без EWRITE) за 6.45 секунд. И это на ноуте семилетней давности, win7 x64. Я не знаю, что там за виртуальные папки такие и как они делаются, но даже с реальной по вашей статистике получается в десять раз медленнее. Даже юникодовые функции не дадут таких тормозов. Если это некая специфика win10, то с этого и надо начинать (только никто еще не жаловался). Но не верю, это криво настроенная система или использование говнософта, типа антивирусов или "ускорялок игр".

Посмотрел мельком simpleini. Куча бесполезного кода, типичное современное задротство, куча бесполезного кода для усложнения, очередное доказательство, что от левака надо держаться подальше.
_________________
i9-9900k, 64Gb RAM, RTX 3060 12Gb, Win7
Post Reply