📁 文件夹结构
bash
benches/
├── wgpu.rs # WebGPU 渲染器基准测试
└── ipsum.txt # Lorem Ipsum 测试文本数据
🎯 核心作用
用于存放**基准测试(Benchmark Tests)**代码,量化代码执行效率(时间/吞吐量),发现性能瓶颈,防止性能回退。
📄 wgpu.rs 详解
文件头
rust
#![allow(missing_docs)] // 基准测试允许缺失文档注释
依赖引入
rust
use criterion::{Bencher, Criterion, criterion_group, criterion_main};
use iced::*; // iced GUI框架组件
use iced_wgpu::{Renderer, wgpu}; // wgpu渲染器核心
测试框架设置
rust
criterion_main!(benches); // 基准测试入口点
criterion_group!(benches, wgpu_benchmark); // 定义测试组
🔬 核心基准测试函数
wgpu_benchmark - 主测试函数
1. GPU 初始化
rust
// 创建WebGPU实例(支持所有后端:Vulkan/Metal/DX12)
let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor {
backends: wgpu::Backends::all(),
..
});
// 请求高性能适配器
let adapter = executor::block_on(instance.request_adapter(...));
// 创建GPU设备和命令队列
let (device, queue) = executor::block_on(adapter.request_device(...));
2. 六项基准测试
| 测试名称 | 轻量级 | 重量级 | 测试内容 |
|---|---|---|---|
| canvas | 10元素 | 1,000元素 | 画布绘制性能(矩形+文本) |
| layered text | 10层 | 1,000层 | 多层文本堆叠渲染 |
| dynamic text | 1,000字符 | 100,000字符 | 动态生成文本性能 |
| advanced shaping | 1,000字符 | 100,000字符 | 复杂文本布局(含emoji) |
🛠️ 辅助函数
benchmark - 通用测试执行器
rust
fn benchmark(
bencher: &mut Bencher, // Criterion测试对象
adapter: &wgpu::Adapter, // GPU适配器
device: &wgpu::Device, // GPU设备
queue: &wgpu::Queue, // 命令队列
view: impl Fn(usize) -> Element, // 创建UI元素的闭包
) {
// 1. 初始化渲染引擎(4倍MSAA抗锯齿,无窗口模式)
let engine = iced_wgpu::Engine::new(..., Shell::headless());
// 2. 创建4K渲染目标(3840x2160)
let viewport = graphics::Viewport::with_physical_size(Size::new(3840, 2160), 2.0);
// 3. 迭代执行渲染测试
bencher.iter(|| {
// 构建UI
// 绘制
// 提交到GPU
// 等待完成
});
}
🎨 UI 测试函数
1. scene - 画布测试
rust
fn scene(n: usize) -> Element {
// 绘制n个矩形 + n个文本
for i in 0..n {
frame.fill_rectangle(...); // 白色矩形
frame.fill_text(...); // 黑色文本(显示索引i)
}
}
2. layered_text - 多层文本
rust
fn layered_text(n: usize) -> Element {
// 堆叠n层文本:"I am paragraph {i}!"
stack((0..n).map(|i| text!("I am paragraph {i}!").into()))
}
3. dynamic_text - 动态文本 ⭐
rust
fn dynamic_text(n: usize, i: usize) -> Element {
const LOREM_IPSUM: &str = include_str!("ipsum.txt"); // 使用测试数据
// 将Lorem Ipsum重复n次生成不同大小的文本
std::iter::repeat(LOREM_IPSUM.chars())
.flatten()
.take(n)
.collect::<String>()
}
4. advanced_shaping - 高级文本布局
rust
fn advanced_shaping(n: usize, i: usize) -> Element {
// 与dynamic_text类似,但:
// 1. 启用高级文本塑形 .shaping(text::Shaping::Advanced)
// 2. 添加emoji 😎 测试Unicode支持
}
📄 ipsum.txt 详解
文件内容
标准的 Lorem Ipsum 占位文本,包含:
- 多个段落
- 伪拉丁文词汇
- 各种标点符号
- 不同句子长度
在基准测试中的作用
| 用途 | 说明 |
|---|---|
| 标准化测试数据 | 保证测试的可重复性和一致性 |
| 文本渲染测试 | 测试渲染引擎处理长文本的性能 |
| 内存分配测试 | 测试处理动态文本时的内存行为 |
| 可扩展性 | 通过重复生成任意大小的文本 |
实际使用示例
rust
// 在dynamic_text中
LOREM_IPSUM.chars() // 遍历Lorem Ipsum字符
.take(n) // 取前n个字符
.collect() // 生成测试字符串
📊 测试策略总结
渐进式复杂度
- 基础图形:矩形绘制
- 简单文本:ASCII文本
- 复杂文本:Unicode + emoji
- UI结构:单层 → 多层 → 滚动视图
性能测试维度
- CPU时间:UI构建和布局计算
- GPU时间:渲染和提交
- 内存使用:大文本分配
- 并发处理:多次迭代模拟真实场景
硬件配置
- 所有GPU后端支持
- 高性能模式优先
- 4K分辨率测试
- 4倍MSAA抗锯齿
🎯 最佳实践验证
✅ 使用静态测试数据 (ipsum.txt)
✅ 轻量/重量级对比
✅ 真实场景模拟 (迭代渲染)
✅ 多维度覆盖 (图形/文本/布局)
✅ 硬件适配(跨平台GPU支持)
这个基准测试套件能够全面评估 iced_wgpu 渲染器在不同场景下的性能表现!