rline:Rockstar 在线服务层(ROS、Presence、Matchmaking、Cloud、Social Club、Telemetry 与平台抽象)
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/.cpp | rlInit/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_SESSION | 32 | rl.h:209 |
RL_MAX_MATCHING_ATTRS / RL_MAX_MATCHING_CONDITIONS | 8 / 32 | rl.h:226-230 |
| 匹配属性名/过滤器名最大长度 | 24(含结尾 0) | rl.h:220-224 |
| QoS 用户数据 / 会话用户数据 / data-mine | 512 / 256 / 128 字节 | rl.h:232-239 |
一次查找/查询的会话上限 RL_FIND_SESSIONS_MAX_SESSIONS_TO_FIND | 20 | rl.h:241-244 |
RGSC SDK 固定玩家索引 RL_RGSC_GAMER_INDEX | 0 | rl.h:246-248 |
(表中 rl.h 位于 src/dev_ng/rage/base/src/rline/。)
身份类型#
| 类型 | 内容 | 证据 |
|---|---|---|
rlGamerHandle | 跨服务的玩家句柄,服务类型 SERVICE_XBL / SERVICE_NP / SERVICE_SC | rlgamerhandle.h:184-189 |
rlPeerInfo | rlPeerAddress(= netPeerAddress)+ 64 位 peer ID | rlpeerinfo.h:109-110、rlpeeraddress.h:13 |
rlGamerInfo | rlPeerInfo + rlGamerId + rlGamerHandle + 本地索引 + 显示名 | rlgamerinfo.h:344-352 |
rlSessionInfo | 平台会话句柄(XBL handle / PSN WebApi session/match id)、64 位 session ID、rlSessionToken、主机 rlPeerAddress | rlsessioninfo.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/GETsrc/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 服务为例)#
- 子类从
rlRosHttpTask派生,实现GetServiceMethod()、ProcessSuccess()/ProcessError()src/dev_ng/rage/base/src/rline/ros/rlroshttptask.h:342-412。 Configure(localGamerIndex | NO_LOCAL_GAMER, ...):可选择整包响应、parTreeXML 或 SAX 流式解析src/dev_ng/rage/base/src/rline/ros/rlroshttptask.h:289-323。- 通过
rlGetTaskManager()->AddParallelTask()/AppendSerialTask()入队;调用方轮询netStatus。 - 内容签名校验接口(
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、事件委托、NotifyInviteAcceptedsrc/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_ID | rlmatchingattributes.h:211-245 |
rlSessionFinder | 按过滤器异步查找会话(ONLINE 或 LAN;LAN 用带签名的广播查询/应答包) | rlsessionfinder.h:20-131 |
rlSessionManager | 本机所在/主持会话登记、LAN 匹配端口、QueryDetail(查询候选会话详情,可在足够结果后提前结束)、discriminator | rlsessionmanager.h:141-236 |
rlScMatchmaking | SC 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 服务#
| 类 | 职责 | 证据 |
|---|---|---|
rlSocialClub | SC Web 服务 API:SetLogin(localGamer, email, scAuthToken) 后 ROS 在后台按 TRC 自动登录并重试;链接已有 SC 账号到平台账号;清除登录 | socialclub/rlsocialclub.h:18-61 |
rlScAuth | SC 网页认证流程(SIGN_IN/SIGN_UP/LEGAL/UNLINK),全局 tunable 开关、link token 默认开启、构造 weblink/回调 URL | scauth/rlscauth.h:18-131 |
rlScFriends / rlFriendsManager / rlFriend | SC 好友与跨平台好友管理 | scfriends/rlscfriends.h:101、rlfriendsmanager.h:103 |
rlClan | 帮会(Crew)服务 | clan/rlclan.h:73 |
rlProfileStats | 服务端 profile stats 读写 | profilestats/rlprofilestats.h:79 |
rlInbox / rlFeed | SC 收件箱 / 动态流 | inbox/rlinbox.h:92、feed/rlfeed.h:131 |
rlScAchievements / rlScMembership / rlRosEntitlement | SC 成就 / 会员 / 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::Writesrc/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 |
| Xbox | g_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 |
| PC | g_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.h | DLL 通知(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、rlPcPipeUtility | rlpcpipe.* | 与 Rockstar Launcher 通信的管道(注释:需以 ASCII 通信)rlpcpipe.h:59-67 |
| Steam | steam/rlsteam.* | 仅 RSG_PC && __STEAM_BUILD | steam/rlsteam.h:12-13;Steam 票据通过 IRgsc V4 的 SetSteamAuthTicket 交给 DLL |
| Epic | g_SysEpic → rlPc::OnEpicEvent | rlpc.cpp | EPIC_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,每个版本递增追加方法:V1Init/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_uisrc/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 | 平台系统 UI | rlsystemui.h:201 |
rlAchievement、rlStats、rlSchema | 成就、排行榜统计、统计 schema | rlachievement.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文件清单,代表性调用点未逐一核对。