Pull to refresh

Comments 29

Ждем выхода новых казаков, осталось совсем немного. )
Судя по сообщениям на форуме не всё так оптимистично с датой релиза.
Ну я всё еще оптимистично настроен )
Ну нельзя же так, что за всеми любимая татарская программа?)
IDA Pro, основным разработчиком которой является на данный момент широко известный в узких кругах татарин — Ильфак Гильфанов.
Проще было заNOPать всю loc_4D1A9C и оставить логику как есть, чтобы не мучиться со смещениями :)
За статью — плюсик, всегда интересно подобное читать.
Спасибо. Да, было бы проще, но тогда всё равно будет выполнена loc_4D1AAA вместе с вызовом ProcessMessages, который приводит к багам во время сетевой игры.
Конечно же loc_4D1AAA нужно занопать. Имел в виду ее, а написал другое.
Еще поясните вот этот момент:
Корень проблемы кроется в использовании функций QueryPerformanceFrequency и QueryPerformanceCounter, на которых основывается тайминг игры. Эти функции вызываются один раз при создании новой игры, задавая тон для всех последующих вычислений с GetTickCount.

Насколько я знаю, QueryPerformanceFrequency должна запускать единожды, при инициализации приложения, а QueryPerformanceCounter — в каждой итерации игрового цикла. Как это они связаны с GetTickCount?
К сожалению, я не имею опыта в разработке игр и не в курсе всех деталей тайминга игрового цикла. Однако про QueryPerformanceFrequency на одном форуме (нем.) писали, что на современных процессорах возвращаемое им значение может быть меньше настоящей частоты.

Я ставил брейк на вызов QPF и пытался как-то манипулировать значения, но там всё проходит через указатели и методом тыка я там уже не смог ничего решить)

Xref по QPC показывает только два вызова — один находится рядом с QPF и проходится единожды при открытии новой игры. На счёт второго я не углублялся, возможно он в игровом цикле.

При этом xref по GetTickCount выдаёт целую простыню вызовов и многие из них в игровом цикле. Как именно это всё взаимодействует мне тоже интересно узнать…
Спасибо за ссылку. Однако все примеры таймеров, приведённые в указанной статье используют только GetTickCount. О взаимодействии с QPF и QPC там не упоминается. Интересно, этот метод вообще ещё используется или он уже «вышел из моды»?

Согласно документации Microsoft частота, возвращаемая QPF определяется при старте операционной системы и больше не меняется. Но в этом обсуждении упоминаются возможные ошибки имплементации QPF на некоторых ситемах и даётся такой совет:
Как правило, timeGetTime лучше всего подходит для тайминга игр — у GetTickCount недостаточно высокое разрешение, а от QPC и RDTSC одни неприятности.
Было бы интересно услышать мнение опытного разработчика игр по этому вопросу.
Есть догадка — что на процессорах с изменяющейся частотой(Turbo boost) и получается данный эффект, т.к. QPF возвращает «пониженную» частоту, а потом при нагрузке она возрастает и скорость плывет.
Это не так — QPF всегда возращает фиксированную частоту, не зависящую от частоты процессора. См. мой ответ ниже — по последней ссылке как раз проверялось что QPF не зависит от частоты процессора.
Недавно копался в игре Deadly Premonition, так там в качестве таймера используется как раз QueryPerformanceCounter. Игра была портирована на ПК не так давно: в 2013 году, так что такой подход тоже имеет право на жизнь. Проблем со скоростью нет, по крайней мере жалоб не встречал.
зачем ставить бряки, когда можно подсунуть свои QPF/QPC через хуки?
Не оказался бы от интересных ссылок по теме
QueryPerfomanceFrequency возвращает не частоту процессора, а частоту таймера который сама ОС выбрала при загрузке (таймеров в архитектуре PC довольно много). Таким образом частота действительно остаётся фиксированной в течении работы ОС, а результат QueryPerfomanceQuery монотонно увеличивающимся.

Вот немного ссылок на эту тему:
habrahabr.ru/company/intel/blog/260113 — рассказывается о таймерах на PC
www.gamedev.ru/code/forum/?id=39166#m4 — очень старая тема, но мне кажется довольно понятно объясняет как работают обе функции
www.gamedev.ru/code/forum/?id=142497&page=2#m16 — тоже старая тема, там я выкладывал тестовый код который доказывает что QFP и QFC не зависят от частоты процессора
Научите как играть по сети на современных системах, как создать, чтобы тебя увидели, а потом не было разрывов? Кроме скорости, помню были проблемы, что тупо всё дёргалось, и не было плавности.
Сергей Григорович в одной беседе мне рассказывал как они лазили в Windows Kernel, чтобы дбится перформанса… а тут такие речи — как замедлить! (куда мир катится?)
Я думал настоящими мужики до сих пор используют hiew для патчинга, тем более там встроенный дизассемблер есть.
А я не привередливый — что под рукой было, тем и патчил)
Странно, что интерес к игре не пропал после всех приключений.
«Зачем врач-гинеколог женится?»
Женившийся гинеколог? Он, соответственно, мужчина.
(Не думал, что это настолько обсуждаемая тема — 492 тыс. ответов).
Автор статьи, Эреб, решил поистине важную задачу и помог нашему сообществу преодолеть проблему со скоростью в игре, которая вела себя неадекватно на современном железе. Благодаря патчу, который он сделал лично для меня, после переписки в ЛС, для последней версии казаков 1,35, выложенных на стиме, мне стало гораздо комфортнее играть!

Была создана тема на форуме лиги казаков — http://forum.newlcn.com/viewtopic.php?p=444915#444915

Еще раз, спасибо, Эреб.
Пожалуйста, Владимир. Приятно видеть, что результат работы интересен и полезен сообществу.
Люди, а как решить проблему "высасывания" дерева или камня построенными частоколом и стеной?
Sign up to leave a comment.

Articles