-
Notifications
You must be signed in to change notification settings - Fork 17
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
Overlays interaction latency tuning #453
Merged
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
goodboy
force-pushed
the
overlays_interaction_latency_tuning
branch
from
February 3, 2023 13:12
1912db7
to
e280e48
Compare
This was referenced Feb 3, 2023
goodboy
force-pushed
the
l1_compaction
branch
from
February 9, 2023 21:45
4281005
to
97e0aae
Compare
goodboy
force-pushed
the
overlays_interaction_latency_tuning
branch
from
February 9, 2023 21:47
e280e48
to
07d941d
Compare
goodboy
force-pushed
the
l1_compaction
branch
from
February 12, 2023 19:03
97e0aae
to
f1f812e
Compare
goodboy
force-pushed
the
overlays_interaction_latency_tuning
branch
from
February 12, 2023 19:09
07d941d
to
ea3ea8d
Compare
goodboy
force-pushed
the
l1_compaction
branch
from
February 12, 2023 20:38
f1f812e
to
cee6321
Compare
goodboy
force-pushed
the
overlays_interaction_latency_tuning
branch
from
February 12, 2023 20:39
ea3ea8d
to
02b92e8
Compare
guilledk
approved these changes
Feb 13, 2023
Before this axes were being stacked from the outside in (for `'right'` and 'bottom'` axes) which is somewhat non-intuitive for an `.append()` operation. As such this change makes a symbol list stack a set of `'right'` axes from left-to-right. Details: - rename `ComposeGridLayout.items` -> `.pitems` - return `(int, list[AxisItem])` pairs from `.insert/append_plotitem()` and the down stream `PlotItemOverlay.add_plotitem()`. - drop `PlotItemOverlay.overlays` and add it back as `@property` around the underlying `.layout.pitems`.
- adjust zoom focal to be min of the view-right coord or the right-most point on the flow graphic in view and drop all the legacy l1-in-view focal point cruft. - flip to not auto-scaling overlays by default. - change the `._set_yrange()` margin to `0.09`. - drop `use_vr: bool` usage.
Whenever the last datum is in view `slice_from_time()` need to always spec the final array index (i.e. the len - 1 value we set as `read_i_max`) to avoid a uniform-step arithmetic error where gaps in the underlying time series causes an index that's too low to be returned.
When a new tick comes in but no new time step / bar is yet needed (to be appended) we can simply adjust **only** the last bar datum lines-graphic(s) to avoid a redraw of the preceding `QPainterPath` on every tick. Do this by calling `Viz.draw_last()` on the fast and slow chart and adjusting the guards around calls to `Viz.update_graphics()` (which *does* update paths) to only enter when there's a `do_px_step` condition. We can stop calling `main_viz.plot.vb._set_yrange()` on view treading cases since the range should have already been adjusted by the clearing-tick processing mxmn updates. Further this changes, - the `chart_maxmin()` helper (which we should eventually just get rid of) to take bound in `Viz`s for the ohlc and vlm chart instead of the chart widget handles. - extend the guard around hist viz yranging to only enter when not in "axis mode" - the same as for the fast viz.
For the purposes of avoiding another full format call we can stash the last rendered 1d xy pre-graphics formats as `IncrementalFormatter.x/y_1d: np.ndarray`s and allow readers in the viz and render machinery to use this data easily for things like "only drawing the last uppx's worth of data as a line". Also add a `.flat_index_ratio: float` which can be used similarly as a scalar applied to indexes into the src array but instead when indexing (flattened) 1d xy formatted outputs. Finally, this drops the way overdone/noisy `.__repr__()` meth we had XD
In an effort to ensure uniform and uppx-optimized last datum graphics updates call this method directly instead of the equivalent graphics object thus ensuring we only update the last pixel column according with the appropriate max/min computed from the last uppx's worth of data. Fixes / improvements to enable `.draw_last()` usage include, - change `Viz._render_table` -> `._alt_r: tuple[Renderer, pg.GraphicsItem] | None` which holds an alternative (usually downsampled) render and graphics obj. - extend the `.draw_last()` signature to include: - `last_read` to allow passing in the already read data from `.update_graphics()`, if it isn't passed then a manual read is done internally. - `reset_cache: bool` which is passed through to the graphics obj. - use the new `Formatter.flat_index_ratio: float` when indexing into xy 1d data to compute the max/min for that px column. Other, - drop `bars_range` input from `maxmin()` since it's unused.
The max min for a given data range is defined on the lowest level through the `Viz` api intermingling it with the view is a layering issue. Instead make `._set_yrange()` call the appropriate view's viz (since they should be one-to-one) directly and thus avoid any callback monkey patching nonsense. Requires that we now make `._set_yrange()` require either one of an explicit `yrange: tuple[float, float]` min/max pair or the `Viz` ref (so that maxmin can be called) as input. Adjust `enable/disable_auto_yrange()` to bind in a new `._yranger()` partial that's (solely) needed for signal reg/unreg which binds in the now required input `Viz` to these methods. Comment the `autoscale_overlays` block in `.maybe_downsample_graphics()` for now until we figure out the most sane way to auto-range all linked overlays and subplots (with their own overlays).
Removes the multi-maxmin usage as well as ensures appropriate `Viz` refs are passed into the view methods now requiring it. Also drops the "back linking" of the vlm chart view to the source OHLC chart since we're going to add this as a default to the charting API.
Acts as short cut when pipe-lining from `Viz.update_graphics()` (which now returns the needed in-view array-relative-read-slice as output) such that `Viz.read()` and `.datums_range()` doesn't need to be called internally multiple times. In this case where `i_read_range` is provided we of course skip doing time index translations and consequently lookup the appropriate (epoch-time) index indices for caching.
First, we rename what was `chart_maxmin()` -> `multi_maxmin()` and don't `partial` it in to the `DisplayState`, just call it with correct `Viz` ref inputs. Second, as we've done with `ChartView.maybe_downsample_graphics()` use the output from the main `Viz.update_graphics()` and feed it to the `.maxmin()` calls for the ohlc and vlm chart but still deliver the same output signature as prior. Also accept and use an optional profiler input, drop `DisplayState.maxmin()` and add `.vlm_viz`. Further perf related tweak to do with more efficient incremental updates: - only call `multi_maxmin()` if the main fast chart viz does a pixel column step. - mask out hist viz and vlm viz and all linked fsp `._set_yrange()` calls for now until we figure out how to best optimize these updates when considering the new group-scaled-by-% style for multicharts. - drop `.enable_auto_yrange()` calls during startup.
Allows callers to know if they should care about a particular viz rendering call by immediately knowing if the graphics are in view. This turns out super useful particularly when doing dynamic y-ranging overlay calcs.
Curve-path colouring and cache mode settings are used (and can thus be factored out of) all child types; this moves them into the parent type's `.__init__()` and adjusts all sub-types match: - the bulk was moved out of the `Curve.__init__()` including all previous commentary around cache settings. - adjust `BarItems` to use a `NoCache` mode and instead use the `last_step_pen: pg.Pen` and `._pen` inside it's `.pain()` instead of defining functionally duplicate vars. - adjust all (transitive) calls to `BarItems` to use the new kwargs names.
goodboy
force-pushed
the
overlays_interaction_latency_tuning
branch
from
February 13, 2023 17:28
02b92e8
to
fefb0de
Compare
77 tasks
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Like it sounds, improvements to speed up real-time update (displaying) and user interaction (mouse and keyboard ctls) for multi-feed overlay charts.
Obviously in support of #420 🏄🏼
Lots of chart UI bug fixes included:
TLDR interaction perf;
Viz
Viz
update pipelines in the interaction handlers and display loop avoiding more-then-necessary x-domain time series reloadingViz
range calcing methods which were moved off the chart widget api and drop the wholeChartView._maxmin()
overriding muck