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

Improved architecture for iced_wgpu and iced_tiny_skia #2382

Merged
merged 34 commits into from
Apr 14, 2024

Conversation

hecrj
Copy link
Member

@hecrj hecrj commented Apr 10, 2024

This PR completely rewrites the internals of both iced_wgpu and iced_tiny_skia—all while removing a bunch of indirection, simplifying the layering logic, and introducing smarter caching.

The Backend traits in iced_graphics have been removed, together with the Primitive enum. Instead, renderers simply implement the Renderer traits from iced_core directly. Layering logic is reused by leveraging the new Layer trait and layer::Stack data structure in iced_graphics.

Therefore—instead of recording a primitive tree first and then flattening it as different layers—renderers now are capable of organizing graphical primitives in different layers while these primitives themselves are being recorded (during Widget::draw). Allocations are easily reused this way and, since there is no recursive data structure, we can avoid boxing altogether.

Furthermore, the explicit layer-oriented architecture—as opposed to a primitive-oriented one—allows us to implement smarter caching strategies. Specifically, every canvas::Cache is now capable of caching—not only the tessellated vertices—but also the GPU vertex buffers and texture atlases directly. This effectively means we can avoid preparing and uploading vertex data every frame—specially useful if you are rendering a lot of text in a Canvas!

I took these changes as an opportunity to start benchmarking parts of the library and created a basic wgpu benchmark for now. It just draws 1000 rectangles and 1000 text sections offscreen using a Canvas. When compared with master, we can observe quite the speedup:

image

Finally, these changes also introduce a new Engine type in iced_wgpu that contains all the pipeline state (as well as the MSAA framebuffer). This type is shared between all the different Renderer instances; reducing the memory usage when using the multi-window feature considerably.

hecrj added 30 commits April 3, 2024 21:07
Due to AA, it's very expensive to render every cached
layer independently.
@hecrj hecrj added this to the 0.13 milestone Apr 10, 2024
@hecrj hecrj merged commit 105b8bd into master Apr 14, 2024
24 checks passed
@hecrj hecrj deleted the wgpu/better-architecture branch April 14, 2024 11:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant