3D球场项目 (六):客户端工程化与优化

3D球场项目 (五) 把客户端的核心业务流 讲完了:Native 推送 → DataManager 队列 → ScenePlayer 章节调度 → GameController 状态机 → Handler → 渲染层。功能闭环跑通之后,真正的硬仗是 “工程化"和"性能”——前者保证 项目能稳定上线(编译跑通、退出不崩、Swift 调用顺手),后者保证在中低端机上画面流畅。 第一版上线时遇到了两类问题: 稳定性 / 工程化:modulemap 编译报错、lipo 架构冲突、A11 设备启动 crash、 Cocos 退出期 OpenAL 资源竞争 crash……这些都不是"画面卡",但每一个都能让用户体验 归零; 性能:中端 iPhone 在比赛回合渲染期间,GPU 和 CPU 都偶尔抖到 80%+,帧率掉到 30 fps 出头。 本篇按这两类拆成两部分,所有改动都遵循一条原则:不动玩法,只把工程问题和帧时间 解决掉。 架构改动一览 3D球场项目 (二) 介绍过弹幕引擎的四层 架构(腾讯视频 APP / MagicDanmakuiOS / MagicDanmaku / cocos-engine)。这一阶段 每一层都动了——3D 球场不是单点改造,而是一次自上而下的纵贯。下面这张图是把 PartTwo 那张原始架构图重画一遍,改动的节点用蓝色、新增的节点用绿色, 没动的节点保持白色: 未改动 本次改动 本次新增 腾讯体育 APP(新接入方) ▲ 业务层 SwiftUI(腾讯体育侧,PartFive §四 / 全部新增) InMatchTop3DLiveView QS3DCourtSwiftUIView QS3DCourtEventBroker CourtContainerControlOverlay TennisMatchScoreBoard TennisGameEventBoardView QS3DCourtViewController MagicDanmakuViewController ▲ 弹幕业务接入层 MagicDanmakuiOS(PartFive §三 + PartSix 第一部分) 资源包 业务接入层 JS 注册绑定 动态化 playground CocosPlayer(场景代理回滚) modulemap + framework A11 / lipo 构建修复 ▲ 弹幕实现 MagicDanmaku(PartFive §二 + PartSix 第二部分) Assets 资源包 TypeScript 版弹幕组件(原有,未改) 样式 轨道 特效 通信 … ★ 新增:3D 网球球场(assets/tennis/) Model / DataManager ScenePlayer GameController States × 6 Handlers × 7 Player / QSArmature Ball / Bezier+Physics Camera Audience(VAT) Shader 球场边线 素材 图片 视频 音频 网球资产(减面 / 压缩 / 合材) 二进制库 engine framework(重新打包) external framework(A11 兼容重编) ▲ 引擎内核 cocos-engine(PartFive §一 + PartSix §二、§三) 2D 3D 物理 粒子 … loadScene(进度 / 传参 / 4 阶段代理) JsbBridgeWrapper(内存语义) AudioEngine(OpenAL atomic 守卫) OC 头文件(Swift 友好标注) 引擎内核扩展 cocos-engine/native/external webp freetype … 一句话归纳: ...

May 31, 2026

3D球场项目 (五)

3D球场项目 (四) 把服务端推到了线上: 导演 Agent 把每个 Point 切成 SERVE / RALLY / CONCLUSION 三段,配齐了动作、机位、 位置、比分、解说,按 seq 单调下发到客户端。本篇回到客户端,看 Cocos 这一侧拿到 Script 之后,是怎么把它变成屏幕上一拍接一拍的比赛画面的。 整个客户端改造分四层落地,本篇只讲和 3D 球场主干业务直接相关的内容: CocosEngine 层:场景加载架构升级(进度 / 传参 / Delegate1 回调 / JSBridge2 内存语义); MagicDanmaku 层:3D 球场的核心业务代码(数据流、状态机、动画 / 球轨迹 / 相机 / 观众); MagicDanmaku iOS 层:场景加载回调的演化,以及 CocosPlayer 在调用链里的角色; 业务层:腾讯体育 App 的 SwiftUI3 视图把上面三层包成一个标准组件。 每一层和业务流程脱钩的内容(性能优化、稳定性 / crash 修复、构建工程化)统一抽到了 3D球场项目 (六):客户端工程化与优化。 下面这张图先把四层的位置关系和数据流向摆出来,读者可以把它当作整篇文章的导航—— 箭头是数据流方向(服务端 Script 自顶向下灌进引擎、引擎事件自底向上回到 SwiftUI), 每个节点旁标了对应章节: 数据入口 事件回流 服务端 Script(PartFour) 业务层 SwiftUI(腾讯体育 App) §四 — 把 Cocos View 包成 SwiftUI 组件,事件用 Combine Broker 双向桥接 InMatchTop3DLiveView QS3DCourtSwiftUIView QS3DCourtEventBroker CourtContainerControlOverlay TennisMatchScoreBoard TennisGameEventBoardView QS3DCourtViewController MagicDanmaku iOS 层(CocoaPods framework,对外导出) §三 — 把引擎符号 + CocosPlayer 一起导给业务层;场景就绪回调由消费者各自实现 CocosView CocosCreator JsbBridgeWrapper CocosPlayer CocosMessageInvoker CocosEngine 层(cocos-engine 内部分支) §一 — loadScene 全流程能力升级(进度 / 传参 / 4 阶段代理)+ JsbBridgeWrapper 内存修复 Director.loadScene CocosLoadSceneConfig.params CocosViewSceneDelegate(4 阶段协议) SceneManager.load MagicDanmaku 层:3D 球场业务(assets/tennis/...) §二 — 数据 → 状态机 → Handler → 渲染的单向漏斗 Model 层(§2.1) DataManager ScenePlayer RoundData Game 层(§2.2 / §2.3) GameController States × 6 Handlers × 7 ▼ QSPlayerController + QSArmature QSBallTraceController(Bezier / Physics) CameraController AudienceGenerator 橙色节点是 数据入口——Script JSON 从服务端推下来,最终落到 DataManager.receiveRawData()。紫色节点是 事件回流——比如场景加载成功 / 失败、 onRoundStart / onFirstFrameRendered 等事件,由底层逐层冒泡回 SwiftUI 视图。 ...

May 30, 2026