This codepath can be very expensive when there are a lot of messages to send to lots of objects with maps - much of the cost is in dereferencing handle.Target in DeferredResolutionOfBindings() which involves taking a mutex lock.
Further, once the lock is taken for each object, ResolveBindingsIfNecessary() is called for each of that object's InputActionMaps which in the general case does nothing (when there is nothing to do).
In the supplied (ridiculous to show the point) test project with 900 objects, each with 6 maps receiving 4500 mouse move messages this leads to:
over 21 million calls to ResolveBindingsIfNecessary() that do nothing
over 4 million mutex locks in resolving handle.Target in DeferredResolutionOfBindings()
frame times over 1 second!
Changes made
This change adds a static InputActionMap.s_NeedToResolveBindings that is set when we know that at least one InputActionMap has changes that need resolving. This is cleared when a resolve pass has been completed.
With this change the frame time in the example only increases by about 2-3ms when the mouse is moving.
Checklist
Before review:
[x] Changelog entry added.
Explains the change in Changed, Fixed, Added sections.
For API change contains an example snippet and/or migration example.
FogBugz ticket attached, example ([case %number%](https://issuetracker.unity3d.com/issues/...)).
FogBugz is marked as "Resolved" with next release version correctly set.
Description
Avoid costly (and pointless) iterations over all messages / objects / maps when we don't need to.
Issue: https://jira.unity3d.com/browse/ISXB-573
This codepath can be very expensive when there are a lot of messages to send to lots of objects with maps - much of the cost is in dereferencing handle.Target in DeferredResolutionOfBindings() which involves taking a mutex lock.
Further, once the lock is taken for each object, ResolveBindingsIfNecessary() is called for each of that object's InputActionMaps which in the general case does nothing (when there is nothing to do).
In the supplied (ridiculous to show the point) test project with 900 objects, each with 6 maps receiving 4500 mouse move messages this leads to:
Changes made
This change adds a static InputActionMap.s_NeedToResolveBindings that is set when we know that at least one InputActionMap has changes that need resolving. This is cleared when a resolve pass has been completed.
With this change the frame time in the example only increases by about 2-3ms when the mouse is moving.
Checklist
Before review:
Changed
,Fixed
,Added
sections.([case %number%](https://issuetracker.unity3d.com/issues/...))
.Area_CanDoX
,Area_CanDoX_EvenIfYIsTheCase
,Area_WhenIDoX_AndYHappens_ThisIsTheResult
.During merge:
NEW: ___
.FIX: ___
.DOCS: ___
.CHANGE: ___
.RELEASE: 1.1.0-preview.3
.After merge: