From 1055c2e5343661956519c244221c49f135f005ec Mon Sep 17 00:00:00 2001 From: Taj Pereira Date: Thu, 28 Nov 2024 22:36:23 +0900 Subject: [PATCH] Prepare benchmarks + ~1.7x prepare perf improvement (#121) * Add prepare benchmarks * Skip unnecessary peaks * Cite sample sources --- Cargo.toml | 5 + benches/prepare.rs | 121 +++++++++ benches/state.rs | 35 +++ samples/README.md | 8 + samples/arabic.txt | 637 +++++++++++++++++++++++++++++++++++++++++++++ samples/latin.txt | 137 ++++++++++ src/text_atlas.rs | 17 -- src/text_render.rs | 35 ++- 8 files changed, 960 insertions(+), 35 deletions(-) create mode 100644 benches/prepare.rs create mode 100644 benches/state.rs create mode 100644 samples/README.md create mode 100644 samples/arabic.txt create mode 100644 samples/latin.txt diff --git a/Cargo.toml b/Cargo.toml index fa70fca..a48b84b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,3 +19,8 @@ winit = "0.30.3" wgpu = "23" resvg = { version = "0.44", default-features = false } pollster = "0.4.0" +criterion = { version = "0.5", features = ["html_reports"] } + +[[bench]] +name = "prepare" +harness = false diff --git a/benches/prepare.rs b/benches/prepare.rs new file mode 100644 index 0000000..8907e20 --- /dev/null +++ b/benches/prepare.rs @@ -0,0 +1,121 @@ +use cosmic_text::{Attrs, Buffer, Color, Family, FontSystem, Metrics, Shaping, SwashCache}; +use criterion::{criterion_group, criterion_main, Criterion}; +use glyphon::{ + Cache, ColorMode, Resolution, TextArea, TextAtlas, TextBounds, TextRenderer, Viewport, Weight, +}; +use wgpu::{MultisampleState, TextureFormat}; + +mod state; + +fn run_bench(ctx: &mut Criterion) { + let mut group = ctx.benchmark_group("Prepare"); + group.noise_threshold(0.02); + + let state = state::State::new(); + + // Set up text renderer + let mut font_system = FontSystem::new(); + let mut swash_cache = SwashCache::new(); + let cache = Cache::new(&state.device); + let mut viewport = Viewport::new(&state.device, &cache); + let mut atlas = TextAtlas::with_color_mode( + &state.device, + &state.queue, + &cache, + TextureFormat::Bgra8Unorm, + ColorMode::Web, + ); + let mut text_renderer = + TextRenderer::new(&mut atlas, &state.device, MultisampleState::default(), None); + + let attrs = Attrs::new() + .family(Family::SansSerif) + .weight(Weight::NORMAL); + let shaping = Shaping::Advanced; + viewport.update( + &state.queue, + Resolution { + width: 1000, + height: 1000, + }, + ); + + for (test_name, text_areas) in &[ + ( + "Latin - Single Text Area", + vec![include_str!("../samples/latin.txt")], + ), + ( + "Arabic - Single Text Area", + vec![include_str!("../samples/arabic.txt")], + ), + ( + "Latin - Many Text Areas", + include_str!("../samples/latin.txt") + .repeat(100) + .split('\n') + .collect(), + ), + ( + "Arabic - Many Text Areas", + include_str!("../samples/arabic.txt") + .repeat(20) + .split('\n') + .collect(), + ), + ] { + let buffers: Vec = text_areas + .iter() + .copied() + .map(|s| { + let mut text_buffer = Buffer::new(&mut font_system, Metrics::relative(1.0, 10.0)); + text_buffer.set_size(&mut font_system, Some(20.0), None); + text_buffer.set_text(&mut font_system, s, attrs, shaping); + text_buffer.shape_until_scroll(&mut font_system, false); + text_buffer + }) + .collect(); + + group.bench_function(*test_name, |b| { + b.iter(|| { + let text_areas: Vec