105 lines
3.2 KiB
Markdown
105 lines
3.2 KiB
Markdown
|
|
# 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 策略管理缓存
|
||
|
|
- 软引用保留最近使用资源
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 实施顺序建议
|
||
|
|
|
||
|
|
1. **首先修复内存安全问题** (Node 循环引用)
|
||
|
|
2. **然后优化性能瓶颈** (四叉树、空间哈希)
|
||
|
|
3. **最后进行内存布局优化** (动画帧、渲染命令)
|
||
|
|
|
||
|
|
## 预期收益
|
||
|
|
|
||
|
|
| 优化项 | 预期性能提升 | 内存节省 |
|
||
|
|
|--------|-------------|----------|
|
||
|
|
| 四叉树碰撞检测 | 50-80% (大量对象时) | - |
|
||
|
|
| 空间哈希重构 | 20-30% | 30-40% |
|
||
|
|
| 动画帧布局 | 15-25% | 40-50% |
|
||
|
|
| 变换矩阵优化 | 10-20% (深层场景) | - |
|
||
|
|
| 纹理池 LRU | - | 20-30% |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
请确认此计划后,我将开始实施具体的代码修改。
|