Skip to content

Turn the renderer into a purely path based renderer#408

Merged
CryZe merged 3 commits intoLiveSplit:masterfrom
CryZe:path-renderer
Feb 7, 2021
Merged

Turn the renderer into a purely path based renderer#408
CryZe merged 3 commits intoLiveSplit:masterfrom
CryZe:path-renderer

Conversation

@CryZe
Copy link
Copy Markdown
Collaborator

@CryZe CryZe commented Feb 7, 2021

Our renderer always used paths internally but those quickly got turned into meshes. It turns out that a lot of backends can actually directly work with those paths, so splitting out the path rendering makes a lot of sense. This also enables the use of tiny-skia for the software renderer. However here is where it gets really surprising: It turns out that tiny-skia is so fast, that it outperforms the GPU. And this is without any optimizations. This isn't entirely surprising as Chrome works in a very similar way where the GPU is mostly just used to compose the different Skia layers together. So for now this also removes the mesh based renderer entirely. We are going to investigate rendering into different layers, so that's where a GPU backend may come back into play, but not in the form of a mesh based renderer.

Additionally this adds support for color fonts using the CPAL and COLR tables.

This also temporarily disables the WASI tests as we are apparently hitting wasmtime limits atm.

CryZe added 2 commits February 7, 2021 01:07
Our renderer always used paths internally but those quickly got turned
into meshes. It turns out that a lot of backends can actually directly
work with those paths, so splitting out the path rendering makes a lot
of sense. This also enables the use of `tiny-skia` for the software
renderer. However here is where it gets really surprising: It turns out
that `tiny-skia` is so fast, that it outperforms the GPU. And this is
without any optimizations. This isn't entirely surprising as Chrome
works in a very similar way where the GPU is mostly just used to compose
the different Skia layers together. So for now this also removes the
mesh based renderer entirely. We are going to investigate rendering into
different layers, so that's where a GPU backend may come back into play,
but not in the form of a mesh based renderer.

Additionally this adds support for color fonts using the `CPAL` and
`COLR` tables.
We are hitting limits in wasmtime atm. So until that gets fixed we need
to disable the tests.
@CryZe CryZe added enhancement An improvement for livesplit-core. c api The issue or pull request is about the C API. rendering The issue or pull request is affecting the rendering. feature A new user visible feature for livesplit-core. ci Affects the Continuous Integration. priority: high This is a high priority issue. performance Affects the performance of the code. labels Feb 7, 2021
@CryZe CryZe requested a review from wooferzfg February 7, 2021 00:13
1. Addressed a clippy warning
2. Increased software rendering tests tolerance on i586
3. Added dummy documentation when compiling the C API without software
   rendering
@CryZe CryZe merged commit 8599820 into LiveSplit:master Feb 7, 2021
@CryZe CryZe added this to the v0.12 milestone Feb 7, 2021
@CryZe CryZe deleted the path-renderer branch February 7, 2021 00:42
CryZe added a commit that referenced this pull request Nov 14, 2021
- Runs now support custom variables that are key value pairs that either the
  user can specify in the run editor or are provided by a script like an auto
  splitter. [#201](#201)
- There is now an option in the run editor to generate a comparison based on a
  user specified goal time. This uses the same algorithm as the `Balanced PB`
  comparison but with the time specified instead of the personal best.
  [#209](#209)
- Images internally are now stored as is without being reencoded as Base64 which
  was done before in order to make it easier for the web LiveSplit One to
  display them. [#227](#227)
- The Splits.io API is now available under the optional `networking` feature.
  [#236](#236)
- All key value based components share the same component state type now.
  [#257](#257)
- The crate now properly supports `wasm-bindgen` and `WASI`.
  [#263](#263)
- There is now a dedicated component for displaying the comparison's segment
  time. [#264](#264)
- Compiling the crate without `std` is now supported. Most features are not
  supported at this time though.
  [#270](#270)
- [`Splitterino`](https://github.com/prefixaut/splitterino) splits can now be
  parsed. [#276](#276)
- The `Timer` component can now show a segment timer instead.
  [#288](#288)
- Gamepads are now supported on the web.
  [#310](#310)
- The underlying "skill curve" that the `Balanced PB` samples is now exposed in
  the API. [#330](#330)
- The layout states can now be updated, which means almost all of the
  allocations can be reused from the previous frame. This is a lot faster.
  [#334](#334)
- In order to calculate a layout state, the timer now provides a snapshot
  mechanism that ensures that the layout state gets calculated at a fixed point
  in time. [#339](#339)
- Text shaping is now done via `rustybuzz` which is a port of `harfbuzz`.
  [#378](#378)
- Custom fonts are now supported.
  [#385](#385)
- The renderer is not based on meshes anymore that are suitable for rendering
  with a 3D graphics API. Instead the renderer is now based on paths, which are
  suitable for rendering with a 2D graphics API such as Direct2D, Skia, HTML
  Canvas, and many more. The software renderer is now based on `tiny-skia` which
  is so fast that it actually outperforms any other rendering and is the
  recommended way to render.
  [#408](#408)
- Remove support for parsing `worstrun` splits. `worstrun` doesn't support
  splits anymore, so `livesplit-core` doesn't need to keep its parsing support.
  [#411](#411)
- Remove support for parsing `Llanfair 2` splits. `Llanfair 2` was never
  publicly available and is now deleted entirely.
  [#420](#420)
- Hotkeys are now supported on macOS.
  [#422](#422)
- The renderer is now based on two layers. A bottom layer that rarely needs to
  be rerendered and the top layer that needs to be rerendered on every frame.
  Additionally the renderer is now a scene manager which manages a scene that an
  actual rendering backend can then render out.
  [#430](#430)
- The hotkeys are now based on the [UI Events KeyboardEvent code
  Values](https://www.w3.org/TR/uievents-code/) web standard.
  [#440](#440)
- Timing is now based on `CLOCK_BOOTTIME` on Linux and `CLOCK_MONOTONIC` on
  macOS and iOS. This ensures that all platforms keep tracking time while the
  operating system is in a suspended state.
  [#445](#445)
- Segment time columns are now formatted as segment times.
  [#448](#448)
- Hotkeys can now be resolved to the US keyboard layout.
  [#452](#452)
- They hotkeys are now based on `keydown` instead of `keypress` in the web.
  `keydown` handles all keys whereas `keypress` only handles visual keys and is
  also deprecated. [#455](#455)
- Hotkeys can now be resolved to the user's keyboard layout on both Windows and
  macOS. [#459](#459) and
  [#460](#460)
- The `time` crate is now used instead of `chrono` for keeping track of time.
  [#462](#462)
- The scene manager now caches a lot more information. This improves the
  performance a lot as it does not need to reshape the text on every frame
  anymore, which is a very expensive operation.
  [#466](#466) and
  [#467](#467)
- The hotkeys on Linux are now based on `evdev`, which means Wayland is now
  supported. Additionally the hotkeys are not consuming the key press anymore.
  [#474](#474)
- When holding down a key, the hotkey doesn't repeat anymore on Linux, macOS and
  WebAssembly. The problem still occurs on Windows at this time.
  [#475](#475) and
  [#476](#476)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

c api The issue or pull request is about the C API. ci Affects the Continuous Integration. enhancement An improvement for livesplit-core. feature A new user visible feature for livesplit-core. performance Affects the performance of the code. priority: high This is a high priority issue. rendering The issue or pull request is affecting the rendering.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Split the Renderer into a Path and Mesh Renderer Switch to texture based text rendering

1 participant