Claude-of-Duty核心引擎揭秘:固定步长帧循环、事件总线与确定性RNG的Three.js设计模式
Claude-of-Duty核心引擎揭秘固定步长帧循环、事件总线与确定性RNG的Three.js设计模式【免费下载链接】Claude-of-DutyA Call of Duty-quality FPS in Three.js, built from a single prompt.项目地址: https://gitcode.com/gh_mirrors/cl/Claude-of-DutyClaude-of-Duty 是一款用 Three.js WebGL2 打造的《使命召唤》级网页第一人称射击游戏FPS全部 5.5 万行代码、11 个子系统没有一张美术贴图、没有一段音频文件全部由代码在加载时程序化生成。比无素材生成更值得普通读者学习的是它的核心引擎设计固定步长帧循环、事件总线、确定性 RNG三大模式。它们解决的是所有游戏开发者迟早都会遇到的问题——帧率抖动、模块耦合、结果不可复现。一个浏览器里的 FPS先认识 Claude-of-Duty项目基于 Three.js r180唯一运行时依赖就是three。游戏运行在一个约 120×120 米的市场街景中包含renderHDR 管线、级联阴影、GTAO、TAA、运动模糊physics手写物理引擎BVH 加速结构、扫掠胶囊体角色控制器、布娃娃weapons / ai / fx / audio弹道、敌人 AI、GPU 粒子、Web Audio 合成音效子系统清单见 README.md。引擎的宪法是一份仅 200 来行的契约文档 ARCHITECTURE.md——所有 AI Agent 协作开发前必须读它这本身就是这个项目最有意思的地方。固定步长帧循环物理为什么不能跟着帧率走问题帧率不固定物理就会漂移网页里requestAnimationFrame的帧间隔是浮动的60Hz、144Hz、卡顿掉帧都可能出现。如果物理更新直接用dt本帧耗时同一颗子弹在 60fps 和 144fps 下会打出完全不同的弹道玩家角色甚至会贴墙穿模。Claude-of-Duty 的解法是经典的固定步长累加器模式实现在 src/core/engine.js每帧 1. 累计本帧真实耗时到累加器 _accum 2. while (_accum FIXED_DT) → 执行 N 次固定步长物理 3. 剩余残差保留留给下一帧关键参数集中定义在 src/core/config.js常量值含义PHYSICS_HZ120物理每秒钟精确执行 120 次FIXED_DT1/120每个物理步的固定时长MAX_SUBSTEPS8单帧最多补 8 步防死亡螺旋两个细节非常实用死亡螺旋保护卡顿一帧后欠下的物理债如果无上限追赶会越追越卡。引擎在达到MAX_SUBSTEPS上限后直接丢弃积压if (steps MAX_SUBSTEPS) this._accum 0宁可牺牲一点模拟精度也保证不雪崩见 src/core/engine.js。dt钳制到 0.1 秒切后台、打断点调试回来时不会让角色瞬移见 src/core/engine.js。渲染用 alpha 插值补帧物理是 120Hz但渲染帧率可能是 60、144 或任何值。如何让画面顺滑引擎在每帧结束算出一个alpha _accum / FIXED_DT0~1 之间的小数代表当前时刻处于最近两个物理步之间的进度。渲染系统用这个 alpha 在两个物理位置之间插值角色移动就永远丝滑。实际使用例子物理子系统在 src/physics/index.js 读取ctx.time.alpha做位置插值第一人称相机在 src/player/camera.js 用同一机制平滑视角。这套elapsed / dt / fixed / alpha时间字段统一挂在引擎上下文上任何子系统都能取到。事件总线11 个子系统如何不打架一条硬规则禁止跨子系统 import11 个子系统渲染、物理、武器、特效、AI……如果互相import依赖图会缠成一团。引擎约定子系统之间绝不直接 import只通过运行时注册表ctx.get(id)拿对象注册表会按deps声明做拓扑排序决定初始化顺序见 src/core/registry.js。跨系统通信走 EventBus更松耦合的协作走事件总线。EventBus只有 40 来行支持on / once / off / emit见 src/core/registry.js。它有两个值得抄的设计on()直接返回退订函数子系统在dispose()时一行清理所有监听不泄漏emit时先拷贝监听者集合再逐个调用并 try/catch监听者可以安全地在回调里退订一个监听者抛错也不会打断其他监听者。项目把跨系统事件做成了固定词汇表完整契约写在 ARCHITECTURE.md 的事件表中常用的有事件含义发射方 → 接收方weapon:fire开火含起点、方向、随机种子weapons → fx / audio / physicsbullet:impact子弹命中点、法线、材质physics → fx / audiodamage:dealt造成伤害是否爆头、是否击杀ai / physics → ui / playerplayer:land/player:footstep落地、脚步player → audio脚步声按材质换音色explosion爆炸任意 → physics / fx举个实际链路武器发射器发出weapon:fire见 src/weapons/index.js弹道飞行后物理系统检测到命中并发出bullet:impactsrc/physics/index.js特效系统订阅它生成火花与贴花src/fx/index.js音频系统根据撞击面材质混凝土/金属/木头……合成不同音效。武器模块从头到尾不知道特效怎么画、音效怎么合成——只发事件不管谁听。确定性 RNG让随机可以逐字节复现为什么游戏里禁止 Math.random()ARCHITECTURE.md的硬规则第 4 条游戏逻辑和画面中禁止Math.random()一切随机必须走ctx.rng。原因是这个项目有一个像素级验证闸门tools/baseline.mjs 用固定帧预算截图 → tools/imagediff.mjs 逐像素比对任何像素变化就报错。如果随机数不可复现这个闸门永远会误报。于是引擎内置了一个xoshiro128**伪随机数生成器实现在 src/core/rng.js一个 32 位种子经 SplitMix32 扩散成 4 个状态字提供float() / range() / int() / gauss() / disc()等游戏常用分布——disc()专门生成单位圆盘内的均匀点用于子弹散布和粒子喷射fork()派生独立随机流每个子系统从主种子 fork 出自己的流武器散布和粒子抖动互不干扰任何一方加多少次随机调用都不会打乱另一方的序列。确定性种子在启动时注入?capture1截图模式下使用固定种子0x5eed1234否则用系统随机种子见 src/core/engine.js。这就是为什么优化前后两次运行、全部 11 张截图能做到0 像素差异见 README.md 的 Performance 一节。三个模式如何串成一条完整管线看启动流程 src/main.js 就能把三条线索串起来注册表拓扑排序11 个子系统按依赖声明排序初始化注册顺序无关紧要预热prewarm首帧前把每个子系统能产生的材质/着色器全部编译一遍src/core/prewarm.js。项目实测没有这一步游戏中途会懒编译 86 个着色器程序单帧卡 3.1~3.9 秒——而预热之所以能证明像素中性靠的正是确定性 RNG 固定步长循环让输出可比对帧循环驱动输入 → 固定步长物理0~8 次→ 变步长 update → lateUpdate → 渲染 → 输入收尾事件总线贯穿其间传递状态。一句话总结固定步长保证物理正确事件总线保证模块解耦确定性 RNG 保证一切可验证。三者叠加才让这个由 AI Agent 舰队并行开发的项目能建立逐像素门禁的质量防线。新手可以立刻借鉴的清单 写自己的游戏循环时先把物理频率固定本例 120Hz渲染用 alpha 插值对齐 给单帧最大追帧数设上限防止卡顿雪崩 跨模块通信用事件 固定事件词汇表词汇表写进文档并随代码一起评审 把随机数收敛到统一入口fork()给每个模块独立流为日后复现/回归测试留后路 把可调参数集中到一份 config本项目是 src/core/config.js含四级画质预设禁止魔法数字散落各处。这套模式不依赖 Three.js任何一个需要物理稳定 模块解耦 结果可复现的前端项目都能直接套用。【免费下载链接】Claude-of-DutyA Call of Duty-quality FPS in Three.js, built from a single prompt.项目地址: https://gitcode.com/gh_mirrors/cl/Claude-of-Duty创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

