188 lines
6.1 KiB
Markdown
188 lines
6.1 KiB
Markdown
# PROJECT_OPTIMIZATION_ANALYSIS
|
||
|
||
> 基于本地代码静态扫描生成(不含远程仓库信息,不含 `RenderPipelineFile/` 第三方目录)。
|
||
|
||
- 分析时间: 2026-02-28
|
||
- 扫描范围: `main.py`, `Start_Run.py`, `core/`, `scene/`, `project/`, `ui/`, `ssbo_component/`, `TransformGizmo/`, `scripts/`, `tools/`, `templates/`
|
||
|
||
## 0. 执行进展(非 VR)
|
||
|
||
- 已完成 `EditorContext` 适配层:`core/editor_context.py`
|
||
- 已接入文件:
|
||
- `core/event_handler.py`
|
||
- `core/selection.py`
|
||
- `core/InfoPanelManager.py`
|
||
- `ui/panels/runtime_actions.py`
|
||
- `core/terrain_manager.py`
|
||
- `scene/scene_manager_convert_tiles_mixin.py`
|
||
- `scene/scene_manager_serialization_mixin.py`
|
||
- `scene/scene_manager_model_mixin.py`
|
||
- 效果(本地静态检索):
|
||
- 直接访问 `world.interface_manager` / `interface_manager.treeWidget` 已基本移除(仅剩注释或非本轮范围点位)。
|
||
|
||
## 1. 总体画像
|
||
|
||
- Python 文件: `146`
|
||
- 代码总行数: `58,371`
|
||
- `except Exception` / `except:` 总计: `950`
|
||
- 裸 `except:` 总计: `63`
|
||
- 旧上下文关键词引用总量:
|
||
- `interface_manager`: `35`
|
||
- `treeWidget`: `10`
|
||
- `gui_manager`: `77`
|
||
|
||
结论:
|
||
|
||
- Qt 依赖已清理后,当前主要技术债集中在三类:
|
||
- 过大函数(可维护性差)
|
||
- 异常处理过宽(问题可观测性差)
|
||
- 旧 GUI 上下文命名耦合(边界不清晰)
|
||
|
||
## 2. 热点文件(按规模/风险)
|
||
|
||
### 2.1 超大文件 Top
|
||
|
||
1. `core/vr_manager.py` (`3553` 行)
|
||
2. `core/selection.py` (`2942` 行)
|
||
3. `core/InfoPanelManager.py` (`1726` 行)
|
||
4. `ui/LUI/lui_manager_editor.py` (`1724` 行)
|
||
5. `ui/panels/property_helpers.py` (`1711` 行)
|
||
6. `ui/LUI/lui_function_properties.py` (`1707` 行)
|
||
7. `TransformGizmo/rotate_gizmo.py` (`1587` 行)
|
||
8. `ui/panels/animation_tools.py` (`1579` 行)
|
||
|
||
### 2.2 长函数 Top(优先拆分)
|
||
|
||
1. `ui/LUI/lui_function_properties.py::_draw_component_properties` (`1441` 行)
|
||
2. `scene/scene_manager_io_mixin.py::loadScene` (`556` 行)
|
||
3. `ui/panels/animation_tools.py::_getActor` (`510` 行)
|
||
4. `main.py::__init__` (`375` 行)
|
||
5. `ui/LUI/lui_manager_interaction.py::_update_drag` (`348` 行)
|
||
6. `ui/panels/editor_panels_left.py::_draw_resource_manager` (`310` 行)
|
||
7. `scene/scene_manager_io_mixin.py::processNode` (`281` 行)
|
||
8. `core/selection.py::updateGizmoDrag` (`278` 行)
|
||
|
||
### 2.3 异常处理密度高(可观测性风险)
|
||
|
||
1. `ui/panels/animation_tools.py` (`except* = 85`)
|
||
2. `core/vr_manager.py` (`71`)
|
||
3. `core/selection.py` (`57`)
|
||
4. `ui/panels/property_helpers.py` (`54`)
|
||
5. `ui/panels/app_actions.py` (`46`)
|
||
6. `scene/scene_manager_model_mixin.py` (`36`)
|
||
7. `scene/scene_manager_serialization_mixin.py` (`27`)
|
||
8. `scene/scene_manager_io_mixin.py` (`20`)
|
||
9. `project/project_manager.py` (`20`)
|
||
10. `ui/panels/runtime_actions.py` (`20`)
|
||
|
||
裸 `except:` 集中区:
|
||
|
||
- `core/selection.py` (`7`)
|
||
- `scene/scene_manager_model_mixin.py` (`7`)
|
||
- `ui/panels/editor_panels_right_material.py` (`6`)
|
||
- `ui/panels/editor_panels_left.py` (`5`)
|
||
|
||
### 2.4 旧上下文耦合集中区
|
||
|
||
1. `ui/panels/runtime_actions.py` (`gui_manager=29`)
|
||
2. `core/event_handler.py` (`interface_manager=11`, `gui_manager=11`)
|
||
3. `ui/panels/editor_panels_right.py` (`gui_manager=18`)
|
||
4. `scene/scene_manager_serialization_mixin.py` (`interface_manager=6`, `treeWidget=2`, `gui_manager=5`)
|
||
5. `core/selection.py` (`interface_manager=4`, `treeWidget=1`)
|
||
6. `core/InfoPanelManager.py` (`interface_manager=4`, `treeWidget=1`)
|
||
7. `core/terrain_manager.py` (`interface_manager=3`, `treeWidget=2`)
|
||
|
||
## 3. 优化优先级(建议执行顺序)
|
||
|
||
## P0: 上下文收敛(先做)
|
||
|
||
目标: 统一 GUI/场景树访问边界,减少跨模块 `hasattr(..., 'interface_manager')` 与 `treeWidget` 语义残留。
|
||
|
||
建议动作:
|
||
|
||
1. 引入 `EditorContext`(或 `UIContext`)统一提供:
|
||
- `get_tree_adapter()`
|
||
- `get_gui_service()`
|
||
- `get_selection_service()`
|
||
2. 在以下文件先改为调用上下文接口:
|
||
- `core/event_handler.py`
|
||
- `core/selection.py`
|
||
- `core/InfoPanelManager.py`
|
||
- `core/terrain_manager.py`
|
||
- `scene/scene_manager_serialization_mixin.py`
|
||
- `scene/scene_manager_convert_tiles_mixin.py`
|
||
- `ui/panels/runtime_actions.py`
|
||
|
||
预期收益:
|
||
|
||
- 降低命名残留与多处 `hasattr` 防御代码。
|
||
- 后续模块拆分时边界更稳定。
|
||
|
||
## P1: 大函数拆分(第二阶段)
|
||
|
||
目标: 将核心长函数拆分成“流程编排 + 子步骤函数”,减少单函数认知负担。
|
||
|
||
建议拆分顺序:
|
||
|
||
1. `scene/scene_manager_io_mixin.py::loadScene`
|
||
2. `main.py::__init__`
|
||
3. `ui/panels/animation_tools.py::_getActor`
|
||
4. `core/selection.py::updateGizmoDrag`
|
||
5. `ui/LUI/lui_function_properties.py::_draw_component_properties`(可按“变换/布局/视觉/交互/脚本”分区)
|
||
|
||
预期收益:
|
||
|
||
- 回归问题定位更快。
|
||
- 面板和场景加载逻辑更易测试。
|
||
|
||
## P2: 异常处理治理(并行推进)
|
||
|
||
目标: 将“吞异常”改为“有边界的降级 + 可追踪日志”。
|
||
|
||
建议规则:
|
||
|
||
1. 禁止新增裸 `except:`。
|
||
2. 高风险路径必须记录上下文:
|
||
- 节点名/资源路径/操作类型/当前工具状态
|
||
3. 对可恢复错误使用 `warning`,不可恢复错误返回显式失败值。
|
||
|
||
优先文件:
|
||
|
||
- `ui/panels/animation_tools.py`
|
||
- `core/vr_manager.py`
|
||
- `core/selection.py`
|
||
- `ui/panels/property_helpers.py`
|
||
- `scene/scene_manager_io_mixin.py`
|
||
|
||
## 4. 下一步可直接执行的任务包
|
||
|
||
### Task A(推荐先做,1-2 天)
|
||
|
||
- 建立 `core/editor_context.py`(或同级命名)
|
||
- 给 `event_handler/selection/InfoPanelManager/runtime_actions` 接入上下文
|
||
- 保持外部 API 不变,仅替换内部访问路径
|
||
|
||
### Task B(1 天)
|
||
|
||
- 重构 `scene_manager_io_mixin.loadScene`:
|
||
- `preflight`
|
||
- `clear_old_scene`
|
||
- `load_bam`
|
||
- `rebuild_scene_tree`
|
||
- `post_load_sync`
|
||
|
||
### Task C(1 天)
|
||
|
||
- 统一异常日志工具(轻量封装)
|
||
- 首批替换 `animation_tools.py` 与 `property_helpers.py`
|
||
|
||
## 5. 与现有文档关系
|
||
|
||
- 模块总索引: `PROJECT_MODULE_INDEX.md`
|
||
- Qt 迁移状态: `QT_TO_IMGUI_MIGRATION_CHECKLIST.md`
|
||
- 历史分析: `IMGUI_MODULE_ANALYSIS.md`
|
||
|
||
---
|
||
|
||
如果按此路线继续,建议下一轮直接从 **Task A** 开始,我可以先落地上下文适配层并改 4 个高耦合文件。
|