特效、天空、天气外观与 TimeCycle
范围:vfx/、timecycle/;天气规则见 WorldRules,水和植被绘制见 Renderer。总入口:Summary。
1. 环境状态转为可见结果#
特效层连接玩法事件与呈现:火、爆炸、血、玻璃、实体和脚本效果分别有游戏侧组织,粒子、decal、天空、云和镜头效果负责不同表现。TimeCycle 则把时刻、天气、位置和修饰器转为一组统一视觉参数。
CVisualEffects::Init 初始化 PtFx、decal、vehicle glass、sky、weather、timecycle、clouds、lens flare 及多个 VFX 子系统。这表明效果管理是聚合层,实际实现和部分更新入口分散在 renderer、世界规则和专用管理器。
2. 两条互补的数据链#
一条链是离散事件驱动的实例,一条是连续环境参数求值。它们相交但生命周期不同:爆炸粒子可能几秒结束,天气湿度或脚本 modifier 可以持续更久。
3. 粒子管理与生命周期#
CPtFxManager 提供 Update、dynamic quality、local effects update、depth buffer、shadowed particle buffer 和 update thread/wait 接口。粒子既使用世界坐标和实体附件,也读取深度/光照等图形数据,所以它并非独立于渲染管线的“播放动画”。
管理器可按 script thread、entity 和范围移除效果。脚本、实体和效果资源的所有权需要显式关联:脚本终止应清理归属效果,实体删除/重生需要解除附件。循环效果与一次性效果的退出条件也不同,不能只依赖粒子自然耗尽。
动态质量与剔除提供成本控制,但对游戏提示性效果必须考虑可读性。源码接口证明质量可动态调整,并不证明某个固定粒子数量阈值适用于全部配置。
4. Decal、骨骼和破坏#
decal 目录区分 skinned/non-skinned drawable、bound 和 smash group 的处理任务,说明贴花需要与不同几何表示适配。角色上的伤口、静态墙面弹痕和碎片上的痕迹不共享完全相同的变换及更新代价。
DecalManager 与异步任务描述体现更新/结果收敛边界;CGame::Update 的注释也提到完成 decal 更新并启动新异步工作。对象销毁、碎裂、LOD 切换或骨骼更新时,要考虑旧 decal 引用与新几何的关系。
vehicle glass 的视觉状态与物理破碎、网络 glass pane 同步有交叉。视觉裂纹、物理洞口和可穿透性必须分别检查,不能由看到玻璃破碎就推断所有参与模块已同步。
5. TimeCycle 是多来源参数求值#
CTimeCycle : tcManager 管理视觉 keyframe 和 modifier。实现可见按时间/天气计算 keyframe、region keyframe 混合和 over-time weather 的插值;接口还包括 script modifier、局部门户、主/次 modifier、ambient scale 查询以及水下更新。
| 输入 | 技术作用 |
|---|---|
| 时钟与天气 | 决定基础 keyframe 和天气过渡 |
| 区域/局部 modifier | 根据空间环境覆盖或混合视觉变量 |
| 室内与 portal | 结合室内外关系、门遮挡和局部 ambient |
| Script modifier | 为任务、特殊状态和镜头效果提供覆盖 |
| 水下状态 | 进入专用参数调整路径 |
这些来源的具体优先级和各变量混合方式应以实现为准。不能把所有 modifier 都概括为简单线性加法;一些变量有自己的类型、模式和限制。
UpdateWrapper 调用 g_timeCycle.Update(true),而 Core 在相机之后安排该更新,反映视觉参数依赖当前观察点。TimeCycleAsyncQueryMgr、CalcAmbientScaleAsync 进一步提供异步查询支持;使用者需要清楚自己拿到的是哪次计算结果。
6. 内容与代码的边界#
.psc、VfxSettings、Vfx metadata 描述结构和可调参数,实际效果库、纹理与曲线依赖配套资源。当前源码可解释调度、数据结构和消费者,但不能还原未提供资产的具体美术效果。
修改环境色调应先确定归属:天气改变基础世界状态,TimeCycle 改最终视觉参数,PostFX 改屏幕后处理,材质则改变对象自身响应。任意在一层补偿另一层问题,会增加后续环境组合的不一致。
7. 性能与维护检查#
主要成本来自粒子更新与碰撞探测、透明 overdraw、decal 投射/骨骼处理、特效资源、天空和云的绘制,以及各类异步等待。实例数相同不代表成本相同,应区分屏幕覆盖面积、是否碰撞、是否依附骨骼和是否需要额外缓冲。
优先验证效果拥有者删除、场景卸载、过场跳过、天气强制过渡、进入室内/水下、回放恢复和质量等级切换。本报告未进行运行效果或 GPU 性能验证。
8. 源码依据#
| 源码 | 重点 |
|---|---|
| VisualEffects.cpp | 聚合初始化与效果子系统 |
| PtFxManager.h | 生命周期、质量、深度与线程接口 |
| DecalManager.h | decal 管理 |
| TimeCycle.h | modifier、portal、ambient、Update |
| TimeCycle.cpp | keyframe 和区域/天气插值 |
| TimeCycleAsyncQueryMgr.h | 异步查询入口 |