调试、性能观测、开发工具与公共支持
范围:debug/、performance/、tools/,补充 system/telemetry、templates/、utils/、security/ 与工程目录边界。总入口:Summary。
1. 观测能力嵌入运行时阶段#
调试与性能系统覆盖实体、世界、AI、动画、渲染、streaming、网络和内容检查。它们通过 CGame 的调用注册、各模块 profiling 标记、调试 bank、可视化和自动化场景接入运行时,而不只是外部日志工具。
这种设计能把业务数量与时间相关联:同一帧既能观察 CPU/GPU 等待,也能看到实体、ragdoll、粒子、资源请求等计数。代价是大量功能依赖构建宏,开发配置和发行配置不能直接视为相同执行路径。
2. 不同工具回答不同问题#
| 能力 | 代表入口 | 适合的问题 |
|---|---|---|
| 阶段计时 | Core/game.cpp、各模块 PF/TIMEBAR | 哪个阶段耗时或等待 |
| 成本/数量汇总 | perfClearingHouse、BudgetDisplay | 哪类对象或请求超出预算 |
| 世界可视化 | DebugScene、VectorMap、BoundsDebug、GtaPicker | 对象在哪里、当前状态是什么 |
| 渲染与资产 | Rendering、TextureViewer、AssetAnalysis | 材质、资源和几何问题 |
| 场景/资源检查 | SectorTools、ObjectPositionChecker、StreamingMemUsage | 特定位置的内容成本与资源分布 |
| 自动化流程 | AutomatedTest、SmokeTest | 执行既定运行场景与检查 |
| 遥测 | system/telemetry、network/Live/NetworkTelemetry | 跨会话/平台的事件和指标接入 |
图形捕获、录像、游戏状态录制和自动测试不是同一种数据。排查问题应先选正确观察面,不能期待单个日志覆盖全部内部状态。
3. ClearingHouse 的树形成本模型#
perfClearingHouse::System 保存 name、parent、children、allowance、weight、value、total 和 peak。IsBusy 判断 allowance 非零且 total 超过 allowance。它提供层级汇总与成本预算,而非只维护一组独立计数。
枚举包括 update/GPU wait、普通/高优先级 streaming requests、物理实例、不同 LOD 的 ragdoll/Ped、车辆、粒子、布料及顶点数。这些类别直接反映游戏用来控制规模的成本维度。
但 ENABLE_CLEARINGHOUSE 定义为 __BANK;禁用时 SetValue/Increment/Update 是空实现,IsBusy 返回 false。因此不能因为某处调用 SetValue 就认定发行运行时一定记录了这个指标,也不能用调试预算标签当作真实测量结果。
4. 时间、等待和业务数量应一起解释#
更新线程在 render Synchronise、Audio FinishUpdate、任务结果和物理同步点可能等待。等待条目说明消费者尚不能继续,但根因可能在别的线程、GPU 或 IO。把等待所在函数当作计算热点会误判。
同样,实体数升高不一定线性增加 CPU 成本:Dummy、AI LOD、动画分时、网络更新等级和可见性会改变单位成本。合理的诊断要同时记录数量分布与实际阶段耗时,而不是只比较总数。
streaming 指标应区分加载请求、优先级、回收拒绝、碎片和 churn;网络应区分节点、事件、重发与语音;渲染应区分主视图和辅助视图。这些观察维度来自各篇模块边界,不能用一个平均 FPS 取代。
5. 自动测试与开发工具边界#
AutomatedTest 通过 TestOperation 注册和参数解析组合操作;SmokeTests 提供 Process、Started/Finished 等入口,并在非 final 更新路径出现。它们依赖游戏运行环境,不是本次可以用普通单元测试命令替代的独立测试套件。
game/tools 是游戏侧开发/检查代码,和 src/dev_ng/tools 的导航生成器等离线工具、以及 tools_ng 的发行工具库不同。工程中带有工具并不表示应该执行;本次只检查了源码,未运行随附可执行文件或构建脚本。
开发功能还包括营销镜头、截图、瓦片截图和场景导出。它们可能改变渲染路径、资源范围或帧节奏,不能把启用开发捕获后的负载直接代表普通游玩。
6. 公共支持目录#
templates/ 提供 CircularArray、DblBuf、LinkList、StaticStore;utils/QuadTree 提供空间组织辅助。这些是多个模块复用的实现设施,而非独立玩法模块。
CDblBuf 根据 gRenderThreadInterface 的 render/update buffer 索引返回读写缓冲,说明它与游戏线程交接协议绑定。双缓冲不自动保证对象内部指针、外部资源或任意其他线程访问安全;它只在预期交换时序内隔离两侧数据。
security/ragesecgameinterface 包含 plugin manager、bonder 和 report cache 等游戏侧适配,受相应宏控制。它与系统资格检查、运行监测相关,不属于完整网络安全后端。本次仅确认模块定位,未推断其全部保护效果,也未改变任何检查。
test_ignore/test_ignore.cpp 属于测试辅助痕迹,多个 VS_Project*、vs_project*_lib 属于工程组织,根目录 PCH/config/optimisations 文件属于公共构建配置。它们已在覆盖矩阵记录,不人为扩展为独立游戏系统。
7. 阅读与验证策略#
先在 CGame 找到目标模块的生命周期与 profiling 分组,再沿计时/计数写入点找到工作负载;随后用对象身份、状态与资源归属解释变化。若需要后续运行验证,应先确定平台宏和观测设施可用性,再选择最小复现的场景。
本次验证只针对报告本身:源码路径、模块覆盖、文档链接和 Markdown 围栏。没有执行工程编译、游戏程序、自动测试、遥测上传或性能采样;因此文档中的风险是设计推导,不是已复现缺陷清单。
8. 源码依据#
| 源码 | 重点 |
|---|---|
| clearinghouse.h | 宏、层级指标、预算与禁用实现 |
| AutomatedTest.h | 操作注册与测试编排 |
| SmokeTest.h | smoke 场景入口 |
| telemetry.h | 游戏侧遥测生命周期 |
| DblBuf.h | render/update buffer 访问 |
| QuadTree.h | 空间辅助结构 |
| ragesecgameinterface.h | 游戏保护模块接入边界 |