CD Code Digest Hub /GTA V

车辆、驾驶与交通人口

范围:Vehicles/、vehicleAi/ 的 intelligence/任务/避让,以及 control/ 中交通、车库、路线相关部分。总入口:Summary。

8 分钟阅读 8 个章节 1 张图

1. 设计主线#

车辆系统把“是什么车”“怎样运动”“谁在驾驶”“为什么出现在这里”分开处理:model info 和 handling 描述类型与参数,CVehicle 及子类承担实体和运动,CVehicleIntelligence/vehicle tasks 产生驾驶意图,population 与 factory 管理生成和存活。

CVehicle : CPhysical 共享场景、物理、附件与损伤集成,汽车、摩托、自行车、船、飞机、直升机、火车、拖车、潜艇及两栖类拥有专用实现。不能把所有载具都按四轮汽车模型推断;源码包含某个类型也不保证所有配置都会启用它。

2. 创建车辆是一条有约束的事务链#

CVehicleFactory::Create 接受 model ID、ownedBy、population type、矩阵以及 clone/inactive 参数。实现先检查模型和创建条件,尝试从 destroyed cache 获取车辆,否则按 vehicle type 创建;随后配置实例、统计人口并进行网络相关注册。

这张图是职责概括,不代表所有调用都无条件联网。factory 对部分网络注册失败路径销毁对象并返回空,也根据 mission/permanent 等类型区分处理。脚本、人口和网络容量因此共同决定创建结果;模型有效并非唯一成功条件。

缓存重用减少反复构造和资源准备,但也要求恢复所有实例状态。判断异常的旧车损伤、附加组件或所有权是否残留时,应追踪 cache restore 和新建路径的差异,而不是只看构造函数。

3. Handling 是数据驱动的动力学接口#

Metadata/HandlingInfo.psc 描述共享 CHandlingData,包括质量、阻力、重心、惯性、驱动分配、挡位、动力、换挡速率、制动、转角、牵引曲线、悬挂、横向稳定、损伤倍率、模型/handling/damage flags 和子类型数据。

参数组影响范围维护细节
质量、重心、惯性加速响应、翻滚、碰撞与模型边界和轮距共同决定表现
驱动、传动、挡位发动机输出与轮上驱动应结合 Transmission 而非只看最高速度字段
Traction、刹车、转向抓地、侧滑、制动与操控多参数耦合,不能简单线性外推
悬挂、AntiRoll、RollCentre轮地接触与车身稳定与轮结构、驱动配置和模型 flags 相关
碰撞/武器/形变/发动机损伤倍率不同损伤通道视觉破坏与功能损坏不完全等价
SubHandlingData船、飞行等特定模型共用基类加类型专用参数

schema 中的范围是编辑/解析约束,不能直接视作推荐调参范围或物理单位证明。具体单位换算、缓存参数与运行时限制要核对 handlingMgr 和消费者。

4. 汽车物理与游戏手感#

Automobile.cpp 根据前/后/中驱动、后轮/全轮转向、轮轴和履带 flags 构造轮与悬挂,结合 Transmission、浮力、车身状态和专用控制逻辑工作。源码还可见 improved/reduced righting force、offroad、burnout 和 wheelie 等分支。

这些机制说明驾驶模型不仅追求通用刚体求解,还在其上加入 GTA 玩法需要的操控辅助和类型特例。用单一现实世界车辆公式不能解释所有行为,调参应同时考虑玩家输入、AI 控制和脚本模式。

CVehicle 分离 ProcessControl、DoProcessControl、deferred task completion 与 ProcessPhysics。控制更新、异步计算结果收敛和物理积分有不同时间边界;车辆网络状态或回放也会影响本地实际执行的路径。

5. 驾驶 AI 与车辆任务#

CVehicleIntelligence 持有任务管理器,提供 cruise、automobile goto、按 mission identifier 创建任务以及网络任务创建。车辆可有自身的 primary/secondary 行为,不应把所有驾驶逻辑都理解为驾驶员 Ped 的一段函数。

道路搜索提供路线,VehicleNavigationHelper 和具体 vehicle tasks 将路线转换为驾驶目标;driver personality、路口、速度区和避让改变策略。CVehPIDController 的存在显示部分控制使用反馈控制器,但不能由此推断所有载具都采用同一套 PID 参数或控制链。

飞行载具还有独立的 FlyingVehicleAvoidance。道路车辆的 lane/node 逻辑不能直接套用到飞机、直升机和船,类型专用任务与运动模型共同决定最终轨迹。

6. 交通人口与成本控制#

vehiclepopulation 管理生成、密度、清理和网络人口条件;相关文件包括 async、population job 和 density job。控制代码引用道路密度、交通密度修饰、traffic jam management、车辆重用池和生成区域,表明交通是带空间、容量与生命周期约束的过程,而非每帧随机选点创建。

CVehicleAILodManager 在 CGame 的人口阶段更新。车辆数量、AI 精度、物理、车轮、灯光、损伤和乘员形成多维成本。提高交通密度可能同时提高 Ped 数量、网络对象数和资源模型多样性,不能只看车辆处理函数耗时。

车库和 vehiclestorage 连接世界车辆与保存/恢复状态;trafficlights 连接交通规则;record/waypoint 路线可提供专用驾驶或回放数据。它们按消费者分布在 control/,说明目录名不完全等同于运行时模块边界。

7. 关键交叉状态#

优先检查上下车与座位切换、拖挂关系、损伤和修复、车辆缓存重用、资源未就绪、网络所有权变化,以及车辆被脚本保护后的人口清理。司机 Ped、车辆实体、车内动画、摄像机和网络对象都有自己的状态,任何一方提前完成都不代表整套动作已经结束。

本文未运行车辆仿真,未给出具体车型的真实性或性能结论。分析依据是 factory、控制接口、handling schema 和 AI/人口入口。

8. 源码依据#

源码重点
vehicle.h基类、控制/物理、损伤与 intelligence
VehicleFactory.cpp1564 行附近 Create、cache 与失败清理
HandlingInfo.psc参数、flags、SubHandlingData
Automobile.cpp车轮、传动、手感辅助与物理分支
VehicleIntelligence.h任务管理、驾驶模式与反馈控制器
vehiclepopulation.cpp人口、密度、重用与网络限制

关联:导航、物理、网络、持久化。