1 分•作者: theindianappguy•14 天前
返回首页
最新
1 分•作者: leonidasrup•14 天前
1 分•作者: rustoo•14 天前
1 分•作者: CloudHackerFr•14 天前
1 分•作者: JeanKage•14 天前
1 分•作者: birdculture•14 天前
1 分•作者: jancizmar•14 天前
44 分•作者: paulmooreparks•14 天前
1 分•作者: ilya_m•14 天前
1 分•作者: dijkstra_j•14 天前
Masthead 是一个使用 Elixir 和 Phoenix LiveView 构建的开源发布平台。最初是为了更简便地管理我个人博客的 Hugo 部署而创建的,现已发展成为一个支持自定义域名、主题和自托管的多租户平台。
1 分•作者: ilreb•14 天前
1 分•作者: JacobDover•14 天前
1 分•作者: wagojaux•14 天前
1 分•作者: roschdal•14 天前
1 分•作者: Hydrocarb0n•14 天前
1 分•作者: janandonly•14 天前
2 分•作者: shallow-mind•14 天前
1 分•作者: meehai•14 天前
你好,在过去的一个月里,我学到了很多关于 ECS [1,2] 的知识。
我目前正在从头开始开发一个机器人模拟器(Python + Raylib),由于缺乏游戏开发经验,我在这上面“全盘 OOP”了。我创建了一个 `SceneObject`,它拥有许多继承的接口(例如 `Collidable`、`Movable` 等)。这些接口是在运行时继承和固定的。
主循环不可避免地变成了这样:
```python
for scene_object in sim.scene_objects:
scene_object.update(...)
for scene_object in sim.scene_objects:
scene_object.draw(...)
```
事实证明,如果有很多场景对象,这会成为一个瓶颈,因为计算机为了缓存、物理/数学向量化等原因,更喜欢连续的内存。
最近我学到了更多关于 ECS [1,2] 的知识,我开始在一个沙盒环境中进行大量实验,将 `update()` 函数转换为 ECS。其思想是数据存储在列式 NumPy 数组(组件)中,并辅以大量数据结构优化,用于查询场景对象和快速访问,例如:
```python
qr = scene.query(HasMotion, HasPosition) # 查询结果类似于形状为 (N, ...) 的 np 数组
qr.position += ... # 操作方式类似于 numpy / 向量化
```
无论如何,独立的库只需要 Python 和 NumPy。Raylib 只用于渲染,但原始数据结构不需要它。
我很想听听大家对它的反馈,例如它缺少什么,或者在模拟器开发过程中我稍后会遇到的陷阱。
作为一件趣事:我使用 Claude 作为“工程经理”,我亲自编写代码,它负责代码审查、任务管理和测试(对于边界情况非常有用)。
[1] <a href="https://www.youtube.com/watch?v=qglU107_DA4" rel="nofollow">https://www.youtube.com/watch?v=qglU107_DA4</a> Hytale 的 ECS 视频(非常适合初学者)
[2] Casey Muratori 关于游戏行业第一个 ECS 的最新视频(<a href="https://www.youtube.com/watch?v=73Do0OScoOU" rel="nofollow">https://www.youtube.com/watch?v=73Do0OScoOU</a>)
1 分•作者: keyle•14 天前
1 分•作者: abhij89•14 天前