
测试环境
Windows 桌面,WPF + WebView2。
处理器 Intel(R) Core(TM) i9-14900HX (2.20 GHz)
机带 RAM 32.0 GB (31.7 GB 可用)
系统类型 64 位操作系统,基于 x64 的处理器
操作系统版本 Windows 11 家庭中文版
实现原理
核心思路是:用 C# 承载页面,用 Three.js 组织 3D 场景,用 WebGL 做底层 GPU 绘制。
整体如下:
WPF窗口中嵌入WebView2。- 在 C# 中动态拼接 HTML,并通过
NavigateToString注入页面。 - 页面侧加载
three.min.js,创建Scene / Camera / WebGLRenderer。 - 粒子通过
THREE.BufferGeometry与多个BufferAttribute存储。 - 每帧在 JS 中更新粒子位置与生命周期,提交属性更新后由 GPU 渲染。
- 页面每秒统计一次 FPS,通过
window.chrome.webview.postMessage(...)回传给 C#,在 UI 上实时显示。
总结为:这是一个'CPU 负责粒子状态更新,GPU 负责大规模点精灵绘制'的混合型架构。
关键技术点
1. 跨技术栈集成:WPF 与 Web 3D 的桥接
- C# 端调用
EnsureCoreWebView2Async()初始化浏览器内核。 - 使用
WebMessageReceived接收前端消息,把 FPS 同步回桌面 UI。 - 这样可以让原生桌面应用拥有 WebGL 渲染能力,同时保留 WPF 的业务壳层。
2. 大规模粒子数据结构:BufferGeometry
- 粒子位置、颜色、尺寸、生命周期都以
Float32Array组织。 - 通过
geometry.setAttribute(...)绑定到 GPU 可消费的缓冲属性。 - 相比逐对象管理,结构化数组 + 批量绘制是海量粒子的基础。
3. 自定义 Shader:粒子视觉在 GPU 完成
- 顶点着色器负责点大小透视缩放、生命周期透明度系数计算。
- 片段着色器利用
gl_PointCoord裁剪圆形粒子并做柔和边缘。 - 材质配置启用
AdditiveBlending,形成更亮的粒子叠加效果。
4. 仿真更新模型:每帧 CPU 循环
当前粒子运动(重力、阻力、边界反弹、重生)都在 JS for 循环中执行。
这使逻辑直观易控,但也带来一个关键瓶颈:粒子数线性增长时,CPU 计算和属性回写成本同步上升。
核心代码
1. 粒子总量入口
private const int ParticleCount = 100000;- 这是压测的直接控制阀,影响所有数组长度和每帧循环规模。



