Автор Тема: Будет ли в вайсе нормальный FPS  (Прочитано 1081 раз)

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 556
  • Репутация: +77/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Смотрю, на форуме до сих пор нет нормальной темы про FPS.
Вот что получается - если играть на 300-400 fps, появляются всем известные корявости, не привязанные разработчиками к fps, такие как плохая физика авто, не успевающие вылетать и развеиваться партиклы и т.д. При этом картинка очень плавная. Казалось бы нужно просто ограничить fps в опциях, но не тут-то было. Возникает обратный эффект, картинка даже на топовых компах временами начинает идти рывками на модах с тяжелыми моделями. Не знаю в чем причина, в полигонах или текстурах 2048x2048, хотя без ограничителя все летало, значит ресурсов хватает. Есть моды, которые увеличивают ограничитель кадров до 60, типа framelimiter (ставит новый fps в адреса 0x602D68 и 0x9B48EC) или framelimitadjuster_vc и подобные, 30/60/120 fps - никакой разницы, ограничитель увеличивается, но рывки остаются.

Я так подозреваю, что проблема в том, что игре на тяжелых моментах нужно просесть ниже 30/60 fps, а ограничитель не дает ни выше, ни ниже. Без ограничителя я наблюдал проседание с 300 до 20 fps, возможно за счет этого сохранялась плавность. Мне кажется нужен другой подход - ограничить fps только сверху, но не снизу. Вот с этим хотелось бы разобраться, может я не прав.

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 599
  • Репутация: +20/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Будет ли в вайсе нормальный FPS
« Ответ #1 : Июнь 06, 2017, 05:00:42 am »
Я тоже никогда не понимал, откуда эти тормоза при 30 fps. Меня не напрягает играть при таком фреймрейте в Вайс(привычка уже), но действительно - откуда тормоза там, где при снятом ограничителе кадров их нет?
К сожалению, мыслей по решению этой проблемы у меня нет  :-X

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 556
  • Репутация: +77/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Будет ли в вайсе нормальный FPS
« Ответ #2 : Июнь 06, 2017, 08:54:00 am »
Надо видимо найти место, где происходит удержание fps в фиксированном значении и посмотреть, что там происходит.

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 556
  • Репутация: +77/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Будет ли в вайсе нормальный FPS
« Ответ #3 : Август 02, 2017, 06:47:38 pm »
Методом исключения обнаружил, что на тормоза при включенном ограничителе кадров влияет графический мод ViceMips_byDK.asi. Понятно, что мало кто такое сочетание тестировал на своих картах. Значит дело в обработке больших текстур во время отображения, хотя 2048х2048 как у меня я бы не назвал уже большой, возможно еще усугубляет многополигональность моделей. При выключенном ограничителе игра все молотит на ура, комп у меня нехилый, брал полгода назад специально под игры, что-то где-то значит не успевает переколбасить за 30/60 кадров. Может DK пояснит. Без этого мода я уже не представляю дальнейшую работу над картой, только на нем все и держится, но и с этой бедой надо что-то делать.

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 599
  • Репутация: +20/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Будет ли в вайсе нормальный FPS
« Ответ #4 : Август 13, 2017, 01:30:01 am »
Ну, и без ViceMips_byDK.asi игра значительно медленнее подгружает модели, так что тут дело не конкретно в этом плагине, а в каких-то странных особенностях стримминга.
Понятия не имею, где копать, поэтому просто апну тему...

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 599
  • Репутация: +20/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Будет ли в вайсе нормальный FPS
« Ответ #5 : Февраль 23, 2019, 09:39:35 pm »
SilentPatch устраняет проблему лагов при ограничителе кадров:
Цитировать
* More precise frame limiter, reducing lag spikes a bit when playing with Frame Limiter on

Проблема лишь в том, что патч не настраиваемый, а поскольку в нем куча других функций - это может стать проблемой.


А, ну да - и сурсов вроде как нет.
Если у кого будут идеи, что это за прикол такой с этим лагом был - просьба поделиться инфой  ::)
« Последнее редактирование: Февраль 23, 2019, 11:03:22 pm от Shagg_E »

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 556
  • Репутация: +77/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Будет ли в вайсе нормальный FPS
