10万个实体同时运动,浏览器帧率锁死在60FPS——这不是原生应用的性能,是一个纯TypeScript引擎跑在Chrome里的成绩。开发者Misha Mitiev花了数月时间,在浏览器性能的"战壕"里挖出了这套名为Loom Engine的方案,最新版本v1.7.6。
这个项目源于一个具体需求:他需要为TheWorldTable.ai搭建一个确定性的、浏览器优先的模拟引擎。但很快发现,传统JavaScript面向对象编程(OOP)的玩法,撑不起他想要的规模。
![]()
核心架构:ECS + SoA
多数引擎用"游戏对象"组织代码。Loom选择了实体组件系统(ECS),搭配结构数组(SoA)内存布局。
简单说:不是存一堆"玩家"对象,而是用扁平的TypedArray存数据。传统对象在堆内存里东一块西一块,CPU找数据费劲(缓存未命中)。SoA方案把全部"位置"数据塞在一块连续内存,全部"速度"数据塞在另一块。遍历速度极快,对V8引擎特别友好。
确定性为何关键
Loom驱动的是AI模拟,必须100%确定性——相同输入,每次运行结果完全一致,换台浏览器也一样。TypeScript里实现这个,需要严格的SSE(服务器推送事件)网络层,以及不依赖可变帧率的核心循环。
当前攻坚方向
零分配循环:正在排查所有update循环里的new关键字,确保垃圾回收没有理由暂停模拟。
自定义WebGL2批处理:搭建直接从ECS缓冲区读取数据的渲染器,单次绘制调用画出数千实体。
一个对比数据:主界面UI只用28个实体,模拟启动后Loom能扩展到10万实体而不掉帧。Mitiev在社区里抛出话题:有人在浏览器里试过ECS吗?JavaScript/TypeScript性能优化里,什么最让你头疼?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.