doom2d.org

Главная база плоских морпехов
It is currently 21 Mar 2025, 04:11

All times are UTC + 3 hours




Post new topic Reply to topic  [ 13 posts ] 
Author Message
PostPosted: 28 Feb 2023, 21:38 
Offline
Site Admin
User avatar

Joined: 17 Oct 2009, 23:43
Posts: 7835
Location: \\HULK
Не секрет, что при r_interp=1 управление становится несколько ватным.
Было бы очень здорово это пофиксить.

У ЧД есть пара мыслей:

Dmitry D. Chernov» управление это проблема не интерполяции, а того, что оно привязано к UPS. все нормальные игры считают свою логику примерно вполовину реже, чем собираются выдавать fps, так что тут всё правильно, иначе бы тупо проца не хватало

Dmitry D. Chernov» ещё мб там косяк в том, что интерполяция считается от предыдущего кадра, а не от текущих скоростей объектов. тогда да, теряем тик на этом и получаем вату

Jabberwock» а вот это можно пофиксить?

Dmitry D. Chernov» можно и нужно. создай багрепорт на форуме, опиши вату и сошлись на обе мои идеи (либо криво интерполируем, либо управление, либо и то, и другое)

_________________
И неважно, что нет морей на Марсе, каждый морпех носит море в сердце.


Top
 Profile  
 
PostPosted: 01 Mar 2023, 02:28 
Offline
Приколист
User avatar

Joined: 04 Feb 2010, 14:42
Posts: 988
Location: Equestria
это не баг. в общем случае это не решаемо без машины времени.
без пропуска тика любые решения будут всего лишь костылём, пытающимся предсказать будущее вперёд на 27.7 мс. и эти костыли без забавных эффектов не обойдутся.
уверен что даже полный просчет промежуточных тиков не обойдется без эффектов и/или кучи особых случаев.


Top
 Profile  
 
PostPosted: 01 Mar 2023, 09:53 
Offline
Site Admin
User avatar

Joined: 17 Oct 2009, 23:43
Posts: 7835
Location: \\HULK
Оффтоп:

Image



Top
 Profile  
 
PostPosted: 01 Mar 2023, 12:47 
Offline
Принципиально неуничтожаем
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 7205
Location: Владивосток
DeaDDooMER» без пропуска тика любые решения будут всего лишь костылём, пытающимся предсказать будущее вперёд на 27.7 мс.
Почему же? Нам ведь известны текущие скорости всех объектов в промежутке между тиками.
Как только наступит следующий тик, координаты объектов будут увеличены на свою скорость, после чего уже она будет пересчитана.
Значит, в промежутке можно спокойно считать LERP( coord, coord+speed, (next_tick - NOW()) / tick_delta ) для X и Y. Или я что-то упускаю?

DeaDDooMER» и эти костыли без забавных эффектов не обойдутся.
Например? У нас же нет больше никаких факторов, кроме скорости, да и не может их быть, по идее.

DeaDDooMER» уверен что даже полный просчет промежуточных тиков не обойдется без эффектов и/или кучи особых случаев.
Так нам надо считать не промежуточные тики, а промежуточные кадры. Тиков должно быть 36 в секунду и точка, здесь у нас как раз всё нормально.
Я умудрялся делать такое даже в GameMaker 8.1, хотя тики там жёстко привязаны к кадрам.
Вот ссылка (может потребоваться VPN): https://www.ganggarrison.com/forums/index.php?topic=38250.0

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
PostPosted: 01 Mar 2023, 15:47 
Offline
Приколист
User avatar

Joined: 04 Feb 2010, 14:42
Posts: 988
Location: Equestria
Черный Думер wrote:
Или я что-то упускаю?
Упускаешь. Должен быть не speed, а speed_from_next_tick. Скорость сохраненная в объекте уже устаревшая на момент рендеринга. А скорость для следующего тика в общем случае не предсказуема, так как зависит от сайд эффектов в виде мясных пальцев человека.


Top
 Profile  
 
PostPosted: 12 Mar 2023, 00:16 
Offline
Принципиально неуничтожаем
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 7205
Location: Владивосток
DeaDDooMER» А скорость для следующего тика в общем случае не предсказуема, так как зависит от сайд эффектов в виде мясных пальцев человека.
А её и не надо предсказывать в общем случае. У тебя само получится так, что если предсказание разошлось с реальностью (т.е. если мы наинтерполировали игрока не в ту сторону, потому что в следующем тике человек палец на противоположную кнопку перекинул), то до следующего тика мы будем интерполировать к новому предсказанию уже не от текущих координат игрока, а от разошедшегося предыдущего предсказания. Плавность никуда не исчезнет (даже рывка не будет), а вот лаг пропадёт.

То есть здесь получается надежда на обоснованное предположение, что чаще мы всё-таки предсказываем то, что нужно. Потому что вырожденных случаев только два: смена управления в момент между тиками и телепортация игрока. Второй можно обрабатывать явно.

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
PostPosted: 12 Mar 2023, 00:41 
Offline
Приколист
User avatar

Joined: 04 Feb 2010, 14:42
Posts: 988
Location: Equestria
Картинка на больших скоростях будет сильно расходиться с реальностью
Меняешь шило на мыло


Top
 Profile  
 
PostPosted: 12 Mar 2023, 00:49 
Offline
Принципиально неуничтожаем
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 7205
Location: Владивосток
DeaDDooMER» Картинка на больших скоростях будет сильно расходиться с реальностью
Можно впилить ограничение по скорости. Если слишком большая, то пусть с рывками летает. Но это ещё посмотреть бы, как оно в действительности расходиться будет.