« Ответ #6 : Февраль 26, 2019, 11:50:16 am »
Если исходить из перевода "Более точный ограничитель кадров, немного снижающий задержки при воспроизведении с включенным ограничителем кадров", то выходит, что он немного устраняет рывки, о которых шла речь в начале темы. Протестировать на своей карте я не смог, проблемы с совместимостью плагина. На стандартной игре ничего незаметно, фпс 30. Методом тыка я подобрал для себя фпс в районе 80. Так и рывков незаметно, и физика еще не слишком страдает. Но хотелось бы конечно плавность, как с отключенным фпс.

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 599
  • Репутация: +20/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Будет ли в вайсе нормальный FPS
« Ответ #7 : Февраль 26, 2019, 11:18:10 pm »
Я уже написал Silent-у по этому поводу и объяснил, почему не все могут юзать его плагин: он вроде согласился объяснить, как это сделать, когда будет время.
Пока он написал вкратце:
Цитировать
Also, iirc that specific change modified the way they count time for framelimiter by removing as many calculations as possible
so now I am counting it in QPC time directly, instead of recalculating to miliseconds

Посмотрим, что он напишет, когда будет время.
Явно заметить этот эффект на чистом Вайсе вряд ли удастся - нужно поставить несколько хайполи моделей авто и уже потом пробовать моим или другим(но в моем это точно видно) спавнером быстренько прокручивать список авто: в моем спавнере - просто зажать 9 или 0 после активации(C+0 - активация; 9 и 0 - вперед/назад; shift, fire - спавн; enter, space - отмена). При "прокрутке списка", на вариантах хайполи машин будут происходить лаги(фризы) при включенном ограничителе кадров. Но заметными лаги будут лишь при первой прокрутке(мб это из-за особенностей работы оперативной памяти).
Ну и прикол в том, что, если отключить ограничитель, то эффект "медленного  компа" пропадет, и все машины в списке будут прокручиваться почти одинаково быстро.
С SilentPatch равномерно прокручиваются авто и при включенном ограничителе кадров.
« Последнее редактирование: Март 01, 2019, 01:07:26 pm от Shagg_E »

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 556
  • Репутация: +77/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Будет ли в вайсе нормальный FPS
« Ответ #8 : Февраль 27, 2019, 09:33:38 am »
Было бы замечательно сделать отдельным плагином или посмотреть исходники. Тогда можно было бы вернуть ограничитель до уровня, не влияющего на физику, и избавиться от этих дерганий.

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 599
  • Репутация: +20/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Будет ли в вайсе нормальный FPS
« Ответ #9 : Март 01, 2019, 02:56:09 am »
Короче, не - это было не то.

Проблема была в функции стримминга(0x4086F0) по адресу 0x40872F + 6, где задавался флаг FILE_FLAG_NO_BUFFERING (0x20000000), который, в свою очередь, что-то меняет в подходе чтения img архива и вроде позволяет экономить оперативку(не уверен, так ли это работает, но не суть). Суть в том, что это уже лет 15 как неактуально: производительность компов далеко шагнула вперед.
Короче, нужно поменять на флаг FILE_FLAG_OVERLAPPED (0x40000000), и всё отныне будет круто:
Код: C++
  1. patch::SetInt(0x40872F + 6, FILE_FLAG_OVERLAPPED);
Это код для SDK, но я думаю, смысл понятен(просто заменить значение по адресу 0x40872F + 6 на 0x40000000).

Итого - вся эта проблема решается одной строчкой, лол.

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



P.S. Silent разрешил распространение  ;)


P.P.S. xanser, отпишись, сработало ли это в твоем случае. Еще мне интересно, работает ли у тебя эта версия SilentPatch(кидать сразу в папку игры).
Дело в том, что, в отличии от обычной версии, в этой есть только самое необходимое:
Цитировать
*    If the settings file is absent, the game will now default to your desktop resolution instead of 640x480x16
*    DirectPlay dependency has been removed - this should improve compatibility with Windows 8 and newer
*    The game will not crash on startup if Data Execution Prevention is enabled for all applications anymore
*    "Cannot find enough available video memory" error showing on some computers has been removed
*    Path to the User Files directory is now obtained differently, hopefully increasing compatibility and future-proofing the games more
*    FILE_FLAG_NO_BUFFERING flag has been removed from IMG reading functions - speeding up streaming
*    All censorships from German and French versions of the game have been removed
*    Fixed an issue which would cause games to freeze if III/VC/SA were running at the same time

