Evolve Charts compares Evolve benchmark results: scores, GPU time per workload category and per pass, and GPU sensors, across GPUs and settings. You don't need to know Python or git. It opens as a page in your web browser, and everything stays on your computer. Nothing is uploaded.
Download Evolve Charts (Evolve-Charts.zip)
-
Extract the zip. Right-click it and choose Extract All⦠(Windows) or double-click it (macOS), for example to your Desktop. Don't start the tool from inside the zip.
-
Start the tool from the extracted Evolve Charts folder:
- Windows: double-click Start Evolve Charts. If Windows warns about the file, click More info βΊ Run anyway.
- macOS: right-click Start Evolve Charts.command and choose Open (the first time only; after that a double-click works).
- Linux: run
./start-evolve-charts.shin a terminal.
The first start installs uv, a small helper that downloads Python and the libraries the tool uses (about 150 MB). This needs an internet connection, takes a few minutes and only happens once. Keep the window that opens running while you use the tool; close it when you're done.
-
Run your benchmarks in Evolve. Evolve saves every run as a
.evolvefile, inDocuments\Evolve\resultson Windows. Run on every GPU or setting you want to compare, using the same benchmark on each. -
Add your results. Your browser opens Evolve Charts. Drag the
.evolvefiles onto Add Evolve runs, or put them in theresultsfolder so they load automatically every time. -
Name your results on their cards (for example "RTX 4070 Ti" or "Gen 1"). These names appear in every chart.
To update, download the zip again and replace the old folder (keep your results folder if you use it).
The tool reads the .evolve file Evolve saves for every run: the measurements of every frame and pass,
the GPU sensor readings and the system information. It calculates the scores from those the way Evolve
does. It has a page per question, in the bar at the top:
| Page | What it shows | Needs |
|---|---|---|
| Results | Load and name runs; GPU, driver, OS, Evolve version, benchmark and what each file contains | |
| Scores | Evolve's scores side by side, with the workload category each one scores, and the differences | scores |
| GPU time | Where the GPU spends its time each frame, per workload category; then one workload category over the run and the passes it's made of | per-frame data; the passes need pass timings |
| Passes | Every render pass in one searchable table; tick passes to plot them over the run | pass timings |
| GPU sensors | Clocks, power, temperature and more during the run, to spot throttling | per-frame data |
| Export | CSV files for Excel, Google Sheets, Datawrapper and Flourish |
On every page except Results, a bar at the top shows the loaded results and lets you pick the one to compare against.
How Evolve measures a GPU. Evolve times passes: single blocks of GPU work. A workload category is GPU work that logically belongs together, and what Evolve scores. All ray tracing work, such as the shadow-raytrace-inline pass, is the Raytracing workload: the Ray Tracing score. There is one score per workload category and no total score.
Downloading a chart: hover over it and click the π· camera icon in its top-right corner. Use Charts at the top right to choose PNG or SVG and whether charts get a source line with the GPUs, drivers and Evolve version. Help explains how the numbers are made.
- GPU time per frame is how long the GPU spent on that work, averaged over every frame of the run. The first second is skipped because it includes one-off setup work. Lines over time are smoothed over one second.
- Passes Evolve doesn't assign to a workload category (such as drawing the user interface) are left out; the GPU time page says how much that is.
- Workload categories add up to the GPU work shown. That can differ a little from the time between frames, because a GPU can idle between passes or run passes at the same time.
- Whiskers on bar charts show the range covering 90% of frames (5th to 95th percentile).
- Only compare results from the same Evolve version and benchmark settings. The tool warns you when the benchmarks, Evolve versions or graphics APIs differ.
- A result is missing from Passes: its run has no pass timings. Its card shows β Passes; scores and workload categories still work.
- "was saved by a newer Evolve": download the latest Evolve Charts.
- The browser doesn't open: open http://localhost:8501 yourself while the black window is open.
- Anything else: send a screenshot of the black window to Traverse Research.
- Run without the launcher:
uv run evolve-charts.py. Dependencies are declared inline (PEP 723), so no virtual environment is needed. - Code lives in
evolve_charts/:loader.pyreads.evolvefiles (a zip of Parquet tables and a JSON document) into tidy tables.scores.pycalculates Evolve's scores from those tables.categories.pydescribes Evolve's workload categories and which pass belongs to which.stats.pycomputes the summaries.charts.pybuilds the Plotly figures.ui.pyis the Streamlit page.
- The look follows Evolve's
crates/evolve/src/ui/styling.rs: theme colours and the Spartan font are set in.streamlit/config.toml, and the fonts, logo and icon live instatic/. Chart colours are incharts.py. - Which pass belongs to which workload category, and the score multipliers, come from Evolve's Rust
source. After pass names or score calibrations change in Evolve, regenerate them with
python tools/sync_categories.pyandpython tools/sync_scores.py(both read../evolveby default), thenuvx ruff format evolve_charts. - Dependencies are locked in
evolve-charts.py.lock; refresh it withuv lock --script evolve-charts.py --upgrade. - Tests:
uv export --script evolve-charts.py --no-hashes > requirements.txt, thenuv venv && uv pip install -r requirements.txt pytest && uv run --no-project pytest. CI runs the same. - Releases: push a tag like
v1.0.0. The release workflow tests, runstools/package.pyand attachesEvolve-Charts.zipto a GitHub release; the download link above always points to the newest one.
scripts/run_on_android.pystarts Evolve on an Android device with command-line arguments. See docs/Android.md.
