-
Notifications
You must be signed in to change notification settings - Fork 317
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
FIX: Changed to frame based comparison for tracking UI click/navigation events #2112
base: develop
Are you sure you want to change the base?
Conversation
…d approach - track frame of interest in action
WIP - Adding tests - coming soon |
Packages/com.unity.inputsystem/InputSystem/Actions/InputActionState.cs
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Changes look like a good approach to fixing the problems with dynamic/fixed and manual update.
I'm a little concerned about having two functions to check the state. In summary as a user I find the naming confusing and hard to tell if I when to use WasPressed vs WasPressedThisFrame Adding a another reviewer for input. |
Packages/com.unity.inputsystem/InputSystem/Actions/InputActionState.cs
Outdated
Show resolved
Hide resolved
Packages/com.unity.inputsystem/InputSystem/Actions/InputAction.cs
Outdated
Show resolved
Hide resolved
Another option would be to just at a boolean parameter to each API piece wheather to check the dynamic Update cycle (which could default to true).
I understand the concerns, I couldn't make up a better name for it since WasPressedThisUpdate() would be misleading since Update could be wrongly interpreted as dynamic Update again. |
@@ -87,9 +87,9 @@ public void Actions_WhenShortcutsDisabled_AllConflictingActionsTrigger() | |||
Press(keyboard.wKey); | |||
|
|||
// All Actions were triggered | |||
Assert.That(action1.WasPerformedThisFrame()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There are a lot of tests update to make this pass?
Were all these failing without the changes?
Make me worry about how much customer code would be impacted by the change.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The test run without mimiking the dynamic update, which make this call wrong in it self (ThisFrame). Either they need to use Coroutines (see comment above) or rely on InputSystem.Update manual updates like here. In real settings (non test environments) there are no such requirements, so I don't think the users will be impacted. Especially because most users rely on update, which will work just like before.
What I meant with previous question/comment is that, considering e.g. this sequence, the results vary depending on what frame corresponds to right? Mainly adding this comment to support discussion.
|
…r-update-non-dynamic # Conflicts: # Packages/com.unity.inputsystem/CHANGELOG.md
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM. Things checked (playmode, player, mac/win, 21.3; 22.3; 6.0; 6.2):
- Changing Input Settings update modes
- Different FPS settings (1-120)
- Mouse clicks, keyboard clicks, gamepad clicks for the UI. Checked that both events shows up
- Similar, older bug fixes are still fixed (ISXB-1141)
- General input samples, main test project
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With QA sign off on the changes I'm happy to approve. Thank you.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Changes generally makes sense, would have been great to see some test coverage of the FixedUpdate and ManualUpdate modes. Additionally I wonder whether the corresponding fixes for wasPressedThisFrame/wasReleasedThisFrame are missing (to provide consistency) for:
Or would this make them behave differently compared to this if evaluated in tandem with each other? Which would be a great test to have for the different modes.
[Category("Samples")] | ||
public void Samples_RebindingUI_SuppressingEventsDoesNotInterfereWithUIInput() | ||
public IEnumerator Samples_RebindingUI_SuppressingEventsDoesNotInterfereWithUIInput() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@ritamerkl Do we have a test that verifies behavior when configured to run input processing on fixed update?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I will add tests now
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
added 8332195
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
especially tested the update and frame based comparing in co-dependency to another
@@ -3796,10 +3816,25 @@ public uint lastPerformedInUpdate | |||
set => m_LastPerformedInUpdate = value; | |||
} | |||
|
|||
internal int frame | |||
internal int framePerformed |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(Minor) If these are anyway internal and just plain getters/setters, why not skip the properties and access the fields directly here? If keeping it like this potentially mark with aggressive inlining hint
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You are right, they were kinda decorational only - fixed here 7114e6f
Seems to be a conflict in InputSystemUIInputModule that needs to be resolved. |
Those two actually just check the Update step, like desired. This checks on the rendering frame, and is exclusively changed by the InputSystemUIInputModule, which looks right then, since this operates in the dynamic update cycle. |
Sounds good! Thanks for checking in detail |
Seems the remaining CI issues you are facing Rita is due to this PR having version 1.13.1 when it needs to be 1.14.0 to not violate package verification due to 4 added APIs |
Will approve when this have been fixed |
…ub.com/Unity-Technologies/InputSystem into fix-ui-behavior-for-update-non-dynamic
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Seems version is correct now given API additions which made CI green, great.
The only two remaining things I can spot or think of now is:
- Why isn't this called out also under #Added in changelog since the PR is adding functionality not previously available?
- This risk on this PR is quite high so curious whether UI or XR QA or devs have been involved at any point since it may likely also have halo effects into e.g. XRI and UI related solutions?
Will approve now but consider extending CHANGELOG and/or reach out to UI and/or XR maybe before landing it?
Packages/com.unity.inputsystem/InputSystem/Plugins/UI/InputSystemUIInputModule.cs
Outdated
Show resolved
Hide resolved
…r-update-non-dynamic # Conflicts: # Assets/Samples/InGameHints/InGameHintsActions.cs # Assets/Samples/SimpleDemo/SimpleControls.cs # Assets/Tests/InputSystem/InputActionCodeGeneratorActions.cs # Packages/com.unity.inputsystem/InputSystem/AssemblyInfo.cs # Packages/com.unity.inputsystem/InputSystem/Devices/Precompiled/FastKeyboard.cs # Packages/com.unity.inputsystem/InputSystem/Devices/Precompiled/FastMouse.cs # Packages/com.unity.inputsystem/InputSystem/Devices/Precompiled/FastTouchscreen.cs # Packages/com.unity.inputsystem/Tests/TestFixture/AssemblyInfo.cs # Packages/com.unity.inputsystem/package.json
Description
During investigating ISXB-1313 it got clear that catching navigation and click events does not work properly once InputSystem is set to a custom / Fixed Update mode.
Analysis:
The main reason for this is that the InputSystemUIInputModule (Process -> ProcessNavigation -> WasPerformedThisFrame) is automatically called in dynamic Update, this calls in
WasPressedThisFrame()
WasReleasedThisFrame()
WasCompletedThisFrame()
WasPerformedThisFrame()
to check weather UI actions were triggered. Internally those methods use
pressedInUpdate
releasedInUpdate
lastPerformedInUpdate
lastCompletedInUpdate
which are properties to track at which update cycle of the InputSystem the events triggered. All above are just used for this checks.
Problem:
The update step is not comparable at the time of the dynamic Update since it is not clear how many times InputSystem.Update() (and with that the current update step was incremented by 1) was called in between two dynamic Updates. It can be incremented by 1 customly every millisecond or switched to be called in FixedUpdate.
Solution:
The solution is to have two different methods for the (WasPressedThisFrame/WasPerformedThisFrame ...)checks, where one checks for the current frame only and the other for the input update cycle.
They will be equal if the update mode is set to dynamic Update, if set to FixedUpdate or Manual update eg WasPressedThisRenderingFrame will return only true if the action was pressed this dynamic update cycle (no matter in which cycle the InputSystem is updated). This was missing since the old approach was assuming a frame based input updating and would not return valid values if updating the InputSystem would happen in any other time cycle.
InputSystemUIInputModule calls in the WasPerformedThisRenderingFrame() now, which returns valid results independent of the InputSetting during the dynamic Update.
Decoupling the rendering frame count checking from the input update count checking is one essential part of this PR. Those two values are only related if the input update mode is set to dynamic Update (in fact they are the same in this case). In any other case they don't have anything in common. Checking when an action state was changed can happen in the same time cycle like updating the InputSystem (which can now be decoupled from the dynamic Update).
See more details in this technical discussion document.
Testing status & QA
testing in InputSystem repo, bug project (attached to ISXB-1313) and against https://jira.unity3d.com/browse/ISXB-1160
https://jira.unity3d.com/browse/ISXB-1141.
Overall Product Risks
Comments to reviewers
For further explanation also check the comments in the ticket.
Checklist
Before review:
Changed
,Fixed
,Added
sections.Area_CanDoX
,Area_CanDoX_EvenIfYIsTheCase
,Area_WhenIDoX_AndYHappens_ThisIsTheResult
.During merge:
NEW: ___
.FIX: ___
.DOCS: ___
.CHANGE: ___
.RELEASE: 1.1.0-preview.3
.After merge: