3.2 KiB
3.2 KiB
Extra2D 数据结构与算法优化计划
概述
针对分析发现的潜在问题,制定以下分阶段优化计划。
阶段一:高优先级问题修复(预计 3-4 天)
1.1 四叉树碰撞检测优化
目标: 解决 O(n²) 碰撞检测性能问题
文件: src/spatial/quadtree.cpp
方案:
- 实现扫描线算法或 AABB 树加速碰撞检测
- 优化节点分裂策略,避免对象过度集中
- 添加单元测试验证性能改进
1.2 空间哈希内存布局重构
目标: 减少内存碎片,提高缓存友好性
文件: include/extra2d/spatial/spatial_hash.h, src/spatial/spatial_hash.cpp
方案:
- 使用单一连续内存结构替代嵌套哈希表
- 实现对象池复用 Cell 内存
- 查询时使用线程本地静态缓冲区避免临时分配
1.3 动画帧数据布局优化
目标: 提高动画系统缓存命中率
文件: include/extra2d/animation/animation_frame.h, include/extra2d/animation/frame_property.h
方案:
- 采用结构体数组(SoA)布局存储帧数据
- 热数据(delay, offset)和冷数据(碰撞盒)分离
- 使用紧凑位域替代 std::variant 存储属性
1.4 Node 循环引用风险修复
目标: 消除内存泄漏风险
文件: include/extra2d/scene/node.h, src/scene/node.cpp
方案:
- 审查所有 shared_ptr 使用场景
- 添加对象所有权文档说明
- 考虑使用 intrusive_ptr 替代 shared_ptr
阶段二:中优先级优化(预计 2-3 天)
2.1 变换矩阵脏标记传播
目标: 优化深层场景树性能
文件: src/scene/node.cpp
方案:
- 实现脏标记传播机制替代递归计算
- 延迟计算世界变换直到实际需要
2.2 纹理池 LRU 优化
目标: 提高缓存局部性
文件: include/extra2d/graphics/texture_pool.h
方案:
- 使用侵入式链表替代 std::list
- 使用数组索引代替指针
2.3 子节点排序优化
目标: 减少排序开销
文件: src/scene/node.cpp
方案:
- 使用插入排序(如果大部分已有序)
- 或使用 std::multiset 维护有序性
阶段三:低优先级改进(预计 1-2 天)
3.1 渲染命令内存优化
目标: 减少 RenderCommand 内存占用
文件: include/extra2d/graphics/render_command.h
方案:
- 类型分离的命令队列
- 或自定义联合体替代 std::variant
3.2 资源管理软引用缓存
目标: 减少资源重复加载
文件: include/extra2d/resource/resource_manager.h
方案:
- 实现 LRU 策略管理缓存
- 软引用保留最近使用资源
实施顺序建议
- 首先修复内存安全问题 (Node 循环引用)
- 然后优化性能瓶颈 (四叉树、空间哈希)
- 最后进行内存布局优化 (动画帧、渲染命令)
预期收益
| 优化项 | 预期性能提升 | 内存节省 |
|---|---|---|
| 四叉树碰撞检测 | 50-80% (大量对象时) | - |
| 空间哈希重构 | 20-30% | 30-40% |
| 动画帧布局 | 15-25% | 40-50% |
| 变换矩阵优化 | 10-20% (深层场景) | - |
| 纹理池 LRU | - | 20-30% |
请确认此计划后,我将开始实施具体的代码修改。