创新方案
游戏开发时可用:用游戏循环、ECS、2D 动画/碰撞、游戏…
适用于从零设计或重构 2D/3D 游戏,尤其是需要游戏循环、物理、AI、多人联网和性能优化的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
游戏开发时可用:用游戏循环、ECS、2D通用
解决思路
- 将主循环按 Input Process → Update Logic → Physics Step → Render Frame → Next Frame 顺序组织,并在下一帧回到输入处理。
- 时间步选择:物理和确定性逻辑用固定时间步,模式为 while (accumulator >= dt) { update(dt); };渲染和动画用可变时间步 update(deltaTime);;大多数游戏用混合方案:固定物理、可变渲染。
- 实现混合游戏循环:维护 accumulator,设置 FIXED_DT = 1/60;每帧计算 deltaTime 并累加到 accumulator;当 accumulator >= FIXED_DT 时循环执行 physicsUpdate(FIXED_DT) 并递减;计算 alpha = accumulator / FIXED_DT,调用 render(alpha) 做状态插值;用 requestAnimationFrame(gameLoop) 继续下一帧。
- ECS 架构:Entity 只是 ID;Component 是纯数据,例如 Position(x,y,z)、Velocity(vx,vy)、Sprite(texture,width,height);System 是逻辑;系统按组件组合处理实体。
- 实现移动系统:遍历实体,若同时有 Position 和 Velocity,则取组件并执行 pos.x += vel.vx * dt; pos.y += vel.vy * dt;。
- 2D 精灵动画:定义 Animation 含 frames(纹理名数组)、frameDuration(每帧秒数)、loop;维护 currentFrame 和 elapsed;update(dt) 累加 elapsed,达到 frameDuration 时重置并 currentFrame++;若超出帧数,loop 为真回到 0,否则停在最后一帧;texture 返回当前帧纹理。
- 碰撞检测方法选择:AABB 用于盒子/简单形状,Circle 用于投射物/角色,SAT 用于复杂凸多边形,Pixel Perfect 用于精确碰撞但昂贵。
- AABB 碰撞实现:aabbIntersect(a, b) 返回 a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y。
- 空间哈希广相:用 SpatialHash 维护 cells: Map<string, Entity[]> 和 cellSize;insert(entity) 根据 entity.position 生成 key,不存在则建数组并 push;query(position) 检查周围 3×3 邻接格子(dx、dy 从 -1 到 1),收集并返回邻近实体。
- 游戏 AI 有限状态机:定义 State 接口含 enter()、update(dt)、exit();EnemyAI 用 Map 保存状态和 currentState;transition(stateName) 先 exit() 当前状态,再设置新状态并 enter();示例 PatrolState 在 enter 设置 setAnimation('walk'),update 执行 patrol(),若 canSeePlayer() 则 fsm.transition('chase')。
- 行为树:用 Selector/Sequence 节点组织 AI 决策;例如 Selector 下放 Sequence(CanSee? → Attack)和 Patrol,或 Selector 下放 Sequence(CanSee? → Chase)和 Patrol。
- A* 寻路:实现 aStar(start, goal),用 PriorityQueue openSet,cameFrom、gScore、fScore;初始化 start 的 g=0、f=heuristic(start, goal) 并入队;循环出队 current,若 current===goal 则 reconstructPath(cameFrom, current);遍历 neighbors,计算 tentativeG = gScore.get(current) + distance(current, neighbor);若小于 neighbor 的 g,则更新 cameFrom、gScore、fScore 并入队;无路径返回 []。
- 多人网络架构选择:Peer-to-Peer 延迟低、复杂度中,适合格斗游戏/小型房间;Client-Server 延迟中、复杂度高,适合多数网游;Authoritative Server 延迟更高、复杂度最高,适合竞技游戏。
- 延迟补偿/客户端预测:NetworkedPlayer 维护 pendingInputs 和 serverState;update(input) 先本地应用输入做预测,push 到 pendingInputs,再发送服务器;onServerUpdate(state, lastProcessedInput) 设置 serverState,过滤 pendingInputs 保留 id > lastProcessedInput,再重新应用未处理输入。
- 状态同步/增量压缩:定义 StateDelta 含 timestamp 和 changes: Map<EntityId, ComponentChanges>;computeDelta(prev, curr) 遍历 curr.entities,若 prev 中不存在或 hasChanged(prevEntity, entity),则 changes.set(id, getChangedComponents(prevEntity, entity));返回 { timestamp: curr.timestamp, changes }。
- 渲染优化:Batching 合并同纹理精灵以减少 draw calls;Culling 用视锥剔除/遮挡剔除跳过不可见对象;LOD 按距离切换模型降低多边形数;Instancing 用 GPU instancing 高效绘制重复对象。
- 内存优化/对象池:ObjectPool<T> 维护 pool 和 factory;acquire() 返回 pool.pop() ?? factory();release(obj) 先 reset(obj) 再 pool.push(obj);使用示例:bulletPool = new ObjectPool(() => new Bullet()),fireBullet() 中 acquire()、init(position, direction)、加入 activeBullets;onBulletHit(bullet) 从 activeBullets 删除并 bulletPool.release(bullet)。
- 游戏引擎选择参考:Unity(C#,移动/独立/VR,全平台)、Unreal(C++/Blueprint,AAA/写实,PC/主机)、Godot(GDScript/C#,独立/2D,全平台)、Flame(Dart,Flutter 2D/休闲,全平台)、Phaser(JavaScript,Web 2D,浏览器)、Three.js(JavaScript,Web 3D,浏览器)、Bevy(Rust,性能,桌面)、LÖVE(Lua,简单 2D,桌面)。
- Flame 引擎(Flutter):使用 flame-core/ 处理组件、输入、碰撞、相机、动画、音效、粒子;flame-systems/ 使用 14 个游戏系统(任务、对话、背包、战斗等);flame-templates/ 使用 RPG、Platformer、Roguelike 模板;详细参考 flame/SKILL.md。
- 参考相关技能:performance-optimization(通用优化)、realtime-systems(WebSocket、网络)、cpp(性能关键代码)、javascript-typescript(Web 游戏)。
适用边界 · 注意事项
- 不适用于非游戏类应用(Web、API、数据库、后端)开发;这些场景优先使用对应领域模式。
- 不适用于不需要实时循环、渲染、物理、AI 或多人同步的简单应用,避免过度设计。
- 如果已使用某个引擎的内置架构,不必强行自定义游戏循环/ECS;优先遵循引擎约定。