Files
heros/.qoder/repowiki/zh/content/地图系统/地图视图/地图图层管理/实体图层管理.md
panw 4235e3b776 refactor(game): 移除已弃用的事件常量
- 删除 UpdateHero 和 UpdateFightHero 事件
- 移除 MISSION_UPDATE 事件常量
- 优化游戏事件枚举定义
2025-10-28 16:15:47 +08:00

7.1 KiB
Raw Blame History

实体图层管理

**本文档引用文件** - [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts) - [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts) - [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts) - [Hero.ts](file://assets/script/game/hero/Hero.ts) - [Mon.ts](file://assets/script/game/hero/Mon.ts) - [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts) - [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts) - [timer.md](file://doc/core/common/timer.md)

目录

  1. 引言
  2. 实体图层结构
  3. Z轴层级管理机制
  4. 定时器更新策略
  5. ECS系统数据同步
  6. 性能优化方案
  7. 结论

引言

本文档深入解析EntityLayer作为动态实体容器的实现机制重点阐述其如何承载英雄、怪物及其他可移动单位的可视化节点。文档将详细说明其通过addChild与zIndex控制子节点渲染顺序的Z轴层级管理机制分析其内置的定时器更新策略以及与ECS系统中BattleMoveComp的数据同步设计模式。同时提供处理大量实体时的性能优化方案。

实体图层结构

EntityLayer作为游戏场景中的物体层负责管理所有动态实体的可视化节点。该图层通过Cocos Creator的节点系统实现作为场景中的一个特殊容器节点专门用于承载英雄、怪物等可移动单位。

graph TB
subgraph "场景层级结构"
MapViewScene[地图场景]
EntityLayer[实体图层]
SkillLayer[技能图层]
MapLayer[地图图层]
end
MapViewScene --> EntityLayer
MapViewScene --> SkillLayer
MapViewScene --> MapLayer
EntityLayer --> HeroNode[英雄节点]
EntityLayer --> MonsterNode[怪物节点]

Diagram sources

Section sources

Z轴层级管理机制

EntityLayer通过精确的Z轴层级管理机制确保战斗单位在地形与特效间的正确叠加。该机制不直接依赖节点的z坐标而是通过控制节点在父节点中的兄弟索引sibling index来实现渲染顺序的控制。

核心实现位于BattleMoveSystem中通过updateRenderOrder方法动态调整所有单位的渲染层级

flowchart TD
Start([开始更新渲染层级]) --> FindUnits["查找所有HeroViewComp实体"]
FindUnits --> FilterByFac["按阵营分组"]
FilterByFac --> SortByX["按x坐标排序<br/>x坐标越小越靠后"]
SortByX --> SetSiblingIndex["设置兄弟索引<br/>index越大层级越高"]
SetSiblingIndex --> End([完成渲染层级更新])

Diagram sources

Section sources

定时器更新策略

EntityLayer采用智能的定时器更新策略通过固定帧间隔批量刷新实体位置以降低渲染开销。该策略避免了每帧都进行深度排序可能带来的性能问题。

classDiagram
class EntityLayer {
-timer : Timer
+update(dt : number)
+clear()
}
class Timer {
+interval : number
+update(dt : number) : boolean
}
EntityLayer --> Timer : "使用"

EntityLayer中定义了一个间隔为0.2秒的Timer实例理论上应该周期性地执行节点排序。然而当前实现中相关代码被注释表明开发者意识到每帧排序的性能开销问题为未来优化预留了接口。

Diagram sources

Section sources

ECS系统数据同步

系统采用实体-组件-系统ECS架构实现视图与逻辑的完全解耦。BattleMoveComp作为数据组件承载移动状态而EntityLayer作为视图容器负责可视化呈现。

sequenceDiagram
participant BattleMoveSystem as BattleMoveSystem
participant BattleMoveComp as BattleMoveComp
participant HeroViewComp as HeroViewComp
participant EntityLayer as EntityLayer
BattleMoveSystem->>BattleMoveComp : 读取移动状态
BattleMoveSystem->>HeroViewComp : 获取节点引用
BattleMoveSystem->>HeroViewComp : 更新位置
BattleMoveSystem->>BattleMoveSystem : updateRenderOrder()
BattleMoveSystem->>HeroViewComp : setSiblingIndex()
HeroViewComp->>EntityLayer : 节点层级更新

当英雄或怪物实体被加载时通过addChild方法将其节点添加到EntityLayer中实现视图与逻辑的绑定

Section sources

性能优化方案

对象池复用

系统通过ECS框架内置的对象池机制实现组件和实体的高效复用。当实体被销毁时其组件会被放入缓存池中下次创建时优先从池中获取避免频繁的内存分配与垃圾回收。

erDiagram
ENTITY["实体"] {
string name PK
boolean active
}
COMPONENT["组件"] {
string type PK
boolean pooled
}
ENTITY_POOL["实体池"] {
int capacity
int count
}
COMPONENT_POOL["组件池"] {
int capacity
int count
}
ENTITY ||--o{ COMPONENT : "包含"
ENTITY_POOL }o--|| ENTITY : "存储"
COMPONENT_POOL }o--|| COMPONENT : "存储"

可见性裁剪

虽然当前代码未显式实现可见性裁剪但在BattleMoveSystem中通过阵营分组过滤和距离检测间接实现了部分裁剪功能。系统只对同阵营的单位进行渲染层级计算减少了不必要的处理。

批量更新策略

通过0.2秒的定时器间隔系统可以批量处理多个实体的位置更新和层级排序而不是每帧都执行有效降低了CPU开销。

Section sources

结论

EntityLayer作为动态实体容器通过精心设计的Z轴层级管理机制和定时器更新策略有效平衡了视觉效果与性能开销。其与ECS系统的深度集成实现了视图与逻辑的完美解耦为游戏的可维护性和扩展性奠定了坚实基础。未来的优化方向包括启用定时排序、实现完整的可见性裁剪以及进一步优化对象池策略。