Skip to content
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

NEW: Input System Profiler Module #2038

Draft
wants to merge 7 commits into
base: develop
Choose a base branch
from
Draft

NEW: Input System Profiler Module #2038

wants to merge 7 commits into from

Conversation

ekcoh
Copy link
Collaborator

@ekcoh ekcoh commented Oct 25, 2024

Description

Made a draft implementation of a Profiler Module for the Input System based on lack of observability to work as an aid in understanding system mechanics. Hopefully could work as an embryo of something more refined if considered a good idea.

Screenshot 2024-10-25 at 13 36 23

Testing status & QA

Just a prototype at this point. Try it out and suggest or contribute to this PR to make it more useful.

Overall Product Risks

Some more work likely need to be done to InputManager.OnUpdate to make that method cleaner and this work more reliably.

Might not be possible to merge unless minimum Unity version requirement is changed to 2020.1. (Profiler package dependency)

  • Complexity: Small
  • Halo Effect: Medium

Comments to reviewers

At this point mainly looking for feedback and suggestions since this was unplanned work.

Checklist

Before review:

  • Changelog entry added.
    • Explains the change in Changed, Fixed, Added sections.
    • For API change contains an example snippet and/or migration example.
    • JIRA ticket linked, example (case %%). If it is a private issue, just add the case ID without a link.
    • Jira port for the next release set as "Resolved".
  • Tests added/changed, if applicable.
    • Functional tests Area_CanDoX, Area_CanDoX_EvenIfYIsTheCase, Area_WhenIDoX_AndYHappens_ThisIsTheResult.
    • Performance tests.
    • Integration tests.
  • Docs for new/changed API's.
    • Xmldoc cross references are set correctly.
    • Added explanation how the API works.
    • Usage code examples added.
    • The manual is updated, if needed.

During merge:

  • Commit message for squash-merge is prefixed with one of the list:
    • NEW: ___.
    • FIX: ___.
    • DOCS: ___.
    • CHANGE: ___.
    • RELEASE: 1.1.0-preview.3.

After merge:

  • Create forward/backward port if needed. If you are blocked from creating a forward port now please add a task to ISX-1444.

var controlCount = ProfilerDriver.GetFormattedCounterValue(selectedFrameIndex,
InputStatistics.Category.Name, InputStatistics.ControlCountName);

m_UpdateCountLabel.text = $"{InputStatistics.UpdateCountName}: {updateCount}";
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is just a basic label list at the moment. Is it possible to pass any extra information via the profiler API? Or extract sample data to e.g. create a distribution within detail window?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a ProfilerRecorder that you can use to gather samples, which then allows you to do more statistical computations.

{
try
{
DoUpdate(updateType, ref eventBuffer);
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs more work to extract some stuff from DoUpdate below

InputStatistics.EventSize.Value += totalEventSizeBytes;
InputStatistics.AverageLatency.Value += ((totalEventLag / totalEventCount) * 1e9);
InputStatistics.MaxLatency.Value += (maxEventLag * 1e9);
InputStatistics.EventProcessingTime.Value += eventProcessingTime * 1e9; // TODO Possible to replace Stopwatch with marker somehow?
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess this last line here is an anti pattern, ideally I would like to include the Update profiler marker into the profiler module, is this possible?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

During hackweek I used StopWatch. It was preallocated and reset and reused every frame and accumulated in a ProfilerCounter

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which is what it looks like you're doing here :)

@surfnerd
Copy link
Collaborator

surfnerd commented Oct 25, 2024

My first thought looking at the window is the mix of types being presented. I see Counters, Memory Size, and Times. It looks a little bit busy and hard to know what I'm looking at exactly. Overall I think this is a great idea. I wonder if there's a way we can group like values together within one window.

@ekcoh
Copy link
Collaborator Author

ekcoh commented Oct 28, 2024

My first thought looking at the window is the mix of types being presented. I see Counters, Memory Size, and Times. It looks a little bit busy and hard to know what I'm looking at exactly. Overall I think this is a great idea. I wonder if there's a way we can group like values together within one window.

Agreed, I just saw other modules were doing that and replicated it. I think there is opportunity to slip things into separate modules to handle it, e.g. Latency and Input System Counters. I wonder if execution time should even be there since its covered by the ProfilerMarkers anyway.....

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants