发布信息
发布时间为2026年4月16日。
项目介绍
这是用MoQ实现的Twitch Plays Pokemon项目。不过为避免被任天堂起诉,大家玩自制游戏。模拟器运行在得克萨斯州的虚拟机上,玩完游戏后,需往下滚动查看博客正文。
架构是怎样的?
这里有N个模拟器工作节点和M个玩家,它们通过一条连接与通用的MoQ CDN进行所有数据交互。
如何实现按需服务?
MoQ有节省成本的秘密功能。当观众想要音频和/或视频时,会向MoQ CDN发送 `SUBSCRIBE` 请求,MoQ CDN会收集同一轨道的所有 `SUBSCRIBE` 请求并合并。运行模拟器的性能较弱的云虚拟机每个轨道最多只会收到一个 `SUBSCRIBE` 请求,无论观众数量多少。默认情况下,MoQ发布者只有在有活跃订阅时才会传输轨道。模拟器会对媒体进行编码,但像素会留在内存中,直到有观众观看。还会根据是否有活跃订阅来开启或关闭编码器:如果没有音频订阅,Opus编码器将休眠;如果没有视频订阅,H.264编码器将休眠。若既没有音频订阅也没有视频订阅,模拟器将休眠。除非有观众观看或收听,否则不会浪费CPU/GPU资源。对于Game Boy模拟器来说,节省带宽和CPU资源虽不是大事,但对于使用昂贵订阅服务的人很重要,比如没人想要字幕就别运行Whisper,没人想要H265格式就别进行转码,没人想看糟糕的游戏直播就把它丢到 `/dev/null` 里。而这一切都内置于MoQ中。
发现机制是怎样的?
普通做法是硬编码可用游戏列表,但MoqBoy使用了MoQ的实时发现可用广播的功能。有一个单独的二进制文件用于处理ROM,目前它们都在得克萨斯州运行。它们连接到最近的 `cdn.moq.dev` 节点,工作节点1发布 `demo/boy/big2small`,工作节点2发布 `demo/boy/opossum`。玩家首先会向MoQ CDN请求所有以 `demo/boy/` 为前缀的广播,当游戏上线或下线时,玩家会收到实时通知。另外,“opossum” 是个生造词。hang.live也是用这种方式发现其他用户的,用MoQ就好。
玩家如何玩游戏?
MoQ是单向协议,但观众也可以成为发布者。每个玩家都会发布一个名为 `demo/viewer/big2small/` 的广播,其中 `` 是随机生成的。他们会生成一个 `controls` 轨道,按下按钮时,会向该轨道写入一个JSON数据块。MoqBoy发布者使用发现机制来查找所有玩家,会订阅所有以 `demo/viewer/big2small/` 为前缀的广播的 `controls` 轨道。通过两个单向流实现了 “双向” 流。不直接在MoQ中构建双向流是因为涉及业务逻辑,比如MoqBoy使用无政府模式,发布者会订阅所有玩家的内容;杀人机器人可能想实施锁定模式,发布者只订阅一个玩家的内容;或者杀人机器人达到通用人工智能水平,不再想订阅任何可怜人类的内容。单向流容易进行广播,多个机器人可以订阅同一个 `killswitch` 轨道,且总是进行广播的协议更容易扩展,应用程序需要负责实现聚合逻辑。
能否自己运行项目?
可以自己运行这个项目,设置单仓库,然后运行 `just boy`。相关文件夹包括Rust发布者、JS播放器、Web/ROM相关内容。Software Mansion的团队正在努力开发React Native绑定,这里有一张在真机上运行MOQ BOY演示的截图。这绝对是游戏的未来。如果想在手机上使用MoQ,可以联系他们,也可以自己使用开源的 `Rust -> C/Kotlin/Swift/Python` 绑定。
这只是个模拟器小项目吗?
这不是一个有趣的模拟器小项目,而是一个关于如何将MoQ用于机器人、无人机和其他机器的演示,只要用摄像头的实时画面替换Game Boy模拟器,没人会发现区别。另外,已经开始承接项目以推动MoQ的试点应用,主要目标是扩展MoQ生态系统,即使要签署保密协议。如果有关于如何使用MoQ的建议、赞助一些开源贡献、用MoQ试点项目替换现有的糟糕设置等需求,可以发邮件或在Discord上私信。