DeaDDooMER» Меняешь шило на мыло
Не могу согласиться. Все эти проблемы в той или иной степени решаемы, в отличие от чудовищно раздражающего лагающего ввода.

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
PostPosted: 12 Mar 2023, 14:00 
Offline
Приколист
User avatar

Joined: 04 Feb 2010, 14:42
Posts: 988
Location: Equestria
Занимайся. Только не ломай как есть сейчас (т.е. отдельным режимом). УМВР и ничего не лагает.


Top
 Profile  
 
PostPosted: 12 Mar 2023, 18:42 
Offline
Принципиально неуничтожаем
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 7205
Location: Владивосток
DeaDDooMER» Занимайся.
Хорошо, но это уже скорее после вливания renders_updated в master, уж слишком много всего у тебя там поменялось.

DeaDDooMER» Только не ломай как есть сейчас (т.е. отдельным режимом).
Да, постараюсь сделать как r_interp 2. Если по отзывчивости окажется лучше, чем нынешний вариант, то просто поменяем их местами.

DeaDDooMER» УМВР и ничего не лагает.
Это вопрос восприимчивости. Скажем, я в упор не замечал присущий GameMaker лаг ввода всё то время, что играл в сделанные на нём игры, но как только попробовал gm8x_fix, то без него уже больше совсем не могу. А суть лага там была похожая: кадр рендерился, но на экран выводился только в начале следующего тика.

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
PostPosted: 07 Feb 2025, 09:16 
Offline
Принципиально неуничтожаем
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 7205
Location: Владивосток
Подумалось ещё вот что, хотя это более общие соображения по точности ввода как таковой:

1. Ввод всегда надо брать непосредственно по месту обработки, а не запоминать его где-то в начале тика и уже потом оттуда доставать. Потому что между моментом считывания ввода и моментом его обработки игрок может успеть сделать новое нажатие, которое в таком случае придётся уже на следующий тик.

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

Частично связано с вот этим: viewtopic.php?f=36&t=3437. Но там поправить куда проще.

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
PostPosted: 08 Feb 2025, 16:29 
Offline
Приколист
User avatar

Joined: 04 Feb 2010, 14:42
Posts: 988
Location: Equestria
Чёрный Думер wrote:
2. Все клавиши, нажатые до тика, надо запоминать. То есть если игрок успел нажать и отжать клавишу, то её всё равно необходимо учесть при наступлении тика - потому что игрок уже самим фактом нажатия выразил своё намерение. После тика же надо сбрасывать всё запомненное и дальше по-новой.
1. Забинденные команды по нажатию кнопок выполняются всегда, в порядке нажатия кнопок(ну или как бэкэнд выдаст). Для большенства команд проблемы уже нет.
2. Для команд-действий игрока (+left/-left и ко) достаточно будет сделать дополнительным флажком "было нажато в этом тике" и использовать его внутрях игры вместо текущего "кнопка зажата". Очередь не нужна.
3. Использование InputBuffer и функций ввода из e_input вообще надо в повыкидывать, а не расширять использование, так как это приводит к захардкоженным кнопкам.
Чёрный Думер wrote:
1. Ввод всегда надо брать непосредственно по месту обработки (if e_input_checkThisKeyRightNow(SOME_KEY) then), а не запоминать его где-то в начале тика и уже потом оттуда доставать (if e_input_pressedKeys[SOME_KEY] then). Потому что между моментом считывания ввода и моментом его обработки игрок может успеть сделать новое нажатие, которое в таком случае придётся уже на следующий тик.
Плохая идея. Сейчас кнопка нажата, а через строчку уже не нажата, а ещё через строчку снова нажата. Бред и прямой путь к невоспроизводимым багам.
Весь инпут должен собираться в начале тика и оставаться одинаковым в течении тика.


Top
 Profile  
 
PostPosted: 09 Feb 2025, 07:43 
Offline
Принципиально неуничтожаем
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 7205
Location: Владивосток
DeaDDooMER wrote:
3. Использование InputBuffer и функций ввода из e_input вообще надо в повыкидывать, а не расширять использование, так как это приводит к захардкоженным кнопкам.
Это просто псевдокод. Но да, неудачный, потому что в первом случае так-то тоже массив подразумевается. Убрал.

DeaDDooMER wrote:
Сейчас кнопка нажата, а через строчку уже не нажата, а ещё через строчку снова нажата.
Так клавиши не отжимаются. Виноват, во втором пункте должно было быть "все клавиши, нажатые до конца тика", я слово пропустил. Исправил.
Учти ещё, что тут мной неявно подразумевается опрос ввода вне FPS и UPS.

DeaDDooMER wrote:
Весь инпут должен собираться в начале тика и оставаться одинаковым в течении тика.
Тогда как раз и получается, что в начале тика (читай: до нового кадра) зафиксировали ввод, обрабатываем, тут игрок кнопку нажал. В таком случае она отреагирует уже не на следующем для него кадре, а через один, потому что мы этот кадр не показали ещё, мы его только считаем. Мой подход, конечно, тоже не до конца решает проблему (игрок всё ещё может нажать клавишу уже после того, как был пройден код, за неё отвечающий), но для полноценного решения надо отдельный поток гонять, который срабатывал бы на прерывания от клавиатуры.

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 13 posts ] 

All times are UTC + 3 hours


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
doom2d.org, since 2007