尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证No WebAssembly engine: a 3D game engine for the browser with no WebAssembly at all (no WASM, WebAssembly-free, WebAssemblyless) — a game engine without WebAssembly, in plain TypeScript on three.js. Streaming levels, BVH collision, GPU particles, FSR 1, frame generation. Runs on low-end Chromebooks.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗No WebAssembly engine — a 3D game engine for the browser with no WebAssembly in it at all (no WASM, WebAssembly-free, WebAssemblyless): plain TypeScript on three.js. Live demo
A 3D game engine for the browser, written in TypeScript on three.js — with no WebAssembly anywhere in it. It is the engine underneath SANGUINE, a fast first-person shooter built to run on low-end machines like a school Chromebook, taken out on its own: just the engine, none of the game.
Many browser engines that do real physics or heavy geometry lean on WebAssembly: a physics library compiled from C++ or Rust, a mesh optimiser, a navigation library. Arterial does all of its work in plain JavaScript (TypeScript compiled down) and on the GPU, and that buys it a lot:
.wasm file does not start there at all; Arterial only needs JavaScript and WebGL 2..wasm to fetch and compile before
the first frame, and no async instantiation step to orchestrate at start-up. The engine is part of the same
JavaScript bundle as the game and is ready the moment the page is.npm install and
Vite are the whole toolchain.engine/ — the core.
World: entities, an event bus, a level format (LevelFile, plain JSON), loading and saving.StaticChunks): the level is cut into cells, each baked into merged meshes and
collision with hidden faces culled; cells are built as the camera nears them and let go as it leaves.boss:start,
boss:phase, boss:health, boss:defeated[:<id>], boss:reset). The boss itself — model, moves, attacks — is
the game's: an entity that owns a BossEncounter and acts on its state.LevelSet of levels in order (each a file in hand, or a function that fetches or builds
one), loaded by id, and gone on from by an event from anything in a level — level:exit to the next,
level:goto:<id> to a named one — with level:loading / level:loaded / level:complete / levels:finished
announced and reached/finished progress saved as plain data.physics/ — the collision system: a BVH over the baked level, moving bodies, ray casts, capsule tests.
core/ — a fixed-step loop (120 Hz simulation, interpolated rendering), input with pointer lock, persisted settings.
render/ — procedural surface textures and materials (no image files needed), the level material, a procedural sky, an AMD FidelityFX Super Resolution 1 port (EASU + RCAS), an upscaler, frame generation (reprojection), dynamic resolution, a GPU timer, mesh decimation for level-of-detail copies.
entities/ — the engine's own entity types: brush (level geometry), spawn, trigger (event volumes),
light. A game registers its own beside them with registerEntity.
prefabs/geometry — helpers for building placeable pieces out of parts laid out in fractions of their size.
npm install
npm run dev # the example scene: http://localhost:5173
npm run build # type-check and build
The example (example/main.ts) is the smallest useful program: a level loaded from JSON, baked and streamed, a
sky, a smoke stream and bursts of sparks, a camera circling it, and the fixed-step loop driving it all.
import { World, Loop, registerCoreEntities, applySky, prepareLevelMaterial } from './src'
registerCoreEntities()
const world = new World()
prepareLevelMaterial(renderer)
applySky(world.scene)
world.load(level) // a LevelFile: { name, version: 1, entities: [...] }
world.particles.register('sparks', { layers: [{ style: 'streak', count: 24, speed: 9, spread: 0.9, life: 0.6, size: 0.05, color: 0xffc070, gravity: 14 }] })
const loop = new Loop(
(dt) => world.update(dt),
() => {
world.updateLod(camera.position)
world.particles.update(loop.stats.frameMs / 1000, camera)
renderer.render(world.scene, camera)
},
)
loop.start()
A browser with WebGL 2. Dependencies: three and three-mesh-bvh (both MIT).
src/render/fsr1.ts, with AMD's
notice kept).