CD Code Digest Hub /GTA V · v2

rline:Rockstar 在线服务层(ROS、Presence、Matchmaking、Cloud、Social Club、Telemetry 与平台抽象)

57 分钟阅读 14 个章节 1 张图

rage/base/src/rline(日志通道 rline,约 21 万行)是游戏与“非 P2P”在线服务之间的客户端库:Rockstar Online Services(ROS)的 HTTP Web 服务、presence 服务器、Social Club 账户、云存储、matchmaking、遥测,以及 PSN/XBL/PC(Social Club DLL)/Steam/Epic 等平台服务的统一抽象。P2P 传输见 net-transport-and-connections.md;会话层(snSession、CNetworkSession)如何调用这里的 matchmaking/presence 见 network-sessions-and-transitions.md;游戏侧的 CLiveManager、云文件、Tunables、商城等封装见 live-cloud-commerce-social.md。

本页按“服务 → 主要类 → 调用模式 → 游戏使用位置”组织。

安全边界:ROS 凭据、票据、签名、HTTP 负载加密、服务端点、环境地址、白盒密钥头文件等只写“存在 / 名称 / 作用 / 位置”。不写任何具体值、协议细节或可用于攻击服务的信息。rage/suite/src/rgsc 根目录下存在证书与口令类文件,本 Wiki 未读取也不引用其内容。

相关源码文件#

