SuperAPI AI 工具集

realtime-game-loop

编程与开发

查看项目

更新于 10-18 19:02

技能介绍

用途

本技能用于在 React Native 应用中实现实时游戏循环。它区分两类场景:纯实时游戏(如竞技场追逐)在 UI 线程内运行固定步长的类型化数组模拟;回合制游戏中的连续阶段(如弹射、坠落、连锁)则在纯 reducer 中以相同固定步长运行,再作为时间线回放。两条路径都保证录制运行在 Jest、iOS 和 Android 上逐位一致地重放。技能附带循环套件(src/core/realtime/、src/core/geom/)、实时宿主(src/canvas/realtime/)、模板游戏(弹跳球竞技场)以及验证这些组件的检查器。

主要规则与能力

模拟以 STEP_MS = 1000/120 的固定步长推进,并带有 250 ms 的追帧上限;(重新)激活后的第一帧不进行模拟。游戏逻辑按 tick 计数而非毫秒,速度按每 tick 定义,计时器为 tick 数,模拟从不接触时间戳。模拟状态是一个由类型化数组组成的普通对象,存放在单一共享值中,在 UI 线程上原地修改,然后调用 sim.modify()。单个 tick 不分配任何内存:实体、事件、随机数词、空间哈希暂存等缓冲区一次性创建;完整事件队列会丢弃边缘和命中事件,但保留预留槽位,确保输入、存档点和运行结束事件永不丢失。模拟、UI 线程套件和实时绘制文件均为 'worklet' 模块,只能从其他 'worklet' 模块导入值。确定性策略仅允许 + - * / %、位运算以及 Math.sqrt/imul/floor/round/abs/min/max/PI,禁止 **、其他 Math.*、Math.random、Date、performance.now、Intl;随机性来自模拟自身的 sfc32 词。输入是整数命令,以 (tick, command) 记录,来自约定的 16 方向表(1 右、5 下、9 左、13 上;0 空闲)。模拟从不与 JS 或应用通信:它追加 [kind, value, tick] 事件,runLoopFrame 每帧排空一次并通过 scheduleOnRN 发送一批;模拟不从 React、React Native、Expo、Skia 或应用层导入任何内容。帧回调主体仅调用一次 runLoopFrame,其中包含 try/catch;出错时停止循环并暂停游戏。循环仅在表面可运行时运行(应用活跃、屏幕聚焦、未被覆盖、未暂停、未结束),通过 useCanvasLifecycle 控制;停止时保存存档点并显示暂停 UI;实时游戏从不自动恢复,恢复时重置累加器。每个模拟都有回放测试和帧分组测试。实时游戏暴露 RealtimeSpec(createSim、step、drainEvents、snapshot、savePoints、isSavePoint),并具有经过测试的快照往返,仅在存档点保存。模拟后回放类游戏在纯 reducer 内以相同固定步长运行连续阶段,受 maxTicks 限制,并返回定时事件(atMs)。实时表面需通过绘制调用预算测试(所有实体槽位运行时 ≤ 1,000)、3 种尺寸下实体位于画布内的检查,以及 3 种尺寸 × 脚本运行时刻 0、0.5、1 的像素黄金测试(9 个基线)。不使用物理引擎:采用扫掠圆、反射和空间哈希;仅在堆叠、关节或摩擦场景下,文档化回退方案为 JS 线程上的 planck。

使用方式

工作流包括:分类游戏(实时或回合内连续阶段);检查前置条件(模板导入 @/core/rng/sfc32、画布套件的 draw-kit、describe-error、use-canvas-lifecycle 和 test/goldens/skia-golden.ts、@/hooks/use-is-app-active,以及精确固定版本的 fast-check);复制套件(运行 node ${CLAUDE_SKILL_DIR}/scripts/check-realtime-loop.mjs .,根据 loop-file-missing 从 templates/ 逐字复制文件,根据 loop-import-unresolved 修复导入);实时游戏按测试先行复制模板并替换占位符,运行回放、帧分组和往返测试,然后替换 gameplay 槽位(moveEntity)并保持测试通过;适配画布并创建金色基线;将游戏接入宿主(GameSurfaceProps、RealtimeCanvasHost 等);模拟后回放类模仿 examples/ricochet-volley/;运行 lint、格式、类型检查和测试;运行检查器直至 RESULT: PASS;最后在真实 iOS 模拟器和 Android 模拟器上运行 Release 构建,并在各平台 120 Hz 手机上由真人游玩至少 60 秒,通过 onFrameTime 记录帧时间(卡顿率 ≤ 10 ms/s)并判断手感。

适用场景

适用于需要实时运动、弹跳球、竞技场追逐,或回合制游戏中包含连续阶段(弹射、连锁)的 React Native 游戏开发。

限制

不使用物理引擎(仅扫掠圆、反射、空间哈希;planck 为文档化回退);实时游戏不自动恢复;模拟不接触时间戳与毫秒;宿主尚未在 Android 设备上实际运行(文档说明);模拟器和模拟器通常限制在 60 Hz,需在真实 120 Hz 手机上判断手感;检查器在某些情况下输出 NOT APPLICABLE(全部为回合制游戏时)或在无 package.json 的文件夹中以退出码 2 停止。