返回首页
最新
我通常用 C++ 开发网页游戏,但使用 Emscripten 总让我觉得有些过于复杂,因为我并不需要完整的 POSIX 模拟或庞大的标准库,只是为了在画布上渲染一些东西并处理基本的用户界面。
我想解决的主要问题是 JS/WASM 的互操作瓶颈。与其为每个调用使用标准的粘合代码,我将所有内容迁移到一个共享内存架构,使用命令和事件缓冲区。
它的工作原理是,我将所有的指令批量处理在 WASM 中,然后只向 JS 发送一个“刷新”信号。JS 端随后一次性直接从共享内存中读取所有内容。这种方式效率更高,我进行了一次基准测试,在画布上渲染 10,000 个矩形,结果差异显著:Emscripten 的帧率大约为 40 FPS,而我的设置达到了 100 FPS。
但是在 C++ 中编写 DOM 逻辑是非常痛苦的,所以我构建了 Coi。它是一种基于组件的语言,在编译时静态分析变化,以实现 O(1) 的反应性。与传统框架不同,它没有虚拟 DOM 的开销;编译器将状态变化直接映射到命令缓冲区中的特定句柄。
我最近对比了 Coi 和 React、Vue 在一个 1,000 行表格上的性能:在行创建、行更新和元素交换方面,Coi 表现最佳,因为它完全避免了“差异”步骤,并最小化了桥接跨越。它的包大小也是三者中最小的。
这个架构最酷的地方之一是标准库的工作方式。如果我想支持一个新的浏览器 API(比如 Web Audio 或新的 Canvas 功能),我只需将定义添加到我的 WebCC 模式文件中。当我重新编译 Coi 编译器时,该语言会自动获得一个新的标准库函数来访问该 API,完全不需要手动封装。
我对这个项目的进展感到非常自豪。它结合了自定义 WASM 堆栈的性能和一种让我觉得写起来很舒服的语法(至少对我来说是这样 :P)。此外,由于中间步骤是 C++,我还在考虑让它在服务器端工作,这样就可以在整个堆栈中共享组件。
示例(Coi 代码):
```coi
component Counter(string label, mut int& value) {
def add(int i) : void {
value += i;
}
style {
.counter {
display: flex;
gap: 12px;
align-items: center;
}
button {
padding: 8px 16px;
cursor: pointer;
}
}
view {
<div class="counter">
<span>{label}: {value}</span>
<button onclick={add(1)}>+</button>
<button onclick={add(-1)}>-</button>
</div>
}
}
component App {
mut int score = 0;
style {
.app {
padding: 24px;
font-family: system-ui;
}
h1 {
color: #1a73e8;
}
.win {
color: #34a853;
font-weight: bold;
}
}
view {
<div class="app">
<h1>Score: {score}</h1>
<Counter label="Player" &value={score} />
<if score >= 10>
<p class="win">You win!</p>
</if>
</div>
}
}
app {
root = App;
title = "My Counter App";
description = "A simple counter built with Coi";
lang = "en";
}
```
在线演示: [https://io-eric.github.io/coi](https://io-eric.github.io/coi)
Coi(语言): [https://github.com/io-eric/coi](https://github.com/io-eric/coi)
WebCC: [https://github.com/io-eric/webcc](https://github.com/io-eric/webcc)
我很想听听你的想法。虽然它仍然远未完成,但作为一个副项目,我对此感到非常兴奋 :)
在硅谷作为开发者工作了大约10年后,我到了一个阶段,感觉对这个领域已经失去了兴趣。无论我在工作中做什么,几乎都无法激励自己去关心,而我对周围同事的行为感到很烦躁。我曾经换过几家公司,想着可能是环境的问题,或者是公司正在做的事情不吸引我等,但无论去到哪里,过一段时间后总会感到同样的厌倦,这让我觉得是时候转向其他事情了。
有没有人从单纯的工程师转型到其他领域,并找到了更多的快乐?我愿意离开这个领域,虽然可能收入会减少。
介绍模态代理 SDK(非官方) - 将代理 SDK 移植到模态沙箱中运行。<p>示例:<a href="https://github.com/sshh12/modal-claude-agent-sdk-python/tree/main/examples" rel="nofollow">https://github.com/sshh12/modal-claude-agent-sdk-python/tree...</a>
嗨,HN,<p>这是一个简单的周末项目:网球,但通过打字来进行。试试看吧!