路径(相对 src/dev_ng/rage/)作用
base/src/rline/rl.h/.cpprlInit/rlUpdate/rlShutdown、全局常量(RL_MAX_*)、任务管理器入口 rlGetTaskManager()
base/src/rline/rltask.h/.cpp、rlhttptask.*、rlworker.*异步任务框架、HTTP 任务基类、后台 worker
base/src/rline/ros/*rlRos、rlRosClient(每本地玩家登录状态)、rlRosHttpTask、凭据/票据任务、rlRosCredentials、rlRosTitleId
base/src/rline/rlpresence.*、scpresence/*、presence/rlpresencequery.*平台无关 presence API、SC presence 服务器实现、presence 查询
base/src/rline/rlsession*.*、rlmatchingattributes.*、rlqos.*、scmatchmaking/*rlSession、rlSessionInfo、rlSessionManager、rlSessionFinder、匹配属性/过滤器、SC matchmaking
base/src/rline/cloud/*、cloudsave/*、ugc/*、userstorage/*、rltitlestorage.*云文件(成员/帮会/UGC/标题/全局命名空间)、云存档、UGC 内容
base/src/rline/socialclub/*、scauth/*、scfriends/*、scachievements/*、scmembership/*、clan/*、inbox/*、feed/*、profilestats/*Social Club 账户与社交服务
base/src/rline/rltelemetry.*在线遥测(指标缓冲、采样、提交任务)
base/src/rline/rlnp*.*、rlxbl.*、durango/*、rlpc.*、rlpcpipe.*、steam/*平台抽象:PSN、XBL(360 与 Durango)、PC Social Club DLL、Launcher 管道、Steam
base/src/rline/entitlement*/*、savemigration/*、youtube/*、livestream/*、facebook/*、unlocks/*、webservices/*、deprecated/*权益、存档迁移、视频/直播、Facebook、旧接口
suite/src/rgsc/rgsc/rgsc/public_interface/*Social Club SDK(IRgsc 等 COM 风格版本化接口)
suite/src/telemetry/*RAD Telemetry 性能分析器集成(与在线遥测无关)

生命周期与总体结构#

rlInit 装配顺序#

rlInit(allocator, skt, titleId, minAgeRating) 只能调用一次:保存全局分配器 g_rlAllocator、主套接字 g_rlSkt、title ID,初始化全局 rlTaskManager,然后依次:环境初始化(命令行选择开发/认证/生产环境)→ title ID → HTTP 代理/Fiddler 调试代理 → 平台层(Durango: g_rlXbl.Init;NP: g_rlNp.Init;PC 非 DLL: g_rlPc.Init,失败也允许游戏继续)→ rlRos::InitClass → rlScAchievements/rlScMatchmaking(非 DLL)→ rlCloud → rlScPresence(SC_PRESENCE)→ rlPresence → rlFacebook(可选)→ rlPrivileges → rlScFriends → rlFriendsManager → rlLiveStream → 权益(PC 非 DLL 用 rlRosEntitlement,否则可选 V1)→ rlScMembership(可选)→ 非 DLL: rlClan、rlSessionManager;DLL: rlCloudSave → AutoIdInit();任何一步失败则 rlShutdown() src/dev_ng/rage/base/src/rline/rl.cpp:467-573。

rlUpdate() 每帧先更新任务管理器,再更新平台层、rlCloud、rlScMatchmaking、rlRos、rlTelemetry、rlScPresence、rlPresence、rlPrivileges、权益、会员、好友、直播、rlClan、rlSessionManager;-norlupdate 可整体关闭 src/dev_ng/rage/base/src/rline/rl.cpp:575-664。游戏中 CLiveManager 在 netInit 之后用主套接字调用 rlInit,并在每帧 netUpdate() 之后调用 rlUpdate() src/dev_ng/game/network/Live/LiveManager.cpp:874、src/dev_ng/game/network/Live/LiveManager.cpp:1687-1693。rline 的内存来自 CLiveManager 的 rline 堆(sm_RlineAllocator,非 Final 可用 -rlineHeapSize 调整)src/dev_ng/game/network/Live/LiveManager.cpp:461-481。

同一份 rline 编译两次:游戏 vs Social Club DLL#

rline 既编进游戏,也编进 PC 的 Social Club DLL(宏 __RGSC_DLL)。SC_PRESENCE = __RGSC_DLL || !RSG_PC:在主机上 rlPresence 直接由 rlScPresence 实现;在 PC 游戏中 rlPresence 的调用由 Social Club DLL 服务,而 DLL 内部再调用 rlScPresence src/dev_ng/rage/base/src/net/net.h:109-119。rlInit 中大量 #if !__RGSC_DLL 分支即源于此(例如 matchmaking、clan、session manager 只在游戏侧初始化)。DLL 中的 rlRosClient 在拿到新票据后会调用 GetRgscConcreteInstance()->HandleNotification(rgsc::NOTIFY_ROS_TICKET_CHANGED, ...) src/dev_ng/rage/base/src/rline/ros/rlrosclient.cpp:345-354,游戏侧 rlPc 则通过 rgsc::NOTIFY_* 回调接收(见平台抽象)。

关键全局常量#

常量值证据
RL_MAX_GAMERS_PER_SESSION32rl.h:209
RL_MAX_MATCHING_ATTRS / RL_MAX_MATCHING_CONDITIONS8 / 32rl.h:226-230
匹配属性名/过滤器名最大长度24(含结尾 0)rl.h:220-224
QoS 用户数据 / 会话用户数据 / data-mine512 / 256 / 128 字节rl.h:232-239
一次查找/查询的会话上限 RL_FIND_SESSIONS_MAX_SESSIONS_TO_FIND20rl.h:241-244
RGSC SDK 固定玩家索引 RL_RGSC_GAMER_INDEX0rl.h:246-248

(表中 rl.h 位于 src/dev_ng/rage/base/src/rline/。)

身份类型#

类型内容证据
rlGamerHandle跨服务的玩家句柄,服务类型 SERVICE_XBL / SERVICE_NP / SERVICE_SCrlgamerhandle.h:184-189
rlPeerInforlPeerAddress(= netPeerAddress)+ 64 位 peer IDrlpeerinfo.h:109-110、rlpeeraddress.h:13
rlGamerInforlPeerInfo + rlGamerId + rlGamerHandle + 本地索引 + 显示名rlgamerinfo.h:344-352
rlSessionInfo平台会话句柄(XBL handle / PSN WebApi session/match id)、64 位 session ID、rlSessionToken、主机 rlPeerAddressrlsessioninfo.h:226-239

rlSessionToken 标识“主机 + 会话”组合,主机迁移后会变;session ID 不变 src/dev_ng/rage/base/src/rline/rlsessioninfo.h:93-104。rlSessionInfo 有专门的“NP presence 导出”去掉部分 netPeerAddress 数据以压到 128 字节以内,以及“清除不应公开到 presence/matchmaking 的数据”的方法 src/dev_ng/rage/base/src/rline/rlsessioninfo.h:140-159。

异步任务框架:rlTaskBase / rlTaskManager / rlHttpTask#

几乎所有在线操作都是“返回 bool 表示是否成功发起 + 通过 netStatus* 轮询结果”的异步 API,内部实现为任务。

  • rlTaskBase:状态 STATE_CONFIGURED → STATE_STARTED → STATE_FINISHED,完成类型 FINISH_FAILED/SUCCEEDED/CANCELED,关闭行为 CANCEL_ON_SHUTDOWN/EXECUTE_ON_SHUTDOWN;子类重写 Configure(..., netStatus*)、Start()、Update(timeStep)、Finish() src/dev_ng/rage/base/src/rline/rltask.h:131-177、src/dev_ng/rage/base/src/rline/rltask.h:795-815。rlTask<CTX> 为带上下文对象的模板子类 src/dev_ng/rage/base/src/rline/rltask.h:846-872。
  • rlTaskManager:维护并行与串行两组任务;串行任务需等其前面的串行任务完成;通过 CreateTask() 创建并入队的任务完成后自动删除 src/dev_ng/rage/base/src/rline/rltask.h:874-928。全局实例经 rlGetTaskManager() 获取 src/dev_ng/rage/base/src/rline/rl.h:665。“发后即忘”任务用 rlFireAndForgetTask<T>(内嵌 netStatus,取消需用任务 ID)src/dev_ng/rage/base/src/rline/rltask.h:103-122。
  • rlHttpTask(继承 rlTaskBase):内含一个 netHttpRequest、接收 datGrowBuffer、可选 SAX 解析器;子类实现 UseHttps()、GetSslCtx()、GetUrlHostName()、GetServicePath()、ProcessResponse();提供 AddStringParameter/AddIntParameter/多段表单/列表参数/请求头等帮助函数 src/dev_ng/rage/base/src/rline/rlhttptask.h:93-238。Configure(rlHttpTaskConfig*) 只支持 POST/PUT/GET src/dev_ng/rage/base/src/rline/rlhttptask.cpp:822-830;Update 在离线时以 FINISH_CANCELED 结束,并以流方式把响应喂给 SAX 解析器或缓冲区 src/dev_ng/rage/base/src/rline/rlhttptask.cpp:939-999。同文件还有下载、文件大小、视频/照片 CDN 上传等专用任务 src/dev_ng/rage/base/src/rline/rlhttptask.h:242-720。
  • rlWorker:通用后台线程,Wakeup() 唤醒 src/dev_ng/rage/base/src/rline/rlworker.h:16-30。

证据:rlHttpTask : public rlTaskBase 与 netHttpRequest m_HttpRequest src/dev_ng/rage/base/src/rline/rlhttptask.h:93、src/dev_ng/rage/base/src/rline/rlhttptask.h:220;rlRosHttpTask : public rlHttpTask、rlRosJsonHttpTask : public rlHttpTask src/dev_ng/rage/base/src/rline/ros/rlroshttptask.h:278、src/dev_ng/rage/base/src/rline/ros/rlroshttptask.h:429;票据/地理位置任务 src/dev_ng/rage/base/src/rline/ros/rlroscredtasks.h:109-188、src/dev_ng/rage/base/src/rline/ros/rlroscredtasks.h:554;遥测提交任务 src/dev_ng/rage/base/src/rline/rltelemetry.cpp:128;两组任务 src/dev_ng/rage/base/src/rline/rltask.h:874-928。

底层 netHttpRequest、netTcp、netTask2 线程池见 net-transport-and-connections.md。

ROS(Rockstar Online Services)#

主要类#

类职责证据
rlRos(全静态)每本地玩家登录状态、凭据访问、特权查询、ROS 事件分发、服务主机/SSL 服务表、地理位置与 presence 服务器信息ros/rlros.h:21-152
rlRosClient单个本地玩家的登录状态机,按 TRC 要求自动获取/刷新凭据ros/rlrosclient.h:22-90
rlRosCreateTicket*Task按平台创建 ROS 票据(XBL、NP、Steam、SC 认证令牌、SC 等变体)ros/rlroscredtasks.h:163-440
rlRosHttpTask / rlRosJsonHttpTask调用 ROS Web 服务的基类:拼 URL、解析标准成功/错误响应;在本地玩家上下文中遇到票据认证失败时自动作废该玩家票据ros/rlroshttptask.h:269-429
rlRosHttpFilter作为 netHttpFilter 对 ROS 请求/响应负载做加解密(只写存在)ros/rlroshttptask.h:97-120
rlRosServiceAccessTokenStore服务访问令牌缓存(RLROS_USE_SERVICE_ACCESS_TOKENS 时)ros/rlrosserviceaccesstokenstore.h:19

(表中路径相对 src/dev_ng/rage/base/src/rline/。)

登录状态与凭据(概念)#

rlRosLoginStatus:INVALID → NEED_PLATFORM_CREDENTIALS(需先登录 XBL/PSN,或在 SC 平台上 rlSocialClub::SetLogin())→ COUNTING_DOWN(登录尝试被节流)→ IN_PROGRESS → ONLINE(此时 rlRos::GetCredentials() 有效)src/dev_ng/rage/base/src/rline/ros/rlroscommon.h:87-108。

rlRos::UpdateClass 每帧:确保已向 rlPresence 注册监听 → 更新每个 rlRosClient → 计算“任一玩家在线”的边沿 → 更新地理位置与(SC_PRESENCE 时)presence 服务器信息 → 更新服务访问令牌存储 src/dev_ng/rage/base/src/rline/ros/rlros.cpp:334-371。rlRosClient::Update 内部只有两个状态 STATE_COUNTDOWN/STATE_REFRESH_PENDING:平台凭据变化时作废 ROS 凭据并重置倒计时;倒计时到期且平台凭据有效时,把刷新任务作为并行任务加入 rlGetTaskManager(),失败则退避重试;成功后 SetCredentials src/dev_ng/rage/base/src/rline/ros/rlrosclient.cpp:238-354。rlRos::SetCredentials 注释明确唯一合法的游戏用途是 SC UI 返回的凭据,否则可能无法通过 ROS 认证 src/dev_ng/rage/base/src/rline/ros/rlros.h:126-141。

ROS 事件(AutoId,RLROS_EVENT_DECL):在线状态变化、链接变化、获取地理位置、获取 presence 信息、获取 NAT 发现服务器、获取凭据结果、可读成就 src/dev_ng/rage/base/src/rline/ros/rlroscommon.h:167-198。NAT 检测的状态机以“等待 ROS 在线 → 获取服务器列表”开头(见传输页 netNatDetector),推断它依赖这里的 NAT 发现服务器事件(未追踪到具体回调)。

特权#

rlRosPrivilegeId 是固定 ID 的服务端特权(注释:服务端强制,客户端仅用于展示/预判),涵盖创建票据、写 profile stats、云存储读写、帮会、presence 写、UGC 写、购买/转移虚拟货币、下注、Creator、云 tunables 下载、评论、访问游戏服务器等,也包含账号状态类特权(如封禁)src/dev_ng/rage/base/src/rline/ros/rlroscommon.h:110-143。游戏通过 rlRos::HasPrivilege(localGamerIndex, privilegeId) 查询 src/dev_ng/rage/base/src/rline/ros/rlros.h:143-152。注意源码中 CLOUD_STORAGE_READ/WRITE 两行的注释与枚举名互相颠倒(注释写反)。

调用模式(以 ROS Web 服务为例)#

  1. 子类从 rlRosHttpTask 派生,实现 GetServiceMethod()、ProcessSuccess()/ProcessError() src/dev_ng/rage/base/src/rline/ros/rlroshttptask.h:342-412。
  2. Configure(localGamerIndex | NO_LOCAL_GAMER, ...):可选择整包响应、parTree XML 或 SAX 流式解析 src/dev_ng/rage/base/src/rline/ros/rlroshttptask.h:289-323。
  3. 通过 rlGetTaskManager()->AddParallelTask()/AppendSerialTask() 入队;调用方轮询 netStatus。
  4. 内容签名校验接口(VerifySignature 等)供云文件等验证服务器返回内容 src/dev_ng/rage/base/src/rline/ros/rlroshttptask.h:238-262(只写存在)。

Presence(在线状态、属性与消息)#

主要类#

  • rlPresence(全静态,平台无关门面):本地玩家签入/在线状态、名字/显示名/gamer handle/gamer info/年龄、好友数组同步、富状态字符串、presence 属性(Int/Double/String 的 Set/Get/Clear,以及查询他人属性 GetAttributesForGamer(s))、消息通道 Subscribe/Unsubscribe/Publish、事件委托、NotifyInviteAccepted src/dev_ng/rage/base/src/rline/rlpresence.h:670-1193。消息拉取默认延迟 2500 ms、一次最多 10 条 src/dev_ng/rage/base/src/rline/rlpresence.h:678-681。
  • rlScPresence:SC presence 服务器的实现(SignIn/SignOffline/SignOut/在线判定等,注释“由 rlPresence 调用”)src/dev_ng/rage/base/src/rline/scpresence/rlscpresence.h:440-490。它以 rlScAttributeId(名字 + 作用域)定义属性,其中包括 relay 地址相关的跨标题属性 src/dev_ng/rage/base/src/rline/scpresence/rlscpresence.cpp:61-62,并以 netRelay 的 presence ping 间隔判断陈旧 src/dev_ng/rage/base/src/rline/scpresence/rlscpresence.cpp:1128。presence 服务器通信本身走 netRelay(同一主套接字),见传输页。

事件#

PRESENCE_EVENT_*:网络状态变化、peer 地址变化、签入状态变化、资料变化、离线时接受邀请、邀请不可用、接受邀请、经 presence 加入、收到邀请/派对邀请、平台游戏会话就绪、收到消息、派对变化/成员可用/会话无效、SC 消息、在线权限无效/变化、静音列表变化、Play Together 主机 src/dev_ng/rage/base/src/rline/rlpresence.h:61-140。每个事件类用 PRESENCE_EVENT_DECL(AutoId)声明 src/dev_ng/rage/base/src/rline/rlpresence.h:142-148。

调用模式与游戏使用位置#

  • 隧道发现 relay 地址:netTunneler 用 rlPresence::GetAttributesForGamer 读取对端 peer 地址属性(见传输页)。
  • 会话发布与邀请:CNetworkSession、InviteMgr、NetworkGamerAttributes、NetworkRichPresence、NetworkSCPresenceUtil 等设置属性/富状态并处理邀请事件;GamePresenceEventDispatcher/GamePresenceEvents 把 presence 消息转换为游戏事件(如 SC 服务端推送)。这些游戏侧类位于 game/network/{Live,SocialClubServices,Sessions},见 live-cloud-commerce-social.md 与 network-sessions-and-transitions.md。(使用文件清单由 rg -l "rlPresence::" 得到,未逐一阅读。)

会话发现与 Matchmaking#

主要类#

类职责证据
rlSession平台会话对象:Host(localGamerIndex, netMode, maxPublicSlots, maxPrivateSlots, attrs, flags, status) 等;无公共槽位的会话是私有会话,不上 matchmaking、不占服务器资源;有公共槽位的会话匹配属性不能为空rlsession.h:29-92
rlMatchingAttributes游戏类型、游戏模式 + 最多 8 个用户属性(ID/名/值,m_AttrMask 表示非空)rlmatchingattributes.h:22-208
rlMatchingFilter基于已发布属性的过滤条件;有 INVALID_FILTER_ID 与 AD_HOC_FILTER_IDrlmatchingattributes.h:211-245
rlSessionFinder按过滤器异步查找会话(ONLINE 或 LAN;LAN 用带签名的广播查询/应答包)rlsessionfinder.h:20-131
rlSessionManager本机所在/主持会话登记、LAN 匹配端口、QueryDetail(查询候选会话详情,可在足够结果后提前结束)、discriminatorrlsessionmanager.h:141-236
rlScMatchmakingSC matchmaking 服务:Advertise(返回 SC match id)、Update、Find、Unadvertise(All);会话 ID 在主机迁移中不变scmatchmaking/rlscmatchmaking.h:78-181
rlQos向 peer 查询 QoS(对方须注册了该会话)rlqos.h:58-68

(表中路径相对 src/dev_ng/rage/base/src/rline/。)

调用模式#

查找会话的典型流程(推断自上述 API 注释与参数,未逐行追踪内部任务链):rlSessionFinder 的查找接口接收 localGamerIndex, netMode, channelId, numGamers, filter, results, maxResults, numResultsBeforeEarlyOut → 在线时由 SC matchmaking 返回候选 rlSessionInfo → rlSessionManager::QueryDetail 对每个候选主机建立隧道并查询详情(注释提到“tunnel/host query results”与提前结束;RL_MSG_SEARCH_REQUEST 在全局消息 ID 表中)→ 填充 rlSessionDetail → 游戏挑选并加入。参数说明见 src/dev_ng/rage/base/src/rline/rlsessionfinder.h:114-131、src/dev_ng/rage/base/src/rline/rlsessionmanager.h:188-234。CNetwork::Init 用游戏套接字端口设置 LAN 匹配端口 src/dev_ng/game/network/Network.cpp:1746。

游戏使用位置:rlSessionManager:: 仅在 game/network/Sessions/NetworkSession.cpp、Network.cpp、Live/InviteMgr.cpp 中出现;rlScMatchmaking:: 仅在 Network.cpp、Live/livemanager.cpp 中出现(rg -l 结果)。游戏自己的 matchmaking 组织(NetworkGameConfig、匹配属性 schema、查询类型)见 network-sessions-and-transitions.md。

Cloud(云文件)#

rlCloud(全静态)按命名空间访问云文件:RL_CLOUD_NAMESPACE_MEMBERS / CREWS / UGC / TITLES / GLOBAL src/dev_ng/rage/base/src/rline/cloud/rlcloud.h:30-37。接口包括 GetMemberFile/PostMemberFile/DeleteMemberFile、WatchMemberItem/WatchCrewItem(rlCloudWatcher 委托接收变更通知)、GetTitleFile/HeadTitleFile、GetGlobalFile、GetCrewFile、GetUgcFile、CreateUrl,以及云内容签名校验 src/dev_ng/rage/base/src/rline/cloud/rlcloud.h:240-658。另有 fiDeviceCloud : fiDevice,把云命名空间包装成 RAGE 文件设备;TITLES 命名空间不能创建/追加文件 src/dev_ng/rage/base/src/rline/cloud/rlcloud.h:718-798。

游戏使用:game/network/Cloud/CloudManager.cpp(统一云请求队列与缓存)、NetworkInterface.cpp、Live/NetworkTelemetry.cpp、Crews/NetworkCrewMetadata.cpp、SaveLoad/savegame_cloud.cpp、scene/ExtraContent.cpp、script/commands_datafile.cpp 等(rg -l 结果)。Tunables 等基于云文件的系统见 live-cloud-commerce-social.md。UGC(rlUgc)由 game/network/Cloud/UserContentManager.cpp、UGCQueryHelper.cpp 使用 src/dev_ng/rage/base/src/rline/ugc/rlugc.h:21。

Social Club 服务#

类职责证据
rlSocialClubSC Web 服务 API:SetLogin(localGamer, email, scAuthToken) 后 ROS 在后台按 TRC 自动登录并重试;链接已有 SC 账号到平台账号;清除登录socialclub/rlsocialclub.h:18-61
rlScAuthSC 网页认证流程(SIGN_IN/SIGN_UP/LEGAL/UNLINK),全局 tunable 开关、link token 默认开启、构造 weblink/回调 URLscauth/rlscauth.h:18-131
rlScFriends / rlFriendsManager / rlFriendSC 好友与跨平台好友管理scfriends/rlscfriends.h:101、rlfriendsmanager.h:103
rlClan帮会(Crew)服务clan/rlclan.h:73
rlProfileStats服务端 profile stats 读写profilestats/rlprofilestats.h:79
rlInbox / rlFeedSC 收件箱 / 动态流inbox/rlinbox.h:92、feed/rlfeed.h:131
rlScAchievements / rlScMembership / rlRosEntitlementSC 成就 / 会员 / PC 权益scachievements/rlscachievements.h:91、scmembership/rlscmembership.h:20、entitlement/rlrosentitlement.h:229
rlLiveStream、rlFacebook,以及 youtube/、savemigration/ 中的服务直播(含 Twitch)、Facebook、视频上传、存档迁移livestream/rllivestream.h:122、facebook/rlfacebook.h:28

(表中路径相对 src/dev_ng/rage/base/src/rline/。)

游戏使用:game/network/Live/SocialClubMgr.cpp、NetworkClan.cpp、Crews/*、SocialClubServices/*(收件箱/邮件/动态)、frontend/SocialClubMenu.cpp、system/EntitlementManager.cpp(rlRosEntitlement)等,见 live-cloud-commerce-social.md。存档迁移见 ../19-persistence-replay/save-migration.md。

在线遥测:rlTelemetry#

遥测只描述管线架构。哪些指标被用于反作弊/风控分析不在本 Wiki 范围内。

  • 指标定义:rlMetric 子类实现 Write(RsonWriter*),指定日志通道、日志级别、采样模式;常用 RL_DECLARE_METRIC(name, ...) 宏声明 src/dev_ng/rage/base/src/rline/rltelemetry.h:746、src/dev_ng/rage/base/src/rline/rltelemetry.h:815-846。
  • 写入:rlTelemetry::Write(localGamer, metric) 追加到常规缓冲,满了即 Flush();WriteImmediate 写入“即时”缓冲,几秒内刷新,近实时;另有 deferred 缓冲。三类缓冲按本地玩家分槽(sm_GamerSlots/sm_ImmediateGamerSlots/sm_DeferredGamerSlots)src/dev_ng/rage/base/src/rline/rltelemetry.h:1088-1118、src/dev_ng/rage/base/src/rline/rltelemetry.cpp:2091-2094。
  • 过滤与采样:ShouldSendMetric 根据日志通道级别、采样模式与服务器下发的 rlMetricConfig 决定是否发送;客户端配置经 RetrieveTelemetryClientConfig 获取、ApplyTelemetryClientConfig 应用,失败最多重试 3 次 src/dev_ng/rage/base/src/rline/rltelemetry.h:433-491、src/dev_ng/rage/base/src/rline/rltelemetry.h:1059-1086。
  • 提交:常规提交间隔最小且默认 3 分钟(注释 “DON'T CHANGE THIS!!!”),提交超时 20 s,11 个日志通道(RAGE 默认通道 10)src/dev_ng/rage/base/src/rline/rltelemetry.h:506-536。提交由 rlRosTelemetrySubmissionTask/rlRosTelemetryImmediateSubmissionTask(rlRosHttpTask 子类)完成 src/dev_ng/rage/base/src/rline/rltelemetry.cpp:128、src/dev_ng/rage/base/src/rline/rltelemetry.cpp:509。rlTelemetryStream 可额外把指标镜像到本地流(调试)src/dev_ng/rage/base/src/rline/rltelemetry.h:701。
  • 游戏使用:game/network/Live/NetworkTelemetry.cpp(CNetworkTelemetry,游戏指标集中定义与写入)、NetworkDebugTelemetry.cpp、Bandwidth/NetworkBandwidthManager.cpp、Stats/StatsSavesMgr.cpp、script/commands_money.cpp。底层 net 也直接写遥测(如隧道结果 rlTelemetry::Write src/dev_ng/rage/base/src/net/tunneler.cpp:771)。

不要混淆:rage/suite/src/telemetry/ 是 RAD Game Tools Telemetry 性能分析器的集成(telemetry_rage.h 中的 TelemetryInit/Start/Stop/Update、gpu_d3d11.cpp 等 GPU 区段插件),仅在 USE_TELEMETRY = !RSG_PS3 && !__FINAL && !__RESOURCECOMPILER 时启用,否则这些函数被宏替换为空 src/dev_ng/rage/suite/src/telemetry/telemetry_rage.h:4-29、src/dev_ng/rage/base/src/profile/telemetry.h:4。它属于性能剖析工具链,相关内容见 ../02-rage-core/system-and-diagnostics.md。

平台抽象#

平台全局对象 / 类文件说明
PlayStation (RSG_NP)g_rlNp (rlNp)rlnp.h 及 rlnp*.cpp(auth、basic、matching、party、trophy、webapi、activity feed、title user storage、in-game message、profanity、commondialog…)rlnp.h:10、rlnp.h:140、rlnp.h:501;Orbis 上 rlInit 结束时设置内容年龄限制 rl.cpp:562-564
Xboxg_rlXbl (rlXbl)rlxbl.*、rlxhttp.*、rlxlsp.*(360 时代)、durango/rlxbl*_interface.h(achievements、commerce、party、players、presence、privileges、profiles、real-time activity、sessions、system UI、user statistics…)rlxbl.h:61、rlxbl.h:903
PCg_rlPc (rlPc)rlpc.*加载 Social Club DLL(LoadDll,可 -noSocialClub 禁用),取得 IRgsc 接口并挂接 D3D present/设备丢失回调供 SC 叠加层渲染,创建与 Launcher 通信的 rlPCPipe;对外提供 GetAchievementManager/PlayerManager/PresenceManager/CommerceManager/ProfileManager/.../PatchingInterface 等访问器 rlpc.cpp:1809-1897、rlpc.cpp:2104-2200
PC 事件rlPcEvent*rlpc.hDLL 通知(rgsc::NOTIFY_SIGN_IN_STATE_CHANGED、ROS_TICKET_CHANGED、FRIEND_STATUS_CHANGED、SOCIAL_CLUB_EVENT、GAME_INVITE_ACCEPTED、JOINED_VIA_PRESENCE、FATAL_ERROR、UI_EVENT、REFRESH_STEAM_AUTH_TICKET、ENTITLEMENT_EVENT、CLOUD_SAVE_ENABLED_UPDATED…)被转换为 rlPcEvent 派发 rlpc.h:77-188、rlpc.cpp:385-517
Launcher 管道rlPCPipe、rlPcPipeUtilityrlpcpipe.*与 Rockstar Launcher 通信的管道(注释:需以 ASCII 通信)rlpcpipe.h:59-67
Steamsteam/rlsteam.*仅 RSG_PC && __STEAM_BUILDsteam/rlsteam.h:12-13;Steam 票据通过 IRgsc V4 的 SetSteamAuthTicket 交给 DLL
Epicg_SysEpic → rlPc::OnEpicEventrlpc.cppEPIC_API_SUPPORTED 时把 Epic 访问令牌/玩家名/账号 ID 转交给 IRgsc rlpc.cpp:191-225、rlpc.cpp:1890-1892

(表中路径相对 src/dev_ng/rage/base/src/rline/。)

游戏中平台对象直接被大量前端/系统代码引用(g_rlNp 约 30 个文件、g_rlPc 约 27 个文件,含 Core/game.cpp、Core/app.cpp、frontend/PauseMenu.cpp、system/ControlMgr.cpp 等),说明平台抽象并不完全由 rline 门面封装(基于 rg -l 计数)。

Social Club SDK:rage/suite/src/rgsc#

目录组成:rgsc/(DLL 核心与公共接口)、rgsc_ui/(SC 叠加 UI、手柄)、cef/、cef32/(Chromium Embedded Framework 集成)、ipc/、subprocess/(CEF 子进程与进程间通信)、installer/、builder/、sdk_build_tools/、documentation/(Doxygen)、thirdparty/、rockstar_chrome_patches/(目录清单)。

  • 公共接口为 COM 风格:IRgsc : IRgscUnknown,QueryInterface(riid) 获取版本化接口 IRgscV1…V10,每个版本递增追加方法:V1 Init/Shutdown/Update 与成就/资料/文件系统/UI 管理器;V2 增加配置参数、玩家(好友)、任务、presence、commerce 管理器;V3 文件委托;V4 Steam 票据;V5 遥测与崩溃通知…… src/dev_ng/rage/suite/src/rgsc/rgsc/rgsc/public_interface/rgsc_interface.h:27-156。接口文档注释以 rlpc.cpp/rlpc.h 为示例(同上 52-54 行)。其他接口头:achievements_interface.h、cloudsave_interface.h、commerce_interface.h、configuration_interface.h、network_interface.h、pad_interface.h、presence_interface.h、profiles_interface.h、rgsc_ui_interface.h、telemetry_interface.h、titleid_interface.h 等。
  • DLL 实现:class Rgsc : public IRgscLatestVersion, ...,全局 GetRgscConcreteInstance() src/dev_ng/rage/suite/src/rgsc/rgsc/rgsc/rgsc.h:56、src/dev_ng/rage/suite/src/rgsc/rgsc/rgsc/rgsc.h:341;它组合 achievements、players、filesystem、cloudsave、commerce、presence、profiles、gamerpics、steam、metadata、mfa、network、tasks、telemetry 与 rgsc_ui src/dev_ng/rage/suite/src/rgsc/rgsc/rgsc/rgsc.h:6-28。DLL 内部以 __RGSC_DLL 编译 rline(见上文)。
  • 本 Wiki 未展开 CEF/IPC/安装器;SC 前端菜单在游戏中的呈现见 ../18-frontend-ui/frontend-flows.md。

其他模块(简表)#

模块说明证据
rlPrivileges平台特权查询,rlUpdate 每帧更新rlprivileges.h:23
rlSystemUi平台系统 UIrlsystemui.h:201
rlAchievement、rlStats、rlSchema成就、排行榜统计、统计 schemarlachievement.h:182、rlstats.h:183、rlschema.h:32
rlProfanityCheck文本敏感词检查rlprofanitycheck.h:16
rlTitleStorage、rlUserStorage、rlPersistentStorage标题/用户/持久存储rltitlestorage.h:22、userstorage/rluserstorage.h:29、rlpersistentstorage.h:22
rlUnlocks解锁服务(rlInit 中被注释掉,未启用)unlocks/rlunlocks.h:67、rl.cpp:552
deprecated/旧接口(含 rockon RPC,使用 netRttp)目录清单(有意略过)
TFIT_*.h(rline 根目录与 entitlement/)白盒加密相关头文件只写存在,未阅读

(表中路径相对 src/dev_ng/rage/base/src/rline/。)

约束与边界行为#

  • 初始化顺序依赖:rline 依赖已 netInit 的 net 层与主套接字;rlRos 在 UpdateClass 中才惰性注册 presence 监听,因为 InitClass 时 rlPresence 可能尚未初始化 src/dev_ng/rage/base/src/rline/ros/rlros.cpp:340-346。
  • PC 上 SC DLL 缺失不致命:g_rlPc.Init() 只 rlVerify,不影响 success(src/dev_ng/rage/base/src/rline/rl.cpp:508-511);但随后依赖 DLL 的功能(presence、ROS 票据)不可用。
  • 离线即取消:rlHttpTask::Update 检测到离线会以 FINISH_CANCELED 结束任务。
  • 登录节流:ROS 登录失败按 netRetryTimer 退避(COUNTING_DOWN 状态),游戏 UI 需容忍“稍后再试”。
  • 私有会话不上 matchmaking:无公共槽位即私有;公共会话的匹配属性必须完整。

未决问题 / 证据不足#

  • rlScMatchmaking 查询协议、rlSessionManager::QueryDetail 的内部任务链、rlScPresence 与 presence 服务器的消息格式未逐行阅读。
  • rlNp/rlXbl 各子模块(WebAPI、会话、Real-Time Activity)只列出文件,未展开。
  • rgsc 的 CEF/IPC/子进程架构、rgsc_ui 渲染路径未分析。
  • 游戏使用位置主要来自 rg -l 文件清单,代表性调用点未逐一核对。