达梦数据库接入MCP协议的实战指南与安全架构

达梦数据库接入MCP协议的实战指南与安全架构

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 20:50:33 阅读更多 →
锂膜MES与ERP深度集成实战指南:从派工到追溯的工程化落地

锂膜MES与ERP深度集成实战指南:从派工到追溯的工程化落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/27 22:50:41 阅读更多 →
中国移动千亿5G投资版图:40+项目与1500亿权益投资深度拆解

中国移动千亿5G投资版图:40+项目与1500亿权益投资深度拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 20:50:33 阅读更多 →

最新新闻

一文搞懂网站图标的制作h1优化代码报价单

一文搞懂网站图标的制作h1优化代码报价单

一文搞懂网站图标的制作h1优化代码报价单 网站做好了没人访问,这大概是每个站长最头疼的事。你花了钱做页面,盯着后台数据,发现流量像死水一样不动,甚至连搜索引擎收录都慢吞吞的。这时候,很多人会忽略一个细节:你的H1标签和图标(Favicon)…

2026/9/27 22:50:47 阅读更多 →
地理科学毕业论文怎么写?空间差异、区域数据和地理解释怎么避免只做地图展示

地理科学毕业论文怎么写?空间差异、区域数据和地理解释怎么避免只做地图展示

地理科学毕业论文怎么写?空间差异、区域数据和地理解释怎么避免只做地图展示 地理科学论文很容易“地图很多、分析很少”。人口、土地利用、气候、产业、城镇化等数据做成空间分布图以后,如果只是描述“东高西低、中心高外围低”,仍然没有回答…

