Pull to refresh

Comments 37

В ответ на коментарии «Delphi жив?» можно давать ссылку на эту статью.
p.s. Да, дочитал что компилируется через lazarus
С чего бы ему помирать-то? :) Мы игру тоже на делфи делаем и двиг на делфи пишем. пфф. предрассудки всё это.
С вероятность 146% у новостей про Delphi будет комментарий «А ей еще пользуются?\А она жива?»

Сам начинал и программировал 5 лет на ней, потом на C# перешел.
Когда D массово использовали — у людей был негатив от кода начинающих, из-за низкого порога вхождения. Например вся логика в в OnClick\GodClass-ы.

А теперь C# очень распространен и на нем такого полно.
Очередное подтверждение что не в инструменте проблемы, а в руках.
Есть три типа людей: зануды говорящие правду, и те кто преувеличивает. (про проценты)
Спасибо! Утащил к себе в игру самое простое решение с SetMaximumFrameLatency(1).

А ещё обработку ввода (опрос геймпада и всё такое) утаскивают в отдельный поток. Но пока у меня тупо опрос раз в кадр.
У меня SetMaximumFrameLatency практически не давало ощутимого результата, лучше всего через query
А ещё обработку ввода (опрос геймпада и всё такое) утаскивают в отдельный поток. Но пока у меня тупо опрос раз в кадр.
Да, это будет полезно. Но только в случае с решением на Event/Текстуре, потому как после того, как кадр нарисован, нам нужно как можно быстрее загрузить видеокарту снова, и это сэкономит время на обработку ввода. Ведь свежие данные уже подготовил отдельный поток. В остальных случаях это мало поможет, если ботлнек GPU.
Чувствую себя креветкой понять всё это, но явно нужное дело.
Отличная статья, даже возникло на миг ощущение, что DirexctX — это не так уж сложно :)
Проблема эта в дх11, или в предыдущих тоже есть и решается подобным же методом?
Это проблема во всех графических api. И да, решается подобным же методом.
Только вот SetMaximumFrameLatency доступен только начиная с IDirect3D9Ex. Тоесть в ХР работать не будет такой подход.
Я об этом написал в статье. SetMaximumFrameLatency даже не на всех Win7 заведется, а только с определенными установленными апдейтами.
Я к тому, что работать будет только на интерфейсе IDirect3D9Ex, а на обнычном IDirect3D9 уже не сработает.
А я к тому, что на ID3D10Device тоже может не сработать, потому как требует IDXGIDevice1 интерфейс, который как сказано тут:
https://msdn.microsoft.com/en-us/library/windows/desktop/ff471331(v=vs.85).aspx
This interface is not supported by DXGI 1.0, which shipped in Windows Vista and Windows Server 2008. DXGI 1.1 support is required, which is available on Windows 7, Windows Server 2008 R2, and as an update to Windows Vista with Service Pack 2 (SP2) (KB 971644) and Windows Server 2008 (KB 971512).

Ну и самой статье я писал: «и начиная с DX10.1 у нас появилась возможность задать это количество кадров через специальный метод IDXGIDevice1::SetMaximumFrameLatency.»
p.s. В комментарии выше про Win7 выше опечатался. Имел ввиду Win Vista.
IDirect3D9Ex тоже только с висты.

Спасибо огромное за исследование, кстати.
Опробовал. Результаты:
No lag reducing: 223-225 fps
SetMaximumFrameLatency: 224-226 fps
Query event: 218-220 fps
GenerateMips: 215-217 fps
P.S замеры проводились в течении минуты. В таблице выше указаны Минимум и максимум fps
Вы не правильно проводили замеры. Мы меряем не FPS. Поэтому FPS у вас практически не отличается. В статье я подробно описал в чем проблема, а так же описал, что нужно делать с программой.
Да вижу что делается. Это поможет. Кстати, если видеокарта обгоняет, то лагов не будет точно :D
Вы рассмотрели самый не интересный случай. Когда игра тормозит настолько инпут лаг уже не важен. Также у вас тут решается не проблема инпут лага, а проблема неправильного построенного цикла отрисовки.
Вы рассмотрели самый не интересный случай. Когда игра тормозит настолько инпут лаг уже не важен

Ну например, 30 FPS — это игра настолько тормозит, что инпут лаг уже не важен? А при 60 FPS задержка на рекацию пользовательского ввода в 50 миллисекунд (вместо 17) — это не проблема?
Также у вас тут решается не проблема инпут лага, а проблема неправильного построенного цикла отрисовки.
Пример не покажите, как делать правильно?
просто при нормальных фпс 30 -60 возникают другие проблемы. Тут уже нужно стараться считывать состояние контролера и задействовать его максимально близко по времени к vsync'у текущего кадра. Поскольку даже если сам процесс рендеринга нормальный и игра выдаёт 60 фпс, то вы получите при нормальной загрузке задержку 33 мс (16=1000/60мс построение кадра на CPU + 16мс рендер на GPU).

