Native UI Book · 04 Data & VirtualList
虚拟列表、数据表格与图表 (Data Display)
零卡顿渲染 1,000,000 行结构化数据。仅向 GPU 提交当前视口可见行图元。
百万行虚拟滚动列表 (`v_virtual_list`)
得益于 GPUI 的视口裁剪与 `gpui-kit` 的虚拟化布局器,即使绑定百万级遥测日志 Vec<LogRecord>,每帧也仅对当前视口可见范围(visible_range: Range<usize>)内的 20~40 行元素构造图元,内存常驻稳定在 30MB 以内:
rust
use gpux::prelude::*;
use gpux::kit::{h_flex, v_virtual_list, ActiveTheme, StyledExt};
pub fn render_log_stream(&mut self, cx: &mut Context<Self>) -> impl IntoElement {
// 仅向 GPU 提交当前视口可见索引范围 visible_range
v_virtual_list(
cx.entity().clone(),
"telemetry-log-stream",
self.row_sizes.clone(),
|view, visible_range, _window, cx| {
visible_range
.map(|ix| {
let entry = &view.logs[ix];
h_flex()
.w_full()
.px_4()
.py_1()
.justify_between()
.border_b_1()
.border_color(cx.theme().border)
.child(format!("[#{:06}] {}", ix, entry.node_id))
.child(format!("{:.2} ms", entry.latency_ms))
})
.collect()
},
)
}