MrShoor
> Из-за этого говна приходится крутить сраный XInputGetState в отдельном потоке с высокой частотой опроса,
В нормальном движке этот поток уже есть - это поток обработки игровой логики, ничего лишнего городить не нужно даже 30 опросов в секунду достаточно, а 60 - за глаза, потому что все консоли всегда так и делали начиная с Dendy/NES.
=A=L=X=
> В нормальном движке этот поток уже есть - это поток обработки игровой логики
Этот поток игровой логики работает на низкой частоте.
> даже 30 опросов в секунду достаточно
Нет. 30 как раз недостаточно. Часть инпута в динамичных ситуациях начинает теряться. Даже при 60 очень редко но инпут теряется. Для себя я сделал вывод, что нужно как минимум раз в 8мс обрабатывать инпут
MrShoor
> Даже при 60 очень редко но инпут теряется.
Фишка в том, что XInput сделан именно таким именно поэтому - консоли прошлого просто не опрашивали геймпады чаще VSync, у них game loop тупо завязан на VSync (что отчасти отражено и в планкам качества предьявляемым к фпс и иногда выливаются в такие странности когда в Dark Souls на ПК мечи тратились в два раза быстрее на 120 Гц мониторах) и всем всегда хватало. Поколения геймеров выросли без более частых опросов геймпадов и никогда и не думали жаловаться.
Поэтому это фантомные пропадания инпута, они никому неинтересны. Игрок просто считает, что не продавил кнопку и набивает комбу слишком быстро, что так же губительно может быть как и слишком медленно.
MrShoor
Там, кстати, еще есть поле packetNumber - номер пакета пришедшего от геймпада с информацией по состоянию геймпада и если оно совпадает с предыдущим, то гарантированно, что состояние геймпада не изменилось. То есть скорее всего само железо опрашивает геймпады с какой то частотой и чаще этой частоты просто и смысла нет опрашивать - если у тебя тот код еще в эксплуатации находится может из любопытства вывести "фпс" опроса геймпадов ориентируясь на это значение.
=A=L=X=
> Поколения геймеров выросли без более частых опросов геймпадов и никогда и не думали жаловаться.
То, что конкретно ты не жалуешься - не значит что проблемы нет. Я например замечаю когда теряется инпут, это раздражает. А когда инпут теряется при просадках FPS - это десятикратно бесит
> Поэтому это фантомные пропадания инпута, они никому неинтересны.
Поэтому это фантомные пропадания инпута, они мне неинтересны.
fixed
На консолях если что так же можно в треде опрашивать инпут с более высокой частотой. Так что тем, кто хочет регистрировать все нажатия - приходится корячится с отдельным тредом
=A=L=X=
> если у тебя тот код еще в эксплуатации находится может из любопытства вывести "фпс" опроса геймпадов ориентируясь на это значение.
Код есть, котроллера под рукой нет
MrShoor
Ну решил проверить код мэтра win_input.cpp из DOOM 3 BFG и таки да - опрос геймпадов выделен в отдельный поток с частотой 250 раз в секунду.
Забавно, что и мышь и клавиатуру Кармак опрашивает через DInput, видимо легаси решил не переписывать, причём там видны куски кода где он пытался побороть какую то проблему с клавиатурой на одной системе через полный опрос вместо поллинга эвентов, но это не принесло плодов, код закоммечен. Плюс видно что когда то опрос геймпадов был в каждом кадре (в семействе функции содержащих PollEvents которые вызываются каждый кадр), но на низких фпс это реально стрёмно, а это всё-таки DOOM и на ПК.
MrShoor
а флажка для буферизированного опроса там нет?
У себя использую DI для игровых моментов и ловлю WM_CHAR для обработки ввода текста на винде.
MrShoor
> И как после этого не называть OGL убогим апи?
Это всё верно, вот только ОП не про это, его жалоба — это "ой как много функций вызовов и параметров, почему они просто не сделали одну команду 'сделай збс' которая сама всё сделает как надо збс".
MrShoor
А чо, с сырым инпутом заморачиваться не стал?
nes
> с сырым инпутом
Блинчики с сыром и инпутом
Имбирная Ведьмочка
> его жалоба — это "ой как много функций вызовов и параметров, почему они просто не сделали одну команду 'сделай збс' которая сама всё сделает как надо
Я уже даже показал, что сами MS отошли от того идиотизма который был в DirectInput и для XInput сделали восемь простых функций без идиотских заполнений структур через dwSize.
Уже и до них дошло, что не надо делать сверхсложный код там где это не нужно.
Я же давным давно, еще на версии 1.x открыл для себя SDL и позабыл DirectX API как страшный сон. Чего всем рекомендую. Все мои последующие проектики базированы на SDL.
Красивое, чистое API без заморочек и ненужных перекладываний структур в параметры.
=A=L=X=
> Я уже даже показал, что сами MS отошли от того идиотизма который был в DirectInput и для XInput сделали восемь простых функций без идиотских заполнений структур через dwSize.
Заполнение двСайз — это форвард совместимость. Ты таким образом сообщаешь системе, на какую версию хидера рассчитана твоя программа. Если мс захочет добавить новые параметры в структуру — они просто возьмут и добавят, а в реализации затем сделают свитч по двСайз — старые программы продолжат ставить старый и будут работать по-старому, новые заполнят по-новому и получат доступ к новым полям.
Ты вроде как даже сам это всё тут объяснял, неужели уже даже свой собственный материал пропил?
Имбирная Ведьмочка
> Заполнение двСайз — это форвард совместимость.
И она пригодилась где то? DirectX уже десяток версий вышел с полностью перепаханными интерфейсами - нигде эти dwSize не пригодились, а код они уродуют ужасно.
ХИнпут не работает для всех контроллеров, кстати, так что даже если он и был бы концептуально красивый — это ламборджини в деревне. Покатал по главной дороге туда-сюда для души — и затем обратно на трактор, грязь колёсами месить.