# 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% | --- 请确认此计划后,我将开始实施具体的代码修改。