Здравствуй Борис.
Я разрабатываю мод-менеджер который совмещает все моды и игру в одну виртуальную папку и сейчас я его тестирую. Без 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.
Долгий запуск Skyrim LE при использовании ENB ...
- Author
- Message
-
Offline
- Posts: 7
- Joined: 09 Jan 2018, 19:52
- Location: Россия
-
Offline
- *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
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, но нет он работает и не жалуется.
И ещё несколько вопросов которые я всё равно хотел тебе задать.
Пожалуй я теперь понимаю почему Mod Organizer работает только с папкой Data - это избавляет от многих проблем с нестандартными модами. А я то думал что главной проблемой будет SKSE, но нет он работает и не жалуется.
Не думаю. Папка остаётся монтированной всё время и всё это время выполняются IO запросы.ресет девайса?
Эээ, но зачем? Не легче ли сразу считать весь файл в память и уже потом брать параметры, а не грузить каждый раз с диска. Не думаю что кто-то пострадает от использования лишней пары мегабайт памяти. Понимаю что тебе нет никакой нужды менять что-либо ради меня, но всё же я не понимаю этого. Или ты используешь функции GetPrivateProfileString/GetPrivateProfileInt?каждая переменная отдельно считывается
И ещё несколько вопросов которые я всё равно хотел тебе задать.
- Просто интересно. На каком языке ты пишешь ENB? Ясно что C или C++, но который именно?
- В моём мод-менеджере ещё есть и конфигуратор игровых настроек. Помимо самой игры он позволяет настраивать и некоторые параметры ENB. Есть где-нибудь хорошее описание имеющихся параметров или хотя бы их граничные значения? Конечно я могу узнать их в самой игре, но спорю что у тебя есть какой-нибудь документ где всё это написано.
-
Offline
- *blah-blah-blah maniac*
- Posts: 17427
- Joined: 27 Dec 2011, 08:53
- Location: Rather not to say
Re: Долгий запуск Skyrim LE при использовании ENB ...
Если игра в этом случае зависает больше чем на несколько секунд, то речь конечно не о ресете девайса. Либо работа с файлами, либо создание пунктов для редактора приводят к тормозам.кнопка "Load config" во внутриигровом меню заставляет игру зависнуть
GetPrivateProfileString/WritePrivateProfileString использую. Зачем мне делать чтение файлов целиком, если на нормальном компьютере пару секунд грузится все и никаких требований к скорости не предъявляется? Просто чтоб время потерять и реализовать читалку строк? Я не велосипедист. В общем ненормально такую производительность иметь и не мод пинать надо, ибо даже с антивирусом такого не будет происходить.Или ты используешь функции GetPrivateProfileString/GetPrivateProfileInt?
c++, использую msvc++ 2005/2008На каком языке ты пишешь ENB? Ясно что C или C++, но который именно?
На step project или как там он называется, только с ошибками некоторые вещи.Есть где-нибудь хорошее описание имеющихся параметров или хотя бы их граничные значения? Конечно я могу узнать их в самой игре, но спорю что у тебя есть какой-нибудь документ где всё это написано.
Хочу заметить, что мод нельзя вкладывать в состав другого софта, зачем тогда все это, не понимаю.
_________________
i9-9900k, 64Gb RAM, RTX 3060 12Gb, Win7
i9-9900k, 64Gb RAM, RTX 3060 12Gb, Win7
-
Offline
- Posts: 7
- Joined: 09 Jan 2018, 19:52
- Location: Россия
Re: Долгий запуск Skyrim LE при использовании ENB ...
На несколько минут, как и при запуске. Не вижу тут ничего удивительного.Если игра в этом случае зависает больше чем на несколько секунд, то речь конечно не о ресете девайса. Либо работа с файлами, либо создание пунктов для редактора приводят к тормозам.
Я бы потратил и реализовал, но как знаешь. Тем более что в интернете есть уже готовые. Я пользуюсь SimpleINI.GetPrivateProfileString/WritePrivateProfileString использую. Зачем мне делать чтение файлов целиком, если на нормальном компьютере пару секунд грузится все и никаких требований к скорости не предъявляется? Просто чтоб время потерять и реализовать читалку строк? Я не велосипедист. В общем ненормально такую производительность иметь и не мод пинать надо, ибо даже с антивирусом такого не будет происходить.
Я смотрел там. Всё неплохо, но я думал у тебя есть документация полнее, разработчик всё же. Или ты не содержишь документацию?На step project или как там он называется, только с ошибками некоторые вещи.
Никто и не вкладывает. Ну по крайней мере не я. Не все параметры можно настроить во внутриигровом меню, поэтому хочется иметь удобный настройщик и вне игры. Кстати, на чём написан внутриигровой конфигуратор? Может я угадаю и это CEGUI.Хочу заметить, что мод нельзя вкладывать в состав другого софта, зачем тогда все это, не понимаю.
В любом случая я выпустил альфа версию, можешь посмотреть. Я буду искать способы решения этой проблемы. Должен быть способ это сделать монтируя всю папку целиком, а не только Data (наиболее простое решение).
-
Offline
- *blah-blah-blah maniac*
- Posts: 17427
- Joined: 27 Dec 2011, 08:53
- Location: Rather not to say
Re: Долгий запуск Skyrim LE при использовании ENB ...
Я не пишу документацию, это убивает весь энтузиазм, все равно люди ничего не понимают, очевидное для меня описание оказывается для них квантовой физикой.
Гуй это anttweakbar.
Гуй это anttweakbar.
Зачем мне это делать, если уже есть готовые функции? Велосипедизм это плохой признак. С тем же успехом надо значит и редактор гуя свой писать, а можно за это время что-то полезное сделать и в сроки вписаться. Я не могу думать о том, что на некой экзотической системе отсутствует кэширование диска на чтение и будет тормозить, это проблема юзеров, у них все тормозить будет. Не знаю, что там у вас за виртуальная папка и кэш не работает или как-то функции медленнее выполняются/вызываются. Более того, мне не раз тут репортили, что с enbseries.ini игра крашит и в этих файлах куча комментариев, в том числе на тех же строках, что и параметры, не понятно чем все это редактировалось. Учесть кривые ручки и не поиметь проблем не так уж просто в самопальной читалке конфига. Выпущу новую версию и начнут писать, что старые пресеты не работают, оно мне надо?Я бы потратил и реализовал, но как знаешь. Тем более что в интернете есть уже готовые. Я пользуюсь SimpleINI.
_________________
i9-9900k, 64Gb RAM, RTX 3060 12Gb, Win7
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
- *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
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 крайне не производительна.
Тот же SimpleIni лежит на гитхабе. Думаю если там что-то и не работало, то это уже поправили. Я бы не пожалел времени и сам переписал бы тебе всё с использованием этого или любого другого INI-парсера если бы твой мод был с открытым исходным кодом.
Как видишь чтение и запись всех этих параметров из виртуальной папки через 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
- *blah-blah-blah maniac*
- Posts: 17427
- Joined: 27 Dec 2011, 08:53
- Location: Rather not to say
Re: Долгий запуск Skyrim LE при использовании ENB ...
Блин, ну нафига, неужели так сложно просто прислушаться к моему опыту? Теперь пришлось тратить время и свой тест писать.
Запись 1000 переменных в 50 файлов 9.29 секунды. Чтение потом из них (перекомпиляция без EWRITE) за 6.45 секунд. И это на ноуте семилетней давности, win7 x64. Я не знаю, что там за виртуальные папки такие и как они делаются, но даже с реальной по вашей статистике получается в десять раз медленнее. Даже юникодовые функции не дадут таких тормозов. Если это некая специфика win10, то с этого и надо начинать (только никто еще не жаловался). Но не верю, это криво настроенная система или использование говнософта, типа антивирусов или "ускорялок игр".
Посмотрел мельком simpleini. Куча бесполезного кода, типичное современное задротство, куча бесполезного кода для усложнения, очередное доказательство, что от левака надо держаться подальше.
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);
Посмотрел мельком simpleini. Куча бесполезного кода, типичное современное задротство, куча бесполезного кода для усложнения, очередное доказательство, что от левака надо держаться подальше.
_________________
i9-9900k, 64Gb RAM, RTX 3060 12Gb, Win7
i9-9900k, 64Gb RAM, RTX 3060 12Gb, Win7