Мне интересно, сработает ли это у тебя, т.к. у меня давно были подозрения, что, рано или поздно, то большое кол-во функций, что представлено в обычной версии, может привести к несовместимости, а ты первый, чья игра настолько изменена, что уже стала реально несовместима с тем патчем.
В этой же DDraw версии, насколько я понимаю, нет ничего лишнего - все изменения только на пользу любому проекту, как мне кажется.
Если у тебя с ней всё будет в порядке - я возьму её себе в проект, который пока в зачаточном состоянии. Если нет - буду изначально планировать без этого патча.
« Последнее редактирование: Март 01, 2019, 12:00:58 pm от Shagg_E »

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 556
  • Репутация: +77/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Будет ли в вайсе нормальный FPS
« Ответ #10 : Март 01, 2019, 12:41:38 pm »
Не могу понять разницу с патчем и без, как будто никакого эффекта. Пробовал сам добавлять строчку и твой AnotherUnlimiter.asi, все одинаково. На 30 кадрах картинка зернистая, на 60 самая плавная, судя по анимации пешеходов, при 80-90 как-то уже по-другому ощущение, то ли теряется плавность, как будто надо соблюдать кратность 30/60/120. Но при 60 есть еще какое-то подсознательное ощущение периодических микро-спотыканий. Все тесты показали одинаковый результат, патч у меня не ощущается. Оставил пока просто 60.
По поводу ddraw версии не могу проверить, у меня ddraw.dll это загрузчик FastAsiLoader, без которого моя игра уже не запустится. Попробовал переименовать твой ddraw и положить в папку plugins, игра пошла, но не уверен, что патч сработал в таком виде.
Все тесты я проводил в оконном режиме, возможно результат отличается.

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 599
  • Репутация: +20/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Будет ли в вайсе нормальный FPS
« Ответ #11 : Март 01, 2019, 12:58:36 pm »
Эта строчка не меняет абсолютно ничего кроме скорости загрузки моделей при включенном ограничителе кадров. Также бонусом полоса загрузки будет более плавно идти.
Т.е. разница будет заметна только если раньше были заметны микрофризы при загрузке во время игры(перед спавном, например) "тяжелых" моделей или текстур. У меня на версии US 1.0 при 30 фпс были фризы(то, что я описал парой сообщений выше о тесте со спавнером машин), когда поставил этот патч в одну строку - фризы исчезли.


Касаемо "зернистости" и прочих вещей - попробуй это:
Код: C++
  1. #include "stdafx.h"
  2.  
  3. template<typename AT>
  4. inline AT DynBaseAddress(AT address)
  5. {
  6.         return (ptrdiff_t)GetModuleHandle(nullptr) - 0x400000 + address;
  7. }
  8.  
  9. template<typename Func, typename AT>
  10. inline void             ReadCall(AT address, Func& func)
  11. {
  12.         union member_cast
  13.         {
  14.                 intptr_t addr;
  15.                 Func funcPtr;
  16.         } cast;
  17.         static_assert(sizeof(cast.addr) == sizeof(cast.funcPtr), "member_cast failure!");
  18.  
  19.         cast.addr = (intptr_t)address + 5 + *(int*)((intptr_t)address + 1);
  20.         func = cast.funcPtr;
  21. }
  22.  
  23. template<typename AT, typename Func>
  24. inline void             MemoryInjectHook(AT address, Func hook)
  25. {
  26.         union member_cast
  27.         {
  28.                 intptr_t addr;
  29.                 Func funcPtr;
  30.         } cast;
  31.         static_assert(sizeof(cast.addr) == sizeof(cast.funcPtr), "member_cast failure!");
  32.         cast.funcPtr = hook;
  33.  
  34.         *(int*)((intptr_t)address + 1) = static_cast<int>(cast.addr - (intptr_t)address - 5);
  35. }
  36.  
  37. static LARGE_INTEGER    FrameTime;
  38.  
  39. __declspec(safebuffers)int GetTimeSinceLastFrame()
  40. {
  41.         LARGE_INTEGER    curTime;
  42.         QueryPerformanceCounter(&curTime);
  43.         return int(curTime.QuadPart - FrameTime.QuadPart);
  44. }
  45.  
  46. static int(*RsEventHandler)(int, void*);
  47.  
  48. int NewFrameRender(int nEvent, void* pParam)
  49. {
  50.         QueryPerformanceCounter(&FrameTime);
  51.         return RsEventHandler(nEvent, pParam);
  52. }
  53.  
  54. class TestFrameShit
  55. {
  56.  
  57. public:
  58.        
  59.         TestFrameShit()
  60.         {
  61.                 ReadCall(0x6004A2, RsEventHandler);
  62.                 MemoryInjectHook(0x6004A2, NewFrameRender);
  63.                 MemoryInjectHook(0x600449, GetTimeSinceLastFrame);
  64.     }
  65. } lol;
  66.  