2026/9/27 22:50:47 阅读更多 →
AI 回答如何做 A/B 测试:流量分组、护栏指标、显著性与快速回滚

AI 回答如何做 A/B 测试:流量分组、护栏指标、显著性与快速回滚

把新提示词和旧提示词各跑一遍,再比较平均分,看起来像 A/B 测试;但这通常只能算离线对比。真实线上实验面对的是用户反复访问、同一会话多轮对话、模型随机输出、检索库变化、限流与超时,以及“回答更好但成本翻倍”这种多目标冲突…

2026/9/27 22:50:47 阅读更多 →
世界模型:概念、应用与 LLM、深度强化学习的融合

世界模型:概念、应用与 LLM、深度强化学习的融合

1. 引言 近年来,人工智能领域最受关注的话题之一便是「世界模型」(World Model)。从自动驾驶到机器人控制,从游戏 AI 到多模态大模型,世界模型正在成为连接感知、认知与决策的核心枢纽。那么,什么是世界模型…

2026/9/27 22:50:47 阅读更多 →
干货:按规则定位取值

干货:按规则定位取值

按 Material 规则精准定位取值:SignLocal/ValueLocal 寻址 问题:元素值在表里的位置不固定 识别的表格里,同一个元素"Fe",可能在不同的行、不同的列,甚至符号和值分居两格。硬编码坐标根本扛不住。 第一性原…

2026/9/27 22:50:47 阅读更多 →
OpenCV-python小玩意27 如何做灰度、增强锐化、黑白等滤镜

OpenCV-python小玩意27 如何做灰度、增强锐化、黑白等滤镜

0. 我要做什么? OpenCV-python小玩意这个系列半年没有更新了,感叹时光荏苒岁月如梭-。今天换个轻松的玩法:给一张本地图片套上滤镜。 手机修图软件里那些「灰度」「黑白」「锐化」「增强」,底层很多就是图像处理里的常规操作。O…

2026/9/27 22:49:47 阅读更多 →

日新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/27 0:00:34 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/27 0:00:34 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/27 0:00:34 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/27 0:00:34 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/27 0:00:34 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/27 0:00:34 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/27 9:12:14 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/26 22:52:30 阅读更多 →