力计算算法
根据您的模拟需求选择合适的算法
直接 N²
O(N²)精确的成对力计算
Barnes-Hut
O(N log N)层次八叉树近似
空间哈希
O(N)基于网格的短程力
性能基准
在 NVIDIA RTX 3080, CUDA 11.8 上的实时 FPS
| 粒子数 | 直接 N² | Barnes-Hut | 空间哈希 |
|---|---|---|---|
| 10K | 60 FPS | 120 FPS | 120 FPS |
| 100K | 10 FPS | 60 FPS | 90 FPS |
| 1M | 1 FPS | 25 FPS | 60 FPS |
FPS 对比(越高越好)
10K
100K
1M
直接 N²
Barnes-Hut
空间哈希
内存占用: 每粒子约 52 字节 + 算法开销。大规模模拟推荐: Barnes-Hut 适用于引力系统,空间哈希适用于短程力。
核心特性
高性能粒子模拟所需的一切
GPU 加速
CUDA 并行处理,每个粒子一个线程
三种算法
直接 N²、Barnes-Hut O(N log N)、空间哈希 O(N)
零拷贝渲染
CUDA-OpenGL 互操作,消除 CPU↔GPU 数据传输
能量守恒
Velocity Verlet 辛积分器
实时 60+ FPS
流畅可视化,支持高达 100 万粒子
跨平台
支持 Linux、Windows、macOS(需 NVIDIA GPU)
系统架构
模拟系统组件的高层概览
设计模式
- 策略模式 — 运行时算法切换
- 桥接模式 — CUDA-OpenGL 互操作抽象
- 外观模式 — 简洁的 ParticleSystem API
内存布局
- 结构数组 (SoA) — GPU 合并访问
- 共享 VBO — 零拷贝渲染
- 共享内存 — 内核缓存
快速开始
几分钟内开始 N-Body 模拟
example.cpp
#include "nbody/particle_system.hpp"
using namespace nbody;
int main() {
// 配置模拟
SimulationConfig config;
config.particle_count = 100'000;
config.force_method = ForceMethod::BARNES_HUT;
config.dt = 0.001f;
config.init_distribution = InitDistribution::SPHERICAL;
// 初始化并运行
ParticleSystem system;
system.initialize(config);
for (int step = 0; step < 10'000; ++step) {
system.update(system.getTimeStep());
// 保存检查点
if (step % 1000 == 0) {
system.saveState("checkpoint_" + std::to_string(step) + ".nbody");
}
}
return 0;
}