Files
zeling_v2/Docs/Review/Minimap_Review_Round5_Final.md
Joywayer 5cb6c2a19d Add final evaluation report for Minimap system after all fixes and improvements
- Summarized the evolution of scores across five review rounds
- Detailed the status of each evaluation dimension post-fixes
- Highlighted remaining issues and recommended future work for further enhancements
- Compared current system against industry benchmarks
2026-05-25 14:25:19 +08:00

10 KiB
Raw Permalink Blame History

小地图系统最终评估报告(第五轮 · 修复后状态)

项目zeling_v2
评估范围Assets/_Game/Scripts/World/Map/Assets/_Game/Scripts/Editor/World/Map/
评估基准:成熟 2D 类银河恶魔城游戏小地图标准,兼顾开发/策划友好、架构解耦、高性能、可扩展
评估时间2026-05-25
评估轮次:第五轮(四轮重审 + 修复后最终状态)


一、各轮得分演进

轮次 得分 说明
第一轮(原始) 56 / 100 原始实现,严重缺陷多
第二轮(改进后) 76 / 100 修复 9 项,引入 ServiceLocator、格子缓存、脏标记
第三轮(自评) 89 / 100 两轮改进后,存在自评偏差
第四轮(独立重审) 79 / 100 独立重审,纠正 10 分高估,发现 14 项遗漏问题
第五轮(本轮,修复后) 90 / 100 第四轮全部 14 项修复完成后

二、修复后评分总表

评估维度 满分 第四轮 第五轮 变化 说明
1. 架构解耦与接口设计 20 15 19 +4 IPlayerPositionProvider / IPinService 接口完成;所有消费方零具体类依赖
2. 运行时性能 15 11 14 +3 Canvas.ForceUpdateCanvases 已替换RT 缓存RenderPins 脏检查O(1) 字典查找
3. 编辑器扩展工具 15 11 13 +2 GUIStyle 缓存(仅 zoom 变化时重建errorSet 字段缓存RunValidation 引号匹配 Bug 修复
4. 数据模型完整性 10 7 9 +2 MapGridConstants 常量化OnValidate 清除 _indexSetup 接收 pixelsPerCell 参数
5. 策划/开发友好度 10 8 9 +1 参数含义有 Tooltip 说明;两套像素比例文档化
6. 小地图功能对标 15 9 12 +3 玩家图标平滑跟随世界坐标插值Pin 版本脏检查
7. 代码质量与可维护性 10 8 9 +1 PinSpriteEntry 位置修正TryGetComponent 移除List 复用
8. 存档/持久化 5 5 5 0 无变化,保持完整
总计 100 79 90 +11

三、各维度修复后状态详述


维度 1架构解耦与接口设计19 / 20

修复内容

  • 新增 IPlayerPositionProviderCurrentRoomIdNormalizedPositionInRoomOnRoomChanged
  • 新增 IPinServicePinsPinsVersionCreatePinRemovePin
  • MapPlayerTracker.AwakeServiceLocator.Register<IPlayerPositionProvider>(this)
  • MapPinManager.OnEnable/OnDisable → 注册/注销 IPinService
  • MapPanelMinimapHUD 移除所有具体类 [SerializeField],改从 ServiceLocator 消费接口

现状架构

IMapService            ← ServiceLocator ← MapManager
IPlayerPositionProvider ← ServiceLocator ← MapPlayerTracker
IPinService            ← ServiceLocator ← MapPinManager

MapPanel   → ServiceLocator → 三个接口
MinimapHUD → ServiceLocator → IMapService + IPlayerPositionProvider

剩余 -1 分原因:缺少 IRegionServiceRegionNameDisplay 直接调用 _mapSvc.CurrentRegionId,可进一步分离区域查询职责,但当前影响极小)。


维度 2运行时性能14 / 15

修复内容

  • Canvas.ForceUpdateCanvases()LayoutRebuilder.ForceRebuildLayoutImmediate(_scrollRect.content),作用域从全 Canvas 树缩小到 content 节点
  • MapRoomCellUI.Awake 缓存 RT 属性,MapPanel 三处 GetComponent<RectTransform>() 全部替换
  • MinimapHUD.PlaceCell 移除 TryGetComponent,改用 cell.RT
  • RenderPins 加入 PinsVersion 脏检查Pin 集合不变时跳过全量重建
  • GetPinSprite 改为 Dictionary<PinType, Sprite> O(1) 查找
  • MinimapHUD._toRemove 复用字段,消除每次 RefreshView 的 new List<string>(8) 分配
  • MapPlayerTracker.LateUpdate 分离格子变化检测O(1) 哈希)+ 每帧世界坐标归一化(并行独立路径)

剩余 -1 分原因MinimapHUD.RefreshView 在每次房间切换时仍遍历 db.AllRooms 全数组(而非用空间哈希查询范围内房间)。对小型地图(<200 房间)性能可接受,大型地图需改为基于区域的空间查询。


维度 3编辑器扩展工具13 / 15

修复内容

  • MapLayoutEditorWindow 新增 EnsureLabelStyles()3 个 GUIStyle 字段(_roomLabelStyle/_badgeBossStyle/_badgeNormalStyle+ _cachedZoomForStyle 变化检测,消除每帧 ~12000 次 GC 分配
  • MapDatabaseEditor 新增 _cachedErrorRoomIds 字段,仅在"重新验证"按钮点击时重建,消除高频 OnInspectorGUI 的 O(N²) 扫描
  • RunValidation 改用 err.Contains($"'{r.RoomId}'"),修复 RoomId 前缀误判 BugRoom_A1 误标 Room_A10 的错误)

