# 3DTank 架构模块调研 > 本文件内容全部由 `3DTank/names/module-graph.json` 的数据生成(一次性内联 node 命令,仓库不保留生成脚本);计数、依赖、分层均非手工绘制。 ## 1. 总览 - 模块总数:**126**(均为 webpack 代码模块;index.json 中其余条目是资源模块,不在本调研范围) - 按 Kind:游戏本体 **40** / Kotlin生态库 **22** / 第三方库 **64** - 依赖边总数:**533**;孤立模块(无出度且无入度):**3** 个 - 依赖层次最深(最长依赖链):**Level 17** ### 1.1 依赖与结构的抽取方法(覆盖率) - **依赖(DependsOn)**:取模块工厂第 3 个参数作为 webpack require(形如 `(t, n, i) => {` 里的 `i`),再扫描 `i()` 静态调用,且 id 必须命中已知代码模块 id 集合。**126/126 模块都执行了抽取**,其中 **97 个模块抽到 ≥1 条边(77%)**;**29 个模块 DependsOn 为空**,原因是:24 个模块工厂只有 1~2 个参数(编译产物里根本没有 require 参数),5 个模块有 require 参数但源码无静态 `i()` 调用(7793、14766、17323、55920、94965;其中 55920 用 `t.require(n)` 动态取模块,无法静态解析)。`index.json` 只含 id/type/path,**不含依赖信息**,故依赖全部来自源码扫描。 - **Kind**:按 dir.file 职责描述判定。职责点名可识别外部包/产品(React、ReactDOM、Scheduler、Sentry、qrcode、fflate、Emotion、underscore、inline-style-prefixer、prop-types、react-is、react-list、hoist-non-react-statics、@preact/signals-react、WebViewJavascriptBridge、Google Play Billing、Yandex Metrica、Dijkstra 库等)→ 第三方库;Kotlin/JS 编译出的通用基础设施(kotlin-stdlib、kotlinx.serialization、kotlinx.coroutines、atomicfu、ByteBuffer、DOM/CSS 构建器、RBuilder、Kotlin<->React 桥、kotlin-redux 框架核心、通用工具模块)→ Kotlin生态库;其余游戏业务逻辑(客户端、协议编解码、模型注册、UI/HUD、战斗、资源、音频、埋点、游戏引擎、启动入口)→ 游戏本体。规则表已写死为显式 id 列表,126 个模块全部命中、无默认兜底。 - **Anchors**:优先取字符串字面量(长度 3~90,滤掉 HTML/CSS 噪声词与纯符号/数字串,CSS 函数名如 `image-set(` 保留),按 `跨模块出现次数`(仅 1 个模块出现 +4、≤3 个 +2、>40 个 -4)+ `错误信息关键词`(not found / exception / invalid / failed / unknown 等 +5)+ `camelCase 标识符`(+4)打分取前 5;**字面量不足 3 个时**用该模块内出现次数少的高辨识度标识符(导出名 / 属性名,如 `getPositions`、`createRoot`)补齐,纯转发模块补转发目标 `i()`。仍有 6 个模块(17323、19074、29545、31584、58309、99295)没有任何可用锚点,其 `Anchors` 为空数组(不编造)。 - **顶层类/函数**:统计最浅缩进层的 `function NAME(` 声明(Kotlin/JS 产物会把函数声明提升到同一层);名称首字母大写计入 TopLevelClasses(Kotlin 类名 PascalCase,压缩后仍有大写开头,如 71105 中可见 `ResourceBatchLoadException`),其余计入 TopLevelFunctions。这是启发式口径,非精确语义。 ### 1.2 代码量分布(按字节 Top 20) | # | 模块 | 字节 | KB | Kind | |---|---|---|---|---| | 1 | `module_82347` | 5498676 | 5370 | 游戏本体 | | 2 | `module_87072` | 3775340 | 3687 | 游戏本体 | | 3 | `module_10032` | 1536764 | 1501 | 游戏本体 | | 4 | `module_85183` | 1176860 | 1149 | 游戏本体 | | 5 | `module_92980` | 822309 | 803.0 | 游戏本体 | | 6 | `module_47243` | 534291 | 521.8 | 游戏本体 | | 7 | `module_71105` | 372886 | 364.1 | 游戏本体 | | 8 | `module_21300` | 355930 | 347.6 | 游戏本体 | | 9 | `module_37036` | 347491 | 339.3 | Kotlin生态库 | | 10 | `module_18334` | 303005 | 295.9 | 游戏本体 | | 11 | `module_70130` | 293925 | 287.0 | 游戏本体 | | 12 | `module_85196` | 235678 | 230.2 | 游戏本体 | | 13 | `module_45555` | 224856 | 219.6 | 第三方库 | | 14 | `module_36659` | 182712 | 178.4 | 游戏本体 | | 15 | `module_63383` | 177741 | 173.6 | Kotlin生态库 | | 16 | `module_55088` | 148469 | 145.0 | 游戏本体 | | 17 | `module_52943` | 145059 | 141.7 | Kotlin生态库 | | 18 | `module_3569` | 141181 | 137.9 | 游戏本体 | | 19 | `module_9539` | 131066 | 128.0 | Kotlin生态库 | | 20 | `module_30285` | 123696 | 120.8 | 第三方库 | ## 2. 依赖图摘要 ### 2.1 入度 Top 15(被最多模块依赖) | 模块 | 入度 | Kind | 职责 | |---|---|---|---| | `module_37036` | 59 | Kotlin生态库 | Kotlin/JS 标准库(kotlin-stdlib-js)的运行时核心模块 | | `module_52943` | 39 | Kotlin生态库 | 网页游戏/应用底层工具库,认设备,管键盘,翻译,报错,调用浏览器本地存储,服务管理 | | `module_61860` | 24 | 游戏本体 | 网络连接与游戏对象模型的核心模块,Kotlin/JS 编译产物。它把客户端和服务端连接起来,并管理游戏对象的生命周期。 | | `module_24635` | 24 | Kotlin生态库 | Kotlin/JS 二进制序列化/反序列化(Protocol Buffer 风格)编解码框架 | | `module_32088` | 18 | 游戏本体 | Alternativa3D,3D 数学库,用 Kotlin 编写 | | `module_71105` | 15 | 游戏本体 | 游戏资源加载系统(Resource Loader) | | `module_89613` | 15 | Kotlin生态库 | Kotlin Coroutines (kotlinx.coroutines) 核心基础设施的 JS 移植版 | | `module_31908` | 12 | 游戏本体 | 游戏战斗(Battle)域的协议编解码模块 | | `module_92980` | 11 | 游戏本体 | 使用 WebGL 技术开发的3D 游戏引擎或大型 3D 交互应用的渲染核心模块 | | `module_7552` | 10 | 第三方库 | 转发实现 | | `module_85196` | 8 | 游戏本体 | 游戏车库(Garage)系统的协议编解码模块,属于同一个坦克对战类游戏。它负责定义和注册与“车库/装备/商店”相关的网络协议消息的二进制编解码器。 | | `module_3569` | 8 | 游戏本体 | 游戏客户端的输入与坦克预览模块 | | `module_85667` | 8 | 游戏本体 | 客户端协议编解码模块 | | `module_88693` | 8 | 游戏本体 | 网络协议与数据模型层的实现,主要负责处理客户端与服务器之间关于社交、好友、举报、通知权限等非战斗数据的序列化与反序列化,并管理相关的网络路由和回调。 | | `module_10849` | 8 | Kotlin生态库 | Kotlin/JS 编译后的 Redux 状态管理框架核心模块 | ### 2.2 出度 Top 15(依赖最多模块) | 模块 | 出度 | Kind | 职责 | |---|---|---|---| | `module_82347` | 46 | 游戏本体 | 负责注册大厅、车库、商店、部落、战斗结算等几乎所有核心 UI 界面的组件样式与逻辑。 | | `module_13431` | 46 | 游戏本体 | Kotlin/JS 编译后的游戏客户端启动入口模块,负责整个游戏的初始化、渲染和启动流程。 | | `module_18334` | 28 | 游戏本体 | 游戏客户端的总装配/依赖注入模块 | | `module_10032` | 25 | 游戏本体 | 游戏客户端核心 Redux 状态管理模块。Redux 架构 | | `module_87072` | 24 | 游戏本体 | 战斗系统,底盘与物理系统,战斗模式,物品池和特效系统,空投与补给系统,地图与场景渲染 | | `module_21300` | 19 | 游戏本体 | Kotlin/JS 游戏战斗内 HUD(战斗界面)与用户交互系统 | | `module_70130` | 19 | 游戏本体 | 游戏战斗场景(Battle)的模型注册与初始化模块 | | `module_71105` | 16 | 游戏本体 | 游戏资源加载系统(Resource Loader) | | `module_84441` | 13 | 第三方库 | 负责把文本数据编码成 QR 码的模块矩阵。qrcode 库 | | `module_47243` | 11 | 游戏本体 | 游戏客户端"面板(Panel)系统"的协议编解码模块,用 Kotlin 编写。它是整个项目中最大的协议模块之一,定义了面板 UI 相关的所有枚举、数据类、编解码器。 | | `module_52943` | 9 | Kotlin生态库 | 网页游戏/应用底层工具库,认设备,管键盘,翻译,报错,调用浏览器本地存储,服务管理 | | `module_24923` | 9 | Kotlin生态库 | CSS-in-JS 样式引擎(类似 styled-components / Emotion / Stitches 的实现),用 Kotlin 编写并编译成 JS。它负责在运行时动态生成、管理和注入 CSS,支持 React 组件样式、主题、媒体查询、动画等。 | | `module_57128` | 9 | 游戏本体 | UI 交互与触控/鼠标手势处理模块 | | `module_85183` | 8 | 游戏本体 | 定义并注册游戏中各种网络协议消息的编解码器(Codec),用于在客户端与服务器之间序列化/反序列化数据。 | | `module_3569` | 8 | 游戏本体 | 游戏客户端的输入与坦克预览模块 | ### 2.3 叶子模块(无出度,共 29 个) 其中属于游戏本体的(1 个):`module_26482` 其余叶子模块:`module_905`(第三方库)、`module_7793`(第三方库)、`module_13532`(第三方库)、`module_14766`(第三方库)、`module_15330`(第三方库)、`module_17259`(第三方库)、`module_17323`(第三方库)、`module_19074`(第三方库)、`module_21973`(第三方库)、`module_27736`(第三方库)、`module_29545`(第三方库)、`module_31509`(第三方库)、`module_31584`(Kotlin生态库)、`module_37036`(Kotlin生态库)、`module_38335`(第三方库)、`module_43319`(第三方库)、`module_44794`(第三方库)、`module_55920`(第三方库)、`module_57328`(第三方库)、`module_64280`(第三方库)、`module_66610`(第三方库)、`module_76074`(第三方库)、`module_77672`(第三方库)、`module_78231`(第三方库)、`module_78931`(第三方库)、`module_79763`(第三方库)、`module_94965`(Kotlin生态库)、`module_99295`(第三方库) ### 2.4 孤立模块(既不被依赖也不依赖别人,共 3 个) - `module_26482`(0.7 KB,游戏本体)Service Worker 注册模块 - `module_76074`(1.4 KB,第三方库)Yandex Metrica(俄版 Google Analytics)的集成模块,用于加载分析脚本并暴露事件上报接口。 - `module_78231`(5.2 KB,第三方库)WebView JavaScript Bridge 的加载与实现模块,用于原生 App(iOS/Android)与网页之间的双向通信。 ## 3. 游戏本体模块逐条(40 个) ### `module_82347`(5370 KB) - 职责:负责注册大厅、车库、商店、部落、战斗结算等几乎所有核心 UI 界面的组件样式与逻辑。 - 依赖的模块:`59411`, `7552`, `40293`, `28485`, `1901`, `14766`, `37036`, `52943`, `59131`, `90875`, `24923`, `61860`, `10032`, `57128`, `18334`, …(共 46 个) - 顶层类 / 其它顶层函数:5256 / 5656 - 锚点:`imageBackgroundMessageError`、`getDerivedStateFromError`、`commonBlockMessageError` ### `module_87072`(3687 KB) - 职责:战斗系统,底盘与物理系统,战斗模式,物品池和特效系统,空投与补给系统,地图与场景渲染 - 依赖的模块:`37036`, `52943`, `61860`, `24635`, `85183`, `61378`, `10032`, `10849`, `32088`, `31908`, `72834`, `55088`, `3569`, `92980`, `97556`, …(共 24 个) - 顶层类 / 其它顶层函数:3094 / 3327 - 锚点:`Invalid weapon effect timings`、`Mesh texture not found`、`Invalid supply type ` ### `module_10032`(1501 KB) - 职责:游戏客户端核心 Redux 状态管理模块。Redux 架构 - 依赖的模块:`37036`, `10849`, `9539`, `52943`, `61430`, `31908`, `89803`, `47243`, `85667`, `88693`, `54199`, `41164`, `99527`, `85196`, `31584`, …(共 25 个) - 顶层类 / 其它顶层函数:1100 / 1196 - 锚点:`FPS seems awful but cannot decrease the settings`、`Not found params for property `、`Unexpected response status ` ### `module_85183`(1149 KB) - 职责:定义并注册游戏中各种网络协议消息的编解码器(Codec),用于在客户端与服务器之间序列化/反序列化数据。 - 依赖的模块:`37036`, `24635`, `71105`, `61860`, `31908`, `32088`, `85196`, `52943` - 顶层类 / 其它顶层函数:1164 / 1241 - 锚点:`pointCaptureStartNegativeSound`、`pointCaptureStartPositiveSound`、`pointCaptureStopNegativeSound` ### `module_92980`(803.0 KB) - 职责:使用 WebGL 技术开发的3D 游戏引擎或大型 3D 交互应用的渲染核心模块 - 依赖的模块:`52943`, `37036`, `32088`, `97556`, `72834`, `9345` - 顶层类 / 其它顶层函数:494 / 534 - 锚点:`Cannot use default vertex array object`、`Cannot create empty LodGroup`、`Cannot remove last layout` ### `module_47243`(521.8 KB) - 职责:游戏客户端"面板(Panel)系统"的协议编解码模块,用 Kotlin 编写。它是整个项目中最大的协议模块之一,定义了面板 UI 相关的所有枚举、数据类、编解码器。 - 依赖的模块:`37036`, `24635`, `71105`, `31908`, `52943`, `25377`, `85196`, `85667`, `61860`, `88693`, `99527` - 顶层类 / 其它顶层函数:605 / 643 - 锚点:`disabledNotificationTypes`、`expireActiveTimeRewards`、`expireRewardTimeRewards` ### `module_71105`(364.1 KB) - 职责:游戏资源加载系统(Resource Loader) - 依赖的模块:`37036`, `9539`, `89613`, `52943`, `61860`, `24635`, `9345`, `92980`, `32088`, `72834`, `16100`, `61430`, `36734`, `97556`, `7426`, …(共 16 个) - 顶层类 / 其它顶层函数:226 / 250 - 锚点:`Unexpected 3D file format for `、`Invalid file extension `、`Unknown resource type ` ### `module_21300`(347.6 KB) - 职责:Kotlin/JS 游戏战斗内 HUD(战斗界面)与用户交互系统 - 依赖的模块:`7552`, `36659`, `82347`, `37036`, `24923`, `3569`, `10032`, `59131`, `52943`, `63383`, `10849`, `7426`, `90875`, `41164`, `31908`, …(共 19 个) - 顶层类 / 其它顶层函数:348 / 385 - 锚点:`containerUserNickNameClanTag`、`commonContainerIconOptions`、`inputContainerSpectators` ### `module_18334`(295.9 KB) - 职责:游戏客户端的总装配/依赖注入模块 - 依赖的模块:`37036`, `37504`, `10849`, `52943`, `10032`, `61860`, `47243`, `85667`, `88693`, `10283`, `85196`, `32088`, `3569`, `71105`, `99527`, …(共 28 个) - 顶层类 / 其它顶层函数:237 / 266 - 锚点:`vkInitFailed`、`initError`、`Cannot find SteamAPI for SteamPaymentModel` ### `module_70130`(287.0 KB) - 职责:游戏战斗场景(Battle)的模型注册与初始化模块 - 依赖的模块:`37036`, `52943`, `61860`, `87072`, `10032`, `92980`, `61378`, `31908`, `85183`, `10849`, `3569`, `36734`, `97556`, `32088`, `71105`, …(共 19 个) - 顶层类 / 其它顶层函数:260 / 280 - 锚点:`onGrahpicsSettingsChange`、`onBattleSettingsChange`、`lightingEffectService` ### `module_85196`(230.2 KB) - 职责:游戏车库(Garage)系统的协议编解码模块,属于同一个坦克对战类游戏。它负责定义和注册与“车库/装备/商店”相关的网络协议消息的二进制编解码器。 - 依赖的模块:`37036`, `24635`, `71105`, `85667`, `32088`, `61860`, `52943` - 顶层类 / 其它顶层函数:312 / 342 - 锚点:`staticCollisionBoxes`、`mainCollisionBox`、`skyboxFrontSide` ### `module_36659`(178.4 KB) - 职责:游戏客户端的纹理/资源注册与加载系统 - 依赖的模块:`37036`, `89613`, `52943`, `92980`, `71105` - 顶层类 / 其它顶层函数:292 / 319 - 锚点:`desktopHudNuclearRechargeFlashBackground`、`deviceFasterHorizontalTrackingRailgun`、`deviceFasterHorizontalTrackingVulcan` ### `module_55088`(145.0 KB) - 职责:物理引擎与碰撞检测系统,同样是 Kotlin/JS 编译产物。 - 依赖的模块:`32088`, `37036`, `52943` - 顶层类 / 其它顶层函数:105 / 112 - 锚点:`Bound box size is zero`、`Negative mass`、`Level ` ### `module_3569`(137.9 KB) - 职责:游戏客户端的输入与坦克预览模块 - 依赖的模块:`37036`, `32088`, `52943`, `92980`, `9345`, `55088`, `97556`, `7426` - 顶层类 / 其它顶层函数:130 / 133 - 锚点:`onPointerLockError`、`Cannot get free screen pointer!`、`Cannot find parent` ### `module_37504`(104.5 KB) - 职责:游戏客户端"氏族(Clan)系统"的协议编解码模块,用 Kotlin 编写 - 依赖的模块:`37036`, `24635`, `52943`, `61860` - 顶层类 / 其它顶层函数:103 / 110 - 锚点:`Enum item not found for code `、`modelRegistry`、`modelService` ### `module_61378`(92.7 KB) - 职责:游戏世界(World)与实体-组件系统(ECS)的核心模块 - 依赖的模块:`37036`, `52943`, `92980`, `3569`, `32088`, `55088`, `89613`, `97556` - 顶层类 / 其它顶层函数:66 / 73 - 锚点:`World.addGameEffect cannot add effect during update.`、`Cannot remove all while dispatching`、`Cannot dispose while dispatching` ### `module_10283`(91.4 KB) - 职责:Kotlin/JS 编译后的协议模型注册模块 - 依赖的模块:`37036`, `24635`, `71105`, `52943`, `61860`, `67222` - 顶层类 / 其它顶层函数:77 / 82 - 锚点:`proBattlesLimitSound`、`socialNetworkParams`、`entranceBackgrounds` ### `module_97675`(90.0 KB) - 职责:WebView JS‑Native 双向通信桥(Bridge) - 依赖的模块:`37036`, `52943`, `61430`, `9539`, `89613` - 顶层类 / 其它顶层函数:30 / 53 - 锚点:`Invalid result structure`、`checkUnfinishedPurchases`、`finishVerifiedPurchase` ### `module_89803`(85.1 KB) - 职责:游戏/应用中用于处理“匹配系统”和“对战大厅”网络通信和数据序列化的核心代码库。 - 依赖的模块:`37036`, `24635`, `31908`, `61860`, `71105`, `85667`, `52943` - 顶层类 / 其它顶层函数:78 / 91 - 锚点:`matchmakingModeRanks`、`optionsDefaults`、`supportedModes` ### `module_85667`(80.6 KB) - 职责:客户端协议编解码模块 - 依赖的模块:`37036`, `24635`, `71105`, `52943`, `61860` - 顶层类 / 其它顶层函数:143 / 141 - 锚点:`browserExtensionsToDetect`、`stateWithCaptcha`、`clientKey` ### `module_32088`(79.7 KB) - 职责:Alternativa3D,3D 数学库,用 Kotlin 编写 - 依赖的模块:`37036`, `9539` - 顶层类 / 其它顶层函数:26 / 35 - 锚点:`Failed requirement.`、` + this.z1z_1 + `、` + this.a20_1 + ` ### `module_31908`(77.2 KB) - 职责:游戏战斗(Battle)域的协议编解码模块 - 依赖的模块:`37036`, `24635`, `88693`, `52943`, `61860` - 顶层类 / 其它顶层函数:104 / 110 - 锚点:`experiencePremiumBonusByActions`、`suspiciousByIpUserIds`、`suspiciousUserIds` ### `module_61860`(74.9 KB) - 职责:网络连接与游戏对象模型的核心模块,Kotlin/JS 编译产物。它把客户端和服务端连接起来,并管理游戏对象的生命周期。 - 依赖的模块:`24635`, `37036`, `52943`, `32088`, `72834`, `89613`, `61430`, `9539` - 顶层类 / 其它顶层函数:69 / 72 - 锚点:`Constructor codec not found for model `、`Param config-template not found in url`、`Config load exception with status ` ### `module_9345`(69.5 KB) - 职责:A3D 二进制 3D 模型格式 的完整解析器 - 依赖的模块:`37036`, `72834`, `32088`, `97556` - 顶层类 / 其它顶层函数:52 / 68 - 锚点:`Unknown attribute type id `、`Unknown attribute type `、` not found ` ### `module_89679`(58.4 KB) - 职责:集成 Google Play 计费 API - 依赖的模块:`89613`, `10032`, `37036`, `52943`, `97675`, `10849`, `56077`, `47243` - 顶层类 / 其它顶层函数:32 / 32 - 锚点:`Failed to complete payment response with fail`、`API not supported in this browser context`、`Unknown BridgeBillingService shop type` ### `module_16100`(57.0 KB) - 职责:Kotlin/JS 编译后的战斗地图(BattleMap)协议模型注册模块 - 依赖的模块:`37036`, `24635`, `52943` - 顶层类 / 其它顶层函数:74 / 82 - 锚点:`collisionGeometryOutsideGamingZone`、`collisionGeometry`、`textureParameter` ### `module_25377`(52.7 KB) - 职责:游戏客户端与服务器之间的"通知/事件"协议编解码层,用 Kotlin 编写。它基于模块 24635 的二进制编解码框架,定义了所有服务器→客户端的通知消息类型及其序列化格式。 - 依赖的模块:`37036`, `24635`, `31908`, `52943`, `61860`, `85667`, `99527` - 顶层类 / 其它顶层函数:61 / 69 - 锚点:`Enum item not found for code `、`wsProto`、`modelRegistry` ### `module_13431`(46.6 KB) - 职责:Kotlin/JS 编译后的游戏客户端启动入口模块,负责整个游戏的初始化、渲染和启动流程。 - 依赖的模块:`30285`, `81886`, `37036`, `82347`, `21300`, `10032`, `89613`, `41164`, `52943`, `7426`, `3569`, `92980`, `10849`, `97675`, `61860`, …(共 46 个) - 顶层类 / 其它顶层函数:44 / 38 - 锚点:`onVisibilityChanged`、`lockScreenLandscape`、`requestFullscreen` ### `module_36734`(40.5 KB) - 职责:游戏客户端的音频系统,用 Kotlin 编写。它基于 Web Audio API 实现了完整的音效播放引擎,包括:音频解码、声道管理、优先级调度、3D 空间音效、音量/静音控制、分组增益 - 依赖的模块:`37036`, `32088`, `52943`, `89613`, `7426` - 顶层类 / 其它顶层函数:35 / 26 - 锚点:`audioContextService`、`onChannelRecycled`、`effectiveGain` ### `module_54199`(39.8 KB) - 职责:游戏聊天系统的网络协议编解码模块 - 依赖的模块:`37036`, `24635`, `88693`, `52943`, `61860` - 顶层类 / 其它顶层函数:37 / 54 - 锚点:`linksWhiteList`、`battleIdHex`、`battleLinks` ### `module_88693`(34.3 KB) - 职责:网络协议与数据模型层的实现,主要负责处理客户端与服务器之间关于社交、好友、举报、通知权限等非战斗数据的序列化与反序列化,并管理相关的网络路由和回调。 - 依赖的模块:`37036`, `24635`, `52943`, `61860` - 顶层类 / 其它顶层函数:27 / 49 - 锚点:`Enum item not found for code `、`No enum constant projects.tanks.multiplatform.users.model.keys.KeyTypeEnum.`、`modelRegistry` ### `module_1510`(30.9 KB) - 职责:库Kotlin/JS 编译的支付/交易协议处理器模块 - 依赖的模块:`37036`, `24635`, `52943`, `61860` - 顶层类 / 其它顶层函数:31 / 47 - 锚点:`questToAchievementMap`、`itemIdMap`、`Enum item not found for code ` ### `module_57128`(29.9 KB) - 职责:UI 交互与触控/鼠标手势处理模块 - 依赖的模块:`14766`, `32088`, `37036`, `52943`, `31908`, `92980`, `71105`, `7426`, `59131` - 顶层类 / 其它顶层函数:26 / 13 - 锚点:`Not found icon for `、`getBattleModeLocalizedShortName`、`intertialScroll` ### `module_45686`(15.0 KB) - 职责:游戏客户端的模型注册与空间(Space)加载系统,用 Kotlin 编写。它负责把服务器下发的模型数据注册到客户端的模型注册表中,并管理"空间"(游戏场景/实例)的加载与切换。 - 依赖的模块:`37036`, `61860`, `29554`, `52943`, `71105`, `24635` - 顶层类 / 其它顶层函数:3 / 24 - 锚点:`onError`、`gameTypeRegistry`、`modelRegister` ### `module_41164`(13.2 KB) - 职责:游戏客户端的分析(Analytics)与埋点系统,用 Kotlin 编写。它负责向多个分析平台(Google Analytics、Yandex Metrica、自有分析服务)上报用户行为事件,包括登录、注册、战斗开始、购买、教程进度等。 - 依赖的模块:`37036`, `61430`, `97675`, `52943` - 顶层类 / 其它顶层函数:8 / 22 - 锚点:`currencyCode`、`ecommerce`、`substage` ### `module_99527`(10.9 KB) - 职责:Protobuf媒体编解码器 + 时间周期配置 + 参数校验 - 依赖的模块:`37036`, `24635`, `52943`, `61860` - 顶层类 / 其它顶层函数:20 / 11 - 锚点:`FORBIDDEN`、`Enum item not found for code `、`modelRegistry` ### `module_29554`(9.7 KB) - 职责:游戏客户端的模型/对象数据加载协议编解码模块 - 依赖的模块:`37036`, `24635`, `61860`, `71105`, `52943` - 顶层类 / 其它顶层函数:18 / 0 - 锚点:`modelsData`、`modelService`、`_loadDependencies_dependenciesCodec` ### `module_67222`(8.1 KB) - 职责:社交网络登录与账号绑定的网络协议模块 - 依赖的模块:`37036`, `24635`, `52943`, `61860` - 顶层类 / 其它顶层函数:19 / 2 - 锚点:`failedRedirectUrl`、`codec_failedRedirectUrl`、`Enum item not found for code ` ### `module_85745`(4.0 KB) - 职责:资源图片帧动画相关的网络序列化 / 反序列化 - 依赖的模块:`37036`, `24635`, `52943` - 顶层类 / 其它顶层函数:5 / 2 - 锚点:`Enum item not found for code `、` + this.y1we_1 + `、` + this.z1we_1 + ` ### `module_26482`(0.7 KB) - 职责:Service Worker 注册模块 - 依赖的模块:无(DependsOn 为空) - 顶层类 / 其它顶层函数:0 / 0 - 锚点:`serviceWorker`、`SW registration failed: `、`manifest` ## 4. 依赖层次(由 DependsOn 计算,非手工绘制) Level 定义:无依赖 = Level 0,否则 = 1 + 依赖的最大 Level(存在少量循环依赖,回边被递归守卫截断,取近似最长链)。 - **Level 0**(29 个):游戏本体 1 个(`26482`);Kotlin生态库/第三方库 28 个 - **Level 1**(24 个):游戏本体 0 个;Kotlin生态库/第三方库 24 个 - **Level 2**(16 个):游戏本体 1 个(`32088`);Kotlin生态库/第三方库 15 个 - **Level 3**(10 个):游戏本体 0 个;Kotlin生态库/第三方库 10 个 - **Level 4**(5 个):游戏本体 1 个(`9345`);Kotlin生态库/第三方库 4 个 - **Level 5**(3 个):游戏本体 0 个;Kotlin生态库/第三方库 3 个 - **Level 6**(5 个):游戏本体 4 个(`92980`、`55088`、`97675`、`36734`);Kotlin生态库/第三方库 1 个 - **Level 7**(5 个):游戏本体 5 个(`3569`、`61860`、`16100`、`41164`、`85745`);Kotlin生态库/第三方库 0 个 - **Level 8**(8 个):游戏本体 7 个(`71105`、`37504`、`61378`、`88693`、`1510`、`99527`、`67222`);Kotlin生态库/第三方库 1 个 - **Level 9**(6 个):游戏本体 6 个(`36659`、`10283`、`85667`、`31908`、`54199`、`29554`);Kotlin生态库/第三方库 0 个 - **Level 10**(5 个):游戏本体 5 个(`85196`、`89803`、`25377`、`57128`、`45686`);Kotlin生态库/第三方库 0 个 - **Level 11**(2 个):游戏本体 2 个(`85183`、`47243`);Kotlin生态库/第三方库 0 个 - **Level 12**(1 个):游戏本体 1 个(`10032`);Kotlin生态库/第三方库 0 个 - **Level 13**(2 个):游戏本体 2 个(`87072`、`89679`);Kotlin生态库/第三方库 0 个 - **Level 14**(1 个):游戏本体 1 个(`18334`);Kotlin生态库/第三方库 0 个 - **Level 15**(2 个):游戏本体 2 个(`82347`、`70130`);Kotlin生态库/第三方库 0 个 - **Level 16**(1 个):游戏本体 1 个(`21300`);Kotlin生态库/第三方库 0 个 - **Level 17**(1 个):游戏本体 1 个(`13431`);Kotlin生态库/第三方库 0 个 ### 4.1 骨架图(Mermaid,节点 = 入度最高的 12 个游戏本体模块 + 入口 `13431`/装配 `18334`,边取自 DependsOn 且两端都在节点集内) ```mermaid graph LR N61860["61860"] N32088["32088"] N71105["71105"] N31908["31908"] N92980["92980"] N3569["3569"] N85196["85196"] N85667["85667"] N88693["88693"] N10032["10032"] N36734["36734"] N36659["36659"] N13431["13431"] N18334["18334"] N61860 --> N32088 N71105 --> N61860 N71105 --> N92980 N71105 --> N32088 N71105 --> N36734 N31908 --> N88693 N31908 --> N61860 N92980 --> N32088 N3569 --> N32088 N3569 --> N92980 N85196 --> N71105 N85196 --> N85667 N85196 --> N32088 N85196 --> N61860 N85667 --> N71105 N85667 --> N61860 N88693 --> N61860 N10032 --> N31908 N10032 --> N85667 N10032 --> N88693 N10032 --> N85196 N10032 --> N32088 N10032 --> N3569 N10032 --> N36659 N10032 --> N92980 N10032 --> N36734 N10032 --> N61860 N36734 --> N32088 N36659 --> N92980 N36659 --> N71105 N13431 --> N10032 N13431 --> N3569 N13431 --> N92980 N13431 --> N61860 N13431 --> N31908 N13431 --> N85667 N13431 --> N88693 N13431 --> N85196 N13431 --> N36734 N13431 --> N71105 N13431 --> N18334 N13431 --> N36659 N18334 --> N10032 N18334 --> N61860 N18334 --> N85667 N18334 --> N88693 N18334 --> N85196 N18334 --> N32088 N18334 --> N3569 N18334 --> N71105 N18334 --> N92980 N18334 --> N31908 N18334 --> N36734 ``` ### 4.2 节点对照表 | 节点 | 入度 | 出度 | 职责 | |---|---|---|---| | `61860` | 24 | 8 | 网络连接与游戏对象模型的核心模块,Kotlin/JS 编译产物。它把客户端和服务端连接起来,并管理游戏对象的生命周期。 | | `32088` | 18 | 2 | Alternativa3D,3D 数学库,用 Kotlin 编写 | | `71105` | 15 | 16 | 游戏资源加载系统(Resource Loader) | | `31908` | 12 | 5 | 游戏战斗(Battle)域的协议编解码模块 | | `92980` | 11 | 6 | 使用 WebGL 技术开发的3D 游戏引擎或大型 3D 交互应用的渲染核心模块 | | `3569` | 8 | 8 | 游戏客户端的输入与坦克预览模块 | | `85196` | 8 | 7 | 游戏车库(Garage)系统的协议编解码模块,属于同一个坦克对战类游戏。它负责定义和注册与“车库/装备/商店”相关的网络协议消息的二进制编解码器。 | | `85667` | 8 | 5 | 客户端协议编解码模块 | | `88693` | 8 | 4 | 网络协议与数据模型层的实现,主要负责处理客户端与服务器之间关于社交、好友、举报、通知权限等非战斗数据的序列化与反序列化,并管理相关的网络路由和回调。 | | `10032` | 7 | 25 | 游戏客户端核心 Redux 状态管理模块。Redux 架构 | | `36734` | 7 | 5 | 游戏客户端的音频系统,用 Kotlin 编写。它基于 Web Audio API 实现了完整的音效播放引擎,包括:音频解码、声道管理、优先级调度、3D 空间音效、音量/静音控制、分组增益 | | `36659` | 6 | 5 | 游戏客户端的纹理/资源注册与加载系统 | | `13431` | 0 | 46 | Kotlin/JS 编译后的游戏客户端启动入口模块,负责整个游戏的初始化、渲染和启动流程。 | | `18334` | 3 | 28 | 游戏客户端的总装配/依赖注入模块 | ## 5. 未能确认 / 需注意的点 1. **dir.file 中有两处职责与源码内容不符**(JSON 的 Duty 仍按 dir.file 原样抄录,未擅自改写): - `module_96480` 标注“Underscore.js 1.13.6”,但源码是 inline-style-prefixer 的 transition 前缀插件(`Webkit`/`Moz` 分支、`-webkit-`/`-moz-` 常量)。 - `module_94965` 标注“ReactHTML HTML 标签构建器”,但源码是两段 UMD 包裹的 underscore 实现(导出映射含 `VERSION`、`restArguments`,字面量 `1.13.6`),且没有任何 `div`/`span` 等 HTML 标签字面量。 2. 6 个模块的 `Anchors` 为空数组(源码里没有可用的稳定字面量,且没有高辨识度标识符):17323、19074、29545、31584、58309、99295。 3. 5 个模块有 require 参数但抽不到依赖:7793、14766、17323、55920、94965。推测是 webpack 模块连接(concatenation)把 require 调用内联消除,或依赖指向资源模块 id(本调研只统计代码模块 id)。 4. DependsOn 只覆盖静态 `i()` 调用:动态取模块(55920 的 `t.require(n)`)不计入;对 `static/` 资源模块的引用也不计入。 5. 顶层类/函数是按缩进 + 首字母大写的启发式统计(`TopLevelClasses` 不等于真实 Kotlin 类数量,压缩后部分类名非 PascalCase);Kind 中有若干边界判定(如 89679 Google Play 计费、52943 通用工具库、94965)按“代码来源 + 职责”人工定案,规则见 1.1。 6. 分层为最长依赖链的近似值:图中存在循环依赖,回边在递归中被截断,Level 仅供骨架参考。