>Пример не покажите, как делать правильно?
Не понял вопроса, что делать правильно? Ваши решения для организации цикла рендеринга вполне приемлемы, но как я уже сказал выше, тут нет борьбы с инпут лагом, а идёт решение другой проблемы.
Тут уже нужно стараться считывать состояние контролера и задействовать его максимально близко по времени к vsync'у текущего кадра.
В статье именно это и делается.
Поскольку даже если сам процесс рендеринга нормальный и игра выдаёт 60 фпс, то вы получите при нормальной загрузке задержку 33 мс (16=1000/60мс построение кадра на CPU + 16мс рендер на GPU).
С самого начала статьи я рассказываю, и подробно на графиках показываю, как именно происходит рендеринг. Вы считаете совершенно не правильно. Во-первых, даже при 60FPS формирование кадра на GPU может занимать значительно меньше 16мс. Во-вторых, CPU и GPU работают параллельно. Пока CPU формирует кадр — GPU может его уже рисовать. Они работают одновременно. И по результатам GPUView это отлично видно. Нельзя просто складывать время CPU и GPU.
тут нет борьбы с инпут лагом, а идёт решение другой проблемы.
Судя по предыдущему комментарию — я полагаю, что вы не поняли статьи.
>Во-первых, даже при 60FPS формирование кадра на GPU может занимать значительно меньше 16мс.
Это не имеет значения, так как всё равно будет ожидание vsync, GPU оставшееся время будет просто отдыхать и вы не увидите кадра раньше чем 16мс после начала отрисовки.
Либо в вашем случии поскольку цикл отрисовки не привязан к vsync, у вас GPU будет молотить избыточно кадры, которых вы даже не увидите и инпут лаг будет скакать в зависимости от того, куда как по времени совпали рендер и vsync.

>Пока CPU формирует кадр — GPU может его уже рисовать.
Обычно пока CPU формирует текущий кадр, в это время GPU рисует предыдущий кадр, поэтому время складывается. Вот как раз организация параллельного рендера текущего кадра без простоев на GPU и CPU достаточно интересная задача и про неё было бы интересно почитать.
Вот как раз организация параллельного рендера текущего кадра без простоев на GPU и CPU достаточно интересная задача и про неё было бы интересно почитать.
В статье много интересных картинок из GPUView. Скажите честно, вы понимаете что на них вообще нарисовано? Если да, то покажите мне простои GPU на вот этом изображении:
Скрытый текст
image
Понимаю. На этой картинке у GPU нет простоев.

Если вы захотите сделать что-то сложнее демки с кубиками, вам нужно будет считать куллинг, филику, логику. И со своим подходом вы полюбому упрётесь в то, что проц ещё кулинг текущей группы объектов не досчитал, а GPU уже нарисовал всё что было и ждёт. Или на оборот, GPU делает долгий пост процессинг, а вы его сидите и ждёте на CPU и не начинаете считать следующий кадр.
а GPU уже нарисовал всё что было и ждёт
Тогда все замечательно. Проверка одного евента пракически никак не замедлит работу.
GPU делает долгий пост процессинг, а вы его сидите и ждёте на CPU и не начинаете считать следующий кадр.
Считать следующий кадр никто не мешает. Сначала считаем, потом ждем. Еще раз, статья про рендеринг, и про то, что критичные к вводу данные (типа положения камеры, возможно положения игроков) нужно засылать на рендеринг как можно позже. Нет никакого смысла накидывать 3 кадра на GPU, потому что спустя 3 кадра вы все так же будете ждать, но уже в Present, в довесок имея Input Lag размером в 4 кадра.
Я надеюсь вы видите, где именно Input lag на картинке выше?
На всякий случай вот скриншоты с крайзисом и uningine:
Заголовок спойлера
image
image
на которых видны те же проблемы.
А еще бывают телевизоры с «улучшайзерами» картинки, которые легко добавят задержку в 2-3 кадра и вы с этим сделать не сможете ну просто ничего.
Как разработчик игры — ничего, а как владелец телевизора — выставить определённому HDMI-входу «игровой режим», или тип устройства — ПК
то бывает, когда вас в очередной раз убивают в компьютерной игре, и вы кричите: «Ну я же нажал блок/атаку/уворот». Ну а затем джойстик летит в стену.

Это уже скорее неудачный выбор автором игры слишком жестких игровых таймингов, где нажатия на плюс-минус пары кадров влияет на исход действия. Так сказать, чересчур хардкорная механика.
Интересно, эта проблема решена в популярных движках?
В CryEngine есть флажок CV_r_minimizeLatency, который поидее делает фактически SetMaximumFrameLatency.
Кроме того их техника Coverage Buffer использует буфер глубины с предыдущего кадра, что аналогично синхронизации через текстуру с генерированием мипов. Как в остальных движках — не могу сказать.
Я бы не советовал называть статью «Input lag», поскольку такое название вводит в заблуждение. «Input» это система ввода — джойстики, мыши, клавиатуры, и т.д. Соответственно, ожидается что «Input lag» — это проблема подсистемы ввода.
Статья же о том, что существует очередь рендера кадров, и о том, что её можно уменьшить до 1 кадра вместо 3-х по умолчанию. Безусловно, когда рендер не справляется и очередь вырастает, кадры будут отображены с задержкой (в т.ч. будут задержаны кадры с реакцией пользователя). Но это Render. Это не Input.

И если соблюдать точность — это не «Lag». Тут игра смысла в английском. Lag — задержка, запаздывание, отставание (между двумя событиями) происходящая незапланированно. Проблема обозначенная в статье называется Frame Latency, что отражено в соотв. названии функции. Казалось бы, пустая придирка? Но разница будет понятна когда вы попытаетесь искать…
Я бы не советовал называть статью «Input lag», поскольку такое название вводит в заблуждение. «Input» это система ввода — джойстики, мыши, клавиатуры, и т.д. Соответственно, ожидается что «Input lag» — это проблема подсистемы ввода.
Я с радостью пофилософствую с вами на эту тему, но сразу после того, как вы исправите статью на вики: en.wikipedia.org/wiki/Input_lag
Идет?
Еще, Frame Latency зависит таких параметров как полноэкранное приложение или нет (отключен ли DWM), включен ли в оконном режиме Aero на 7-ке, от флип-модели, VSync, и будет полезна IDXGISwapChain::GetFrameStatistics.
Sign up to leave a comment.

Articles