ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Superpowers 自托管指南:轻量级实时协作开发环境实战

Superpowers 自托管指南:轻量级实时协作开发环境实战 最近在给团队找协作原型工具的时候又把 Superpowers 这个老项目翻了出来。名字起得确实狂但你真正上手之后会发现它把在线开发环境和多人实时协作两件事揉得比大多数商业工具都自然。我不打算在这篇文章里把它吹成什么万能神器只想从一个实际安装、部署、跑通项目的角度把 Superpowers 是什么、怎么装、踩过哪些坑、适合拿来做什么一次性说清楚。这篇内容主要写给两类人一是想找轻量级游戏/Web 原型开发环境的开发者二是需要跟队友远程同步写代码、做场景的团队。这两类人读完基本可以照着下面的步骤直接开工。1. 先搞清楚 Superpowers 到底是什么1.1 一个叫超能力的开源实时协作开发环境Superpowers 是一个开源的、基于 Web 的开发与创作平台。它不是一个传统意义上的游戏引擎安装包也不同于你熟悉的 Unity、Godot 那种需要装一个厚重客户端的工具。它的核心形态是一个跑在 Node.js 上的服务端加一个跑在浏览器里的前端编辑器。你打开浏览器访问本地地址看到的是一整套可视化编辑器——场景、资源、代码面板都在里面所有操作都在网页上完成。这个设计在刚接触时会觉得是不是太简陋了但实际用下来你会发现它解决了一个很现实的问题不需要在不同电脑上分别安装环境。团队成员只要连上同一个 Superpowers 服务实例打开同一个 URL就能看到同一个项目。这有点像你把整个开发环境搬到了网上但数据还是在自己掌控的服务器上。这个概念在几年前算比较超前放到现在看它的思路和现在流行的云开发环境其实是一脉相承的。它最核心的技术语言是 TypeScript整个平台都构建在 TypeScript 之上。你在编辑器里写的脚本也是 TypeScript这意味着类型安全、智能提示这些体验从你打开代码面板那一刻就存在而不是像很多轻量引擎那样只能写无类型的 JavaScript。1.2 它解决的核心痛点多人协作与即时运行传统小游戏开发的工作流是什么样子策划或美术用 Unity/Godot 改一下场景提交到 Git程序拉下来调试最后打一个包扔给测试。这个流程没问题但在快速原型阶段非常重。几个人同时改同一个场景几乎不可能只能靠锁文件或者排队。Superpowers 解决的就是这个痛点它从底层就是为实时协同设计的。你可以简单理解为它把开发工具做成了云端文档那样可以多人在线编辑的东西。你在场景里拖一个立方体你的同事在另一台电脑的浏览器里立刻就能看到这个立方体出现了你在代码面板里写了一段移动逻辑保存的一瞬间同项目的人刷一下就能看到最新代码。这种体验跟我第一次用协同文档时的震撼差不多只不过这一次协同的对象是场景 代码 资源。即时运行也是它的一大优势。编辑器里改完代码不需要打包、不需要等待编译到某个目录直接在预览面板里刷新就能看到效果。这是因为整个运行时就在浏览器里脚本解析、资源加载都走本地网络延迟极低。这种改一下马上看得见变化的反馈速度对做原型验证、做 Game Jam 或者教学演示来说非常关键。1.3 它的技术底子与适用人群底层架构上Superpowers 走的是 ECS实体-组件-系统路线。这是现代游戏开发里比较主流的架构模式跟 Unity 的 DOTS、Godot 的节点系统理念有相通之处。简单说一个游戏对象被拆成实体和组件实体只是一个空壳子组件负责往壳子上挂数据和行为系统则统一处理一组组件的行为逻辑。写起来条理清晰扩展性也强。相比下载量很大、教程很多的大厂引擎Superpowers 的生态和名气都小得多。但它的定位也从来不是跟大厂引擎抢市场。它更适合这几类人做快速原型验证的开发者想在一个小时之内搭出可交互的场景教编程、教游戏开发的老师希望学生把注意力放在逻辑上而不是折腾环境安装远程小团队想用低成本的方案做多人协作开发喜欢折腾自托管工具的技术爱好者想拥有完全可控的在线创作环境。如果你是那种需要高保真渲染、海量商店资源、成熟物理引擎的项目那 Superpowers 不适合趁早去用 Unity 或 Godot。它的价值在于轻、快、协作顺滑而不是大而全。2. 安装前的准备与环境选型2.1 在线版和自托管版怎么选Superpowers 官方其实提供了两种使用路径一种是直接使用官方托管的在线服务注册账号就能开工省去了所有部署成本另一种是自托管把整套服务搭在自己的服务器或本地电脑上数据完全归自己管。我个人向来偏好自托管。原因很简单自托管意味着不依赖外部服务的可用性编辑器跑在本地网络波动不会影响我干活数据存在自己的磁盘上也方便做备份和版本管理。另外自托管之后团队里的人通过局域网或者你配置好的远程访问方式连上来协作体验跟官方托管几乎没有差别但自由度高很多。不过自托管对使用者有一个隐性要求你得会基本的命令行操作能安装 Node.js能处理一些端口、防火墙问题。如果你完全不想碰命令行那官方托管或桌面版更适合你。但如果你想长期把它当生产力工具自托管应该作为首选方案因为可控性最好。2.2 本地安装的依赖清单在动手之前先把依赖理清楚。装 Superpowers 本身不需要特别苛刻的硬件条件但它依赖 Node.js 环境。这里有一个容易踩的坑不要装太老的 Node 版本也不要盲目追最新版。Superpowers 这类老牌开源项目对 LTS 版本的支持最稳定。我自己用的 Node 14 LTS 跑得很稳后来又在一台装了 Node 18 的机器上试过问题也不大。但如果你用的是像 Node 21 那种尝鲜版遇到奇怪的兼容性问题先别急着怀疑项目坏了很可能是 Node 版本太新导致的。除了 Node.js你还需要一个现代浏览器。因为整个编辑器都是网页形态Chrome 或者 Edge、Firefox 的新版本都可以但如果你还在用老旧的浏览器那体验会非常糟糕。特别是 3D 场景渲染和 WebGL 相关的功能浏览器版本过旧会直接白屏或者功能缺失。还有一点容易被忽略磁盘空间。虽然项目本体不大但首次启动时它会拉取一些引擎资源加上你后续创建的项目文件建议预留至少 500MB 空间。如果你打算做带贴图、音效的项目再往大了留肯定没错。2.3 用 npm 一条命令装好核心依赖准备好之后安装过程其实很顺。最省事的方式是用 npm 全局安装npm install -g superpowers如果你的网络环境下载 npm 包比较慢事先把 npm 源切换成国内镜像安装速度会快很多这一步不是必须的但通常会很管用。装完验证一下superpowers --version能正常输出版本号说明核心装好了。不过只装核心还不够Superpowers 的功能由插件提供比较核心的插件有 game、web、live。game 插件提供 2D/3D 游戏场景编辑能力web 插件提供网页应用开发能力live 插件负责实时协同服务。第一次安装后按需补上superpowers install game superpowers install web superpowers install live也有的版本支持在 Web 管理界面里直接安装插件不用敲命令。具体看你装的那个版本命令行的方式更通用。3. 实操过程从初始化到跑起第一个游戏场景3.1 创建项目并启动服务端核心工具装好之后找一个你想放项目的目录执行初始化命令superpowers create my-first-project cd my-first-project superpowers start如果你用的版本不支持 create 子命令也可以直接手工建一个目录然后在目录里执行superpowers start它同样会帮你初始化项目结构。整个目录里会出现一个assets或者projects之类的数据目录所有项目数据都存在里面这是以后备份需要重点关注的地方。启动之后终端会输出一个访问地址一般是http://localhost:4237。打开这个地址看到的是一个管理后台界面上面会列出你的项目点击项目名称就能进入编辑器。第一次启动通常需要等一小会儿因为服务器要加载插件、扫描资源目录耐心一点如果等太久再看终端有没有报错信息。这个 4237 端口是默认端口如果被别的程序占用了会启动失败后面我会专门讲怎么处理。我第一次跑的时候就是因为本地某个服务占用了端口折腾了好一阵才发现问题不是出在 Superpowers 本身。3.2 界面布局与核心面板进入编辑器之后第一感觉可能是面板挺多的有点懵。其实核心面板就四个区域最左边是资源面板用来管理场景、脚本、贴图、音频这些资产中间是场景预览区所有可视化的编辑都在这里完成右边是属性面板选中一个实体之后它的位置、旋转、缩放以及挂载的组件都会在这个面板里展示还有一个代码编辑区平时可以把它停靠在资源面板旁边或者弹成独立窗口。这套布局对用惯了现代编辑器的人来说不算陌生但它有一个特点所有面板都可以自由拖拽、浮动组合。你要是觉得中间预览区太小把代码面板拖到另一个显示器上就会舒服很多。我实际用下来发现写脚本的时候最好把代码编辑器单独拉出来让场景预览区保持最大化方便边写边看效果。界面里还有一个容易被忽略的角落——顶部工具栏的运行/预览按钮。做好场景后点它就能让项目跑起来看到真实的游戏画面而不是停留在编辑状态。这个预览和编辑器里的场景视图是两回事一个是编辑模式一个是运行模式刚上手的人经常搞混以为场景里拖出的方块运行后就一定在那个位置其实运行模式完全按照脚本逻辑来编辑场景里的摆放只代表初始状态。3.3 用 ECS 搭一个会动的小方块理论讲太多没用直接做一个最小的演示一个在场景里来回移动的方块。步骤很简单首先在场景里创建一个实体。在场景预览区右键或者用顶部菜单的创建实体按钮一个名为Entity的新实体会出现在场景中属性面板里会显示它默认带了一个变换组件Transform这个组件管位置、旋转、缩放。接着选中这个实体在属性面板的底部找到添加组件按钮给它挂上一个立方体渲染器或者类似的网格组件这样场景里就能看到一个实际的立方体模型了。这是 Superpowers 组件化设计的一个体现实体本身没有长相是靠渲染组件赋予形态。再添加一个刚体组件来启用物理模拟或者如果你不想上物理直接写脚本控制位置也行。为了演示脚本的作用我选择不加物理直接写一个位移脚本class MoveScript extends Sup.Behavior { private speed 2; update() { this.actor.move(this.speed * Sup.Time.deltaTime, 0, 0); } }这段脚本的意思是每一帧让这个物体沿 X 轴以每秒 2 的速度移动。Sup.Time.deltaTime是帧间隔时间用它乘速度能保证不同帧率下移动快慢一致这是游戏开发里很基础也很重要的习惯。把脚本保存好回到场景预览区选中这个实体在属性面板里再次添加组件把刚写的 MoveScript 作为脚本组件挂上去。这一下你的实体就等于被赋予了移动这个超能力。按运行预览按钮方块就开始在场景里匀速移动了。整个过程下来你对 ECS 应该有直观感受了实体是那个方块本身渲染组件告诉引擎怎么画出它脚本组件告诉引擎它每一帧要干什么。这和面向对象那种一个类把所有事都做完的思路明显不同更解耦也更容易复用。4. 常见问题与排查实录4.1 启动失败端口占用与隐藏的进程问题最典型的启动失败就是端口占用。执行superpowers start后如果终端报错提示port 4237 is already in use说明有别的程序占用了这个端口。排查方式很简单先看是谁占的# Windows netstat -ano | findstr 4237 # macOS / Linux lsof -i :4237找到占用端口的进程 ID 之后确认它不是重要程序就可以结束它。如果你不想结束别的进程也可以在启动时指定一个别的端口。Superpowers 是否支持命令行直接传端口取决于版本更通用的办法是去项目的配置文件里找端口设置项改掉。改完重启服务就好。一个隐蔽的问题我遇到过终端里强行 CtrlC 中断服务后有时候会残留一个没被杀干净的 Node 进程它占着端口不让后续实例启动。这种时候你查端口会发现确实被占着但你明明不记得自己开过别的服务那就是残留进程在捣鬼杀掉它再启动就恢复正常了。4.2 首次启动时资源下载失败或卡住首次启动和安装插件的时候Superpowers 需要从仓库拉一些引擎资源和插件包。网络状况不好的时候下载很容易超时表现就是启动界面一直转圈或者终端里反复报连接错误。我的处理方式是先检查镜像源和网络连通性在没有问题的情况下重试。npm 源的切换前面说过了这里再强调一次如果你身在网络环境不太理想的地方先把 npm 的 registry 切到国内主流镜像然后再执行安装、插件安装命令成功率会大幅提高。还有一个小技巧不要贪多一次性把所有插件都装上。网络不稳定的时候先装一个 game 插件确认能启动、能创建项目、场景能正常打开之后再继续装其他插件。这样即使某次下载失败你也能定位到底是哪个插件的问题而不是一股脑全装上之后不知道卡在哪个环节。4.3 浏览器端黑屏或无法连接编辑器服务端启动正常终端也显示在监听但浏览器打开地址就是黑屏或者转圈连不上。这个问题八成出在浏览器和 WebGL 这块或者是浏览器缓存了旧的页面资源。我的排查习惯是先开一个无痕窗口把缓存和 Service Worker 之类的干扰因素全部去掉再访问一次。如果无痕模式能正常打开说明是旧缓存造成的强制刷新几次就好。如果无痕模式依然黑屏那重点检查浏览器支不支持 WebGL。地址栏输入about:gpuChrome 系可以看到 WebGL 的启用状态如果显示硬件加速被禁用去浏览器设置里重新开启硬件加速。还有一种情况是局域网内其他电脑访问不到这种时候先确认防火墙是不是把 4237 端口挡了。Windows 上尤其常见第一次运行时会弹防火墙授权框手快点了取消后面局域网访问就会失败。去防火墙设置里给 Node.js 增加一个入站规则允许 4237 端口通过问题就解决了。4.4 多人协作连不上或编辑不同步多人协作这个特性听着很美好实际操作中也有小概率出问题。最常见的是 A 机器能看到 B 机器创建的实体但编辑属性时对方半天不刷新。这个跟网络延迟、服务器负载都有关系但大多数时候其实是浏览器标签页把 WebSocket 连接给休眠了。Chrome 这类浏览器为了省电对后台标签页的定时器做了节流协作推送的频率就会被拖慢。解决方案简单粗暴参与协作的人把编辑器标签页保持在前台不要切到别的标签页去等。如果真的需要一边看文档一边改场景那建议开两个浏览器窗口一个专门放编辑器并保持可见另一个做别的。这个限制是浏览器层面的不是 Superpowers 本身的问题理解原理之后就不会觉得是 bug 了。另外多人同时编辑同一个实体的同一个组件也有概率出现属性互相覆盖的情况。这不是数据丢失只是最后保存的覆盖了先前的。团队协作时最好口头约定一下各自负责的区域或实体比如 A 管场景搭建B 管脚本逻辑这样既高效又少冲突。Superpowers 解决的是空间上的距离但解决不了逻辑上的冲突这件事得靠人的约定。5. 深入机制组件化开发与插件系统的价值5.1 ECS 架构在 Superpowers 里的落地方式很多人第一次接触 ECS 会被术语吓到但 Superpowers 把它做得比较亲民。在它的实现里实体就是场景树里的一个节点你可以在属性面板里修改它的 Transform 数据组件则是挂到实体上的一个个具体能力块比如渲染器管视觉表现脚管本逻辑音频组件管声音。你不需要手动去写 System 类来遍历所有实体因为编辑器帮你把挂上组件这个动作和运行时调度已经绑定好了。虽然听上去少了自定义 System 的灵活性但对大多数中小型项目来说这种开发方式足够用了。我更喜欢它的点在于你可以把一整套行为逻辑封装成预设或者模板然后复制出多个实体共用。比如做一个小怪物的行为组件包含移动、转向、受击状态你把它做出来一次场景里所有怪物都挂同一个脚本组件parameter 略有不同就能实现不同行为。这是一种很舒服的开发节奏写一次逻辑到处复用。有一个设计上的细节值得提Superpowers 的脚本是 TypeScript而且运行前会经过类型检查和转译。这意味着你不太容易写出类型错误到运行时才爆的代码编辑器会提前给你红色波浪线提示。这个体验对新手尤其友好刚上手时很多低级错误都被编译器拦在了运行之前。5.2 插件机制能带来什么Superpowers 的魅力有一大半在插件机制。前面提到的 game、web、live 插件只是官方提供的基础套件社区里还有不少扩展插件可以往编辑器里加各种功能。有人可能会问这跟 VS Code 装插件有什么差别差别在于Superpowers 的插件不只是给编辑器加按钮而是能深度介入项目内容的创建和运行过程。比如一个插件可以为项目引入新的资源格式支持或者定义新的组件类型这些都会真实反映在运行时里。插件机制让 Superpowers 不局限于游戏开发。装好 web 插件之后你可以在它里面搭互动网页应用配合实时协作能力做一个团队用的在线白板或者仪表盘之类的东西也完全可行。我一直觉得它不应该被贴上游戏引擎的单一标签它更像一个可编程的在线创作环境。这个定位意味着只要插件生态跟上它的边界可以不断扩展。当然插件生态不大是事实有些插件年久失修装上去可能跟当前版本不兼容。所以用插件前先看它最近的维护时间过于冷门的插件就要谨慎一点不要让它影响整个项目的稳定性。5.3 性能与导出的注意事项性能方面Superpowers 的编辑器确实不算轻量毕竟整个 IDE 都跑在浏览器里打开大场景时浏览器内存占用会明显上升。但运行时项目本身的性能反而还可以因为脚本都是直接跑在浏览器环境里没有中间层虚拟机拖累。如果你要做的游戏包含几百个物体、粒子特效、复杂的物理交互还是得注意一下场景优化跟别的引擎一样遵循少用实时光源、合理合并模型、控制 draw call这些基本原则。导出方面Superpowers 支持把项目构建成网页应用输出静态文件部署到任何静态托管平台上。这个对快速上线原型演示非常方便。我习惯把导出的文件夹测试一下在本地跑一个静态文件服务器确认页面能正常打开再丢到公网。因为浏览器对本地文件的访问限制直接双击 index.html 经常会遇到路径或跨域问题这不是项目本身的问题是浏览器的安全机制用npx serve或者 Python 的http.server起个本地服务就能绕开。6. 横向对比与上手体会6.1 和主流引擎放在一起看先把 Superpowers 跟 Unity、Godot 放在一起比很多人会觉得不太公平因为体积和生态完全不是一个量级。但正是这种差异能让它找到自己的生态位。表格对比一下会更直观维度SuperpowersUnity / GodotPhaser安装体量轻量Node 环境即可数 GB 的客户端轻量无编辑器编辑器形态浏览器内置桌面应用无编辑器纯代码多人实时协作原生支持需要第三方方案不支持3D 能力基础支持完善主要 2D社区与生态小但够用庞大庞大学习成本低中高中如果你只是渲一个低保真原型Superpowers 起步最快如果你的目标是商业级作品Unity 和 Godot 显然更有底气。Phaser 这种纯代码库适合已经知道要做什么、想完全掌控代码的人而 Superpowers 的好处在于可视化编辑和代码之间的平衡感更好。我个人的选择逻辑是项目周期短、需要多人协调、追求快速修改可视化内容的用 Superpowers项目周期长、复杂度高、需要成熟生态的用重引擎。6.2 适合它的三个实际场景第一个是教学设计。我带过一个入门编程小组让学生从零做一个小游戏最大的难题不是语法而是环境。有人装引擎装了一节课还没进主界面。Superpowers 没有这问题浏览器一开就能写代码、看效果学生之间还能互相看对方的项目课堂协作感很强。第二个是远程小团队的脑暴原型。产品、设计、开发三个人同时对一个交互方案做验证传统流程里你得反复截图、传文件、开会议看效果。Superpowers 里大家直接在同一场景里改边改边讨论效率高很多。第三个是个人学习 TypeScript 和 ECS 的练手环境。因为它足够轻你可以把学到的新想法立刻做成可视化的小实验反馈速度比写命令行脚本有意思多了。这种即时可见的正反馈对保持学习动力很有帮助。6.3 一个容易被忽略的定位自托管资产库最后说一个小众的用法把它当成团队内部的可视化资产库。Superpowers 管理资源的形态比较直观又能多人访问我见过有人把它用作团队内部的场景草图库用来快速展示关卡布局或者 UI 流程。这种用法不需要写多少代码纯粹利用它的可视化和协作特性效果意外地不错。换句话说不需要把所有项目都用它做完整交付只把它作为创意草稿纸和协作白板价值也已经值得安装一次了。这也是我个人折腾完一圈之后最推荐大家尝试的使用姿势。如果以后官方能补上更完善的离线模式和数据迁移工具它在我工具箱里的地位还会更高。现阶段来说把它定位成原型开发和教学协作的利器绝对是够格的。我自己已经把它写进日常推荐的轻量协作开发工具清单了如果你也在找这类东西不妨照着我上面的步骤装一次花不了多少时间。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进