generator 的 yield 适合封装可中断、可恢复的轮询逻辑,如将 o(n²) 碰撞检测切片为帧粒度任务,避免主线程阻塞;它不替代 requestanimationframe,也不并发执行,但通过协作式调度提升可读性、调试性与响应性。

Generator 的 yield 本身不直接驱动游戏循环,但它非常适合封装“可中断、可恢复”的轮询逻辑——比如把一次完整的碰撞检测拆成若干小步,在每一帧只执行一部分,避免长任务阻塞主线程。关键不是用它替代 requestAnimationFrame,而是用它把“轮询过程”变成可暂停的协程式流程。
用 Generator 把碰撞检测拆成帧粒度的步骤
假设你有一组待检测的物体(比如 500 个子弹和 20 个敌人),暴力两两检测会卡顿。你可以用 Generator 把 O(n²) 检测任务切片,每帧只处理固定数量的配对:
function* collisionPoller(entities, maxPerFrame = 10) {
const candidates = [];
for (let i = 0; i for (let i = 0; i 配合 requestAnimationFrame 实现非阻塞轮询
Generator 实例本身不会自动执行,你需要手动驱动它一帧一帧走。这样就把 CPU 密集型工作匀开,且能随时中止或重置:
- 创建迭代器:
const poller = collisionPoller(allEntities); - 在动画帧里调用
.next():requestAnimationFrame(() => { const { done, value } = poller.next(); if (!done) handleCollisions(value); }); - 若场景变化(如敌人被消灭),可直接丢弃旧迭代器,新建一个——无需中断复杂状态机
支持优先级与早停的增强模式
真实游戏中,某些碰撞更关键(如主角受击)。可以在 yield 前插入判断,让高优检测先执行:
- 预排序候选对:把含玩家的配对放在数组前面
- yield 前检查是否已触发关键事件:
if (hasCriticalHit) return;(配合generator.return()提前退出) - 用
yield { type: 'progress', percent: i / total }向上层反馈进度,便于 UI 显示加载条或跳过等待
注意:Generator 不是并发,只是协作式调度
它不会真正并行执行,也不减少总计算量,但解决了两个实际问题:
- 避免单次 JS 执行超过 16ms 导致掉帧
- 让碰撞逻辑保持同步写法(无回调/await 嵌套),可读性接近传统 for 循环
- 调试时可逐帧 inspect 中间结果,比 Web Worker + postMessage 更易追踪
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











