CD Code Digest Hub /GTA V

过场、时间线与玩法恢复

范围:Cutscene/;动画底座与回放分别见对应报告。总入口:Summary。

6 分钟阅读 7 个章节 1 张图

1. 设计思路#

过场是对角色、镜头、音频、灯光、粒子、字幕和世界资源的临时统一编排。CutSceneManager : cutsManager 将 RAGE 时间线系统适配到 GTA 游戏对象;具体 cutscene entity 在引擎事件与游戏对象之间转译。

模块的困难不只在播放动画,更在资源就绪、接管现有角色、与正常世界共存、跳过、恢复玩家控制以及清理临时状态。管理器因此具有加载、播放、暂停、淡出、跳过、停止、卸载及恢复前再加载等状态处理。

2. 主要组成#

组成职责
CutSceneManagerNew状态推进、请求、脚本归属、世界接管与退出
CutSceneStore / AssetManagercut 文件及关联资源
AnimManager / Animation过场动画组织
EntityFactory / AnimatedModelEntity将时间线对象绑定到游戏实体
Camera / Light / Sound / ParticleEffect / Overlay / Fade entities不同轨道或事件的执行适配
Bounds entity过场空间范围与相关约束

管理器注释明确指出一个 cutscene entity 可以负责多个对象,也可以按对象建立,不能将时间线节点和场景实体假定为严格一对一。

3. 生命周期与准备条件#

图是核心职责概括,具体状态跳转由管理器和基类决定,seamless 或恢复播放会增加路径。LoadCutFile 的注释说明它请求 streaming 装载;AreReservedEntitiesReady 则说明除了资源文件,还要等待实体条件。

StreamingFlags 成对定义动画字典、音频、模型、粒子、overlay、字幕、Rayfire、scene、interior 的 load/unload event。过场资源集合远大于一个动画文件;局部加载完成不能等价于整场就绪。

4. 帧阶段与时间线一致性#

PreSceneUpdate 是状态更新入口,PostSceneUpdate 注释说明在帧末更新时间。另有标志跟踪 pre/post 阶段是否调用,避免状态推进与对象更新失配。Core/game.cpp 也在世界更新相应位置接入过场 wrapper。

先更新控制和事件、后提交帧时间,有利于让同帧角色、镜头和效果消费一致时间。若任意模块提前递增播放时间,可能造成某些轨道早一帧;修改过场速度、暂停或逐帧调试时要保持相同约定。

GetCurrentBufferIndex 根据 update thread 选择与渲染线程相对的缓冲索引,说明至少部分过场数据采用线程侧缓冲。逻辑管理器的字段不能都被当成任意线程可直接写的共享状态。

5. 跳过是状态重建#

seamless skip、立即停止和默认行为具有不同选项;管理器提供 DoSkippingState、StopCutsceneAndDontProgressAnim、是否保留前一动画字典和 camera tag 禁止 skip 等接口。跳过不是把时间设到末尾就结束。

正常播放期间可能已经改变角色姿态、位置、道具、可见性、天气/灯光和相机。跳过需要选择应保留的终态和应撤销的临时状态,再恢复世界。对声音与字幕也需要正确终止或跳转,以免游戏恢复后仍播放旧内容。

eCutSceneExitFlags 包含 health 与 ped variation;OptionFlags 还控制玩家位置、targetable、pickups、退出到车辆/掩体以及第一人称混出。它们证明退出协议携带玩法语义,必须与任务脚本约定一致。

6. 镜头与玩家控制恢复#

选项 CUTSCENE_DELAY_ENABLING_PLAYER_CONTROL_FOR_UP_TO_DATE_GAMEPLAY_CAMERA 直接表达一个重要边界:游戏镜头尚未更新时,不应提前让玩家控制生效。否则输入可能在镜头与角色状态不一致时被消费。

IsFadeTimerComplete 还有避免其他系统淡入相机导致等待卡住的保护说明。屏幕 fade 是多系统共享能力,过场不能只等待一个可能被外部覆盖的标志。这里是源码已记录的设计意图,而非本次复现的问题。

回放编辑模式下,部分“是否正在播放过场”的查询转而读取录制帧标志。因此现场时间线播放和回放重现需要不同判定来源。

7. 维护、性能与源码依据#

维护优先覆盖未完成加载时取消、播放中跳过、暂停后恢复、角色换装、第一人称退出、任务提前终止和会话关闭。资源峰值可能来自过场资产与开放世界并存;只统计动画内存会遗漏模型、音频、粒子和室内内容。本文未实际播放或渲染过场。

源码重点
CutSceneManagerNew.h状态接口、load/unload flags、退出选项、缓冲
CutSceneManagerNew.cpp状态与游戏恢复的实现入口
CutSceneAssetManager.h资产管理
CutSceneEntityFactory.h时间线对象适配
CutSceneCameraEntity.h过场镜头实体

关联:流式加载、动画、摄像机、回放。