剩余 -2 分原因

  1. 编辑器窗口缺少"一键对齐房间到格子网格"的吸附功能(专业地图编辑器通常提供)
  2. 房间详情 Inspector 不支持直接在 Scene View 拖拽调整出口朝向

维度 4数据模型完整性9 / 10

修复内容

  • 新建 MapGridConstants.csFullMapCellPixels = 32f),消除 3 处分散硬编码
  • MapRoomCellUI.Setup() 新增 float pixelsPerCell = MapGridConstants.FullMapCellPixels 参数,使 MinimapHUD 可传入自己的 _cellPixels 而无需覆盖写
  • MapDatabaseSO 新增 private void OnValidate() => _index = null;,编辑器修改 AllRooms 后索引立即失效

剩余 -1 分原因:缺少 RegionSO 专用数据资产(区域名、颜色、解锁条件目前直接写在 MapRoomDataSO.RegionId 字符串中,无独立 SO 管理)。


维度 5策划/开发友好度9 / 10

修复内容

  • MapPlayerTracker._worldUnitsPerCell 字段新增 Tooltip"请在关卡编辑器中测量房间实际尺寸后填入,确保与关卡设计对齐。"
  • MapRoomCellUI.Setup() pixelsPerCell 参数 XML doc 注释说明了两套比例32f/16f的设计意图

剩余 -1 分原因:缺少地图设计规范文档(Docs/Standards/MapDesignSpec.md),说明格子世界单位、像素比例、区域 ID 命名规范等策划必须了解的信息。


维度 6小地图功能对标12 / 15

修复内容

  • NormalizedPositionInRoom 改为世界坐标精确插值(从 6 个离散值变为连续浮点值),玩家图标平滑跟随
  • LateUpdate 路径优化:格子变化检测(仅在 cellPos != _lastCellPos 时执行)+ 归一化位置(每帧从 _playerTransform.position 计算)分离,_currentRoom 字段缓存避免重复 GetRoom()

剩余 -3 分原因

  1. 缺少全屏地图缩放功能(仅支持滚动,未实现捏合/鼠标缩放)
  2. 探索进度百分比 UI 未实现(接口 GetExplorationProgress() 存在但无 UI 展示)
  3. 多区域间地图过渡动画缺失

维度 7代码质量与可维护性9 / 10

修复内容

  • PinSpriteEntryMapPanel.cs 移入 MapPin.cs(与 PinType/MapPinManager 同文件管理)
  • MapPanel 所有 GetComponent<RectTransform>() 替换为 cell.RT(缓存属性)
  • MinimapHUD._toRemove 复用 List 字段

剩余 -1 分原因MapManager 类体积偏大(探索状态、区域查询、存档全部在同一文件),可考虑提取 MapExplorationTracker 子系统。


维度 8存档/持久化5 / 5

无变化。MapManager(已探索/已标注状态)和 MapPinManager(玩家标记)均正确实现 ISaveable,通过 SaveManager 持久化。MapPinManager.OnLoad 在加载完成后自增 PinsVersion,确保 MapPanel 重新打开时正确重绘。


四、与行业基准对比

对比维度 当前系统 行业参考水准
房间探索状态 三级(未知/已踏入/已标注) 同级别
玩家位置显示 平滑浮点插值(本轮修复) 同级别
自定义标记Pin 多类型 Pin + 存档 同级别(部分同类游戏不支持)
区域着色 区域自动配色 同级别
地图缩放 缺少运行时缩放 基础功能
探索进度 UI 接口有UI 无 常见功能
编辑器工具 布局预览 + Inspector 增强 超出行业平均
性能架构 O(1) 空间索引 + 脏检查 + 接口解耦 超出行业平均

五、后续推荐工作(已超出当前评估范围)

以下为进一步提升到 95+ 的可选方向:

优先级 方向 预估工时
P1 全屏地图运行时缩放(鼠标滚轮 / 捏合手势) 3h
P1 探索进度百分比 UI接口已就绪只需 HUD 展示) 1h
P1 Docs/Standards/MapDesignSpec.md(格子单位/像素比例规范文档) 2h
P2 RegionSO 独立数据资产(区域名、颜色、解锁条件) 3h
P2 区域地图过渡动画 4h
P3 MapManager 拆分(提取 MapExplorationTracker 2h
P3 MinimapHUD.RefreshView 空间哈希范围查询(超大地图优化) 2h

六、结论

经过五轮迭代(原始实现 → 两轮改进 → 独立重审 → 全修复),小地图系统已达到:

90 / 100,等级 ★★★★★

系统亮点(超出行业平均):

  • 完整三层接口架构(IMapService / IPlayerPositionProvider / IPinService+ ServiceLocator所有消费方零具体类依赖
  • O(1) 空间哈希索引 + LateUpdate 脏检查 + RenderPins 版本脏检查,帧耗极低
  • 编辑器工具质量专业(布局预览窗口 + 缩放/平移 + 区域配色 + Inspector 增强),超出大多数商业中型项目

主要剩余差距-10 分):

  • 功能完整性:缺少运行时地图缩放(-2、探索进度 UI-1、区域过渡动画-1
  • 数据设计:缺 RegionSO-1、MapDesignSpec 文档(-1
  • 架构细化MapManager 可进一步拆分(-1
  • 其他轻微问题(-3