Это тот код, который я изначально просил у Silent-а, и опробовав который я не заметил решения своей проблемы. Но тебе мб поможет.
Также добавил в аттач.
Возможно, если скомбинировать эти два патча - у тебя решатся вообще все проблемы.
Также попробуй Ultimate Asi Loader(кидать в папку игры, а asi кидать в папку scripts), мб в этом дело.

P.S. Вообще, я не сторонник 60 fps в Вайсе, т.к., по-ходу, на стандартном ограничителе кадров там повязано столько всего, что касаться всего этого мне не охота.
Меня бесили именно микрофризы при загрузке чего-либо. Микрофризы, которые не должны возникать на современных системах.
И та строчка кода эту проблему решает.
« Последнее редактирование: Март 01, 2019, 01:20:44 pm от Shagg_E »

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 556
  • Репутация: +77/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Будет ли в вайсе нормальный FPS
« Ответ #12 : Март 01, 2019, 06:21:05 pm »
Оставил оба твоих asi, но скорее оставлю первый из одной строчки. Возможно я просто ожидаю, что должно стать лучше, и мне так начинает казаться, буду присматриваться. Про полосу загрузки - не только плавнее, но и быстрее стало, только не с первого раза, как будто используется какой-то кэш. Если это влияет только в лучшую сторону, можно и оставить.
Ограничитель в 30 для меня все-таки уже не вариант, я слишком замечаю "вырезанные" кадры, привык наверное к большему, 60 как мне кажется еще не настолько портит физику, чтобы от него отказываться. К тому же это оказалось каким-то магическим числом, при котором идеальная плавность персонажей и поворот камеры, сравнимые с отключенным фпс-ом, как мне показалось. Не знаю, может потому что совпадает с частотой обновления экрана монитора.
Еще заметил, что чем выше фпс, тем быстрее загружаются модели. У меня есть магазин игрушек, так вот при 60 и ниже полки еще пустые при входе, и видно заполнение, а при 80 уже успевают заполниться до входа.

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 599
  • Репутация: +20/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Будет ли в вайсе нормальный FPS
« Ответ #13 : Март 02, 2019, 05:20:32 am »
Цитировать
при 60 и ниже полки еще пустые при входе, и видно заполнение, а при 80 уже успевают заполниться до входа.
Вроде на это лимит streaming memory влияет?
Еще можно юзать принудительную быструю загрузку в моменты, когда это необходимо(при входе в магазин, например):
03CB: load_scene $X $Y $Z

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 599
  • Репутация: +20/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Будет ли в вайсе нормальный FPS
« Ответ #14 : Март 03, 2019, 04:30:07 am »
В общем, меня немного напрягли слова
Цитировать
как будто используется какой-то кэш
и я подумал, что всё дело в том, что всё-таки я так или иначе недавно включал гта и её ресурсы так или иначе сохранились в ожидаемой(Standby) части оперативной памяти.

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

Короче, я до сих пор не до конца понимаю как, но этот флаг FILE_FLAG_OVERLAPPED реально каким-то образом "чинит" стримминг, позволяя подгружать модели и текстуры независимо от фпс!
« Последнее редактирование: Март 03, 2019, 04:39:38 am от Shagg_E »