CD Code Digest Hub /GTA V

界面、Scaleform、本地化与应用数据

范围:frontend/、text/、apps/。总入口:Summary。

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

1. 界面是多层协作#

原生前端管理菜单/HUD 状态、输入、数据和资源;Scaleform GFx 承担大量 movie 的布局与执行;文本层加载本地化字符串、格式和字体;脚本可以驱动特定菜单、手机和活动界面。不能因为目录有 html/ 就把整个 UI 视为现代浏览器应用。

NewHud.h 明确说明管理 Scaleform-based HUD。PauseMenu、MiniMap、WeaponWheel、MobilePhone、LoadingScreens、WarningScreen、SocialClubMenu 和 VideoEditor 又分别对应不同流程与数据来源。

2. 从数据到显示#

调用、资源就绪、movie 执行和绘制是不同阶段。UI 已请求显示不意味着纹理和本地化内容都已加载,movie 方法已排队也不意味着返回值立即可读。

3. Scaleform 的线程协议#

ScaleformMovieStruct 将字段分为三类:两线程都修改的字段使用 CDblBuf;状态控制下安全共享且稳定的字段保存 movie ID/filename/state;另有 update-thread-only 与 render-thread-only 字段。

位置、旋转、大小、scale mode、亮度和 3D 显示相关字段都可双缓冲。requested textures 归更新线程,当前 timestep 和 dependent movie 等归渲染线程。这是明确的所有权约束,不能把整个 struct 当作可任意线程访问的 UI 配置。

CScaleformMgr 有两组 method invoke buffer、待处理调用/回调查询、返回值槽、flush token 和 complex object 释放。关闭 UI 时不只删除 movie,还要考虑尚未执行的 invokes、回调与共享资产,避免方法落到已销毁目标。

4. UI 资源与世界显示#

movie 可以请求纹理,ScaleformMovieTxd::AlreadyLoaded 的注释要求使用专用判断,因为一般 streamingRequest 的 HasLoaded 与 downloadable texture manager 组合存在差异。资源接口的正确用法比“统一调用 HasLoaded”更重要。

movie owner tag、parent/dependent movie 和共享资产字段表达归属与复用。3D movie、UIWorldIcon、HudMarker、MiniMapRenderThread 和命名 render target 将 UI 延伸到世界空间/独立纹理目标,不能把所有 UI 当成最终帧上的一个平面 overlay。

小地图还涉及地图数据、图标、路线和专用渲染;HUD 消费 wanted、health 等游戏规则结果。调试显示错误时先检查源数据,再检查 native-to-movie 参数,最后检查资源和绘制阶段。

5. 输入、暂停和前端状态#

UIContexts、frontend/input、ControllerLabelMgr、KeyMappingMenu 与系统输入管理协作。界面需要决定输入由菜单、手机、聊天、文本框还是玩法消费;显示正确按键图标又依赖当前设备和映射。

CGame 为正常世界、前端、暂停和商城等注册不同更新集合,因此打开暂停菜单不一定让所有子系统停止。网络、存储、音频、界面动画或异步资源仍可能推进;应核对具体模式而不是假设一个全局暂停布尔控制一切。

WarningScreen 被安排在部分更新路径末端,使代码和脚本产生的警告能够随后显示。这类顺序也是界面正确性的一部分,不能随意把更新移到任意帧位置。

6. 本地化与文本块生命周期#

CTextFile 通过 hash/key 查找文本,管理基础文本、additional text slots、DLC/patch 来源与额外文本文件。LoadAdditionalText 和 HasThisAdditionalTextLoaded 表明任务/模块文本可以按需加载。

返回的文本字符串与所属 block 关联,接口能查询最近返回字符串来自哪个块。调用方若保存指针,需要考虑文本块卸载或语言变化;持久引用不应假定始终指向有效内存。

CText、TextFormat、TextConversion、TextDraw、FontDef 和 TextFontStore 分担语言判断、格式、转换、布局与字体。多语言问题不仅是翻译缺失,还可能是字体覆盖、宽度/换行、控制符和动态参数格式。

PagedCloudText 还含 CloudListener、请求 ID、重试计时和结果码,说明部分文本来自异步在线内容;不能把所有文本加载都等同于本地 GXT 文件读取。

7. apps 的实际含义#

apps/appdata 提供 CAppDataBlock、CAppData、request manager 与 CloudListener 请求。它是游戏应用数据支持,不是 CApp 主循环,也不能仅凭名字认为包含独立手机操作系统。

这部分与界面/脚本及在线内容连接。消费云端数据时,应区分未请求、进行中、失败和已完成,且 UI 关闭后仍可能有回调返回。

8. 维护与源码依据#

关键检查包括语言/设备切换、movie 未加载时调用、关闭时仍有 callback、文本槽卸载、共享纹理释放、暂停和联网提示交叉。本报告未运行 GFx 或界面流程,UI 资产的具体布局与 ActionScript 行为仍依赖资源内容。

源码重点
NewHud.hHUD 更新和游戏状态接口
ScaleFormMgr.h双缓冲、线程归属、invokes、纹理状态
PauseMenu.h前端菜单入口
TextFile.hhash 查找、文本块和按需加载
text.h文本与语言/字体门面
PagedText.h异步云文本
appdata.h应用数据与请求管理

关联:系统、渲染、脚本、网络。