开源游戏引擎
原生游戏,源自 TypeScript
编写 TypeScript,发布原生游戏。无需浏览器,无需 C++。Bloom 会提前编译你的游戏,并在 Metal、DirectX 12、Vulkan 和 WebGPU 上运行 —— 一套代码库,六个目标平台,开箱即用的真正 PBR 渲染与物理。
import { initWindow, windowShouldClose,
beginDrawing, endDrawing,
clearBackground, drawText,
Colors } from "bloom";
initWindow(800, 450, "My Game");
while (!windowShouldClose()) {
beginDrawing();
clearBackground(Colors.RAYWHITE);
drawText("Hello, Bloom!",
190, 200, 20, Colors.DARKGRAY);
endDrawing();
} 为什么选择 Bloom?
Bloom 是唯一一款让你用 TypeScript 编写并发布真正原生游戏的引擎。无需 Electron、无需 WebView、无需浏览器运行时。你的代码由 Perry 编译器提前编译,并基于 Rust 核心运行。
简洁 API
整个 API 一张速查表就能装下。没有类,没有继承,没有黑魔法,只有你调用的函数。
真正原生
一套渲染器,四个后端 —— Metal、DirectX 12、Vulkan 和 WebGPU。开箱即用的 PBR 材质、级联阴影、TAA 与后处理特效。
处处可发布
一套代码库即可覆盖 macOS、Windows、Linux、iOS、tvOS 和 Web。Steam、App Store 和 itch.io 均可发布。
你需要的一切
九个模块化子系统,均可独立导入。只用你需要的部分。
Core
窗口创建、游戏循环、输入处理、计时与帧控制。
bloom/core Shapes
2D 图形绘制 —— 直线、矩形、圆形、多边形 —— 以及碰撞检测。
bloom/shapes Textures
图像加载、纹理管理、精灵批处理与渲染到纹理。
bloom/textures Text
TTF 与 OTF 字体加载、文本渲染与度量。
bloom/text Audio
音效、音乐流播放、3D 位置音频,支持 WAV / OGG / MP3。
bloom/audio Models
glTF 2.0 加载、GPU 骨骼动画、PBR 材质、网格基本体。
bloom/models Math
向量、矩阵、四元数、缓动函数与随机数生成。
bloom/math Physics
由 Jolt 驱动的刚体与软体、角色控制器、载具、射线检测、约束。
bloom/physics Scene
保留模式场景图 —— 变换、可见性、阴影、材质绑定。
bloom/scene 一套代码库,所有平台。
Bloom 通过单一的 wgpu 渲染器在每个平台上映射到原生图形 API。你的 TypeScript 编译为真正的二进制文件 —— 或为 Web 编译为 WASM 包。
最新动态
Bloom 正在积极开发中 —— 仅最近几周就有 300 多次提交。近期亮点:
Auto-DRS 与 CAS 锐化
动态渲染缩放会自动调整以匹配你的目标 FPS,并通过升采样加 RCAS 锐化通道在分数分辨率下保持清晰。
平面反射 + 纹理数组
类似镜面的平面反射,支持斜裁剪与 IBL 回退。通过带 mips 的纹理数组绑定实现地形 splat 贴图。
Imposter baker 命令行工具
为远距离 LOD 烘焙八面体图集 —— 在不撑爆绘制调用预算的前提下发布茂密森林与人群。
可堆叠的后处理通道
ACES / AgX 色调映射、自动曝光、bloom、景深、运动模糊、SSGI、SSAO、TAA —— 通过乒乓渲染目标进行组合。
跨平台 HiDPI
Windows、Linux 和 Web 现在共享与 macOS、iOS 一致的 HiDPI 处理方式。你的 UI 在每种显示器上都保持锐利。
WGSL 着色器热重载
保存着色器,一秒内即可看到效果。开发期间材质会就地重新编译。
熟悉的模式,原生的力量
纯接口、纯函数,零黑魔法。如果你懂 TypeScript,你就懂 Bloom。
2D 图形与碰撞
import { drawRect, drawCircle,
checkCollisionRecs } from "bloom/shapes";
drawRect(100, 100, 200, 80, Colors.GREEN);
drawCircle(400, 300, 50, Colors.GOLD);
if (checkCollisionRecs(player, enemy)) {
playSound(hitSound);
} 3D 相机与模型
const camera: Camera3D = {
position: { x: 10, y: 10, z: 10 },
target: { x: 0, y: 0, z: 0 },
up: { x: 0, y: 1, z: 0 },
fovy: 45, projection: 0
};
beginMode3D(camera);
drawModel(tree, { x: 0, y: 0, z: 0 });
drawGrid(10, 1);
endMode3D();