返回首页
最新
Masthead 是一个开源的出版平台,采用 Elixir 和 Phoenix LiveView 构建。它最初是为了更简单地管理我个人博客的 Hugo 部署而开发的,后来发展成为一个支持多租户、自定义域名、主题和自托管的综合平台。
你好,在过去的一个月里,我对ECS(实体组件系统)学习了很多。
我目前正在从零开始开发一个机器人模拟器(使用Python和Raylib),由于缺乏游戏开发经验,我采用了“完全面向对象编程”的方式。我的场景对象(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的知识,开始在一个沙盒环境中进行一些实验,将update()函数转变为ECS。我的想法是将数据存储在列式的numpy数组(组件)中,并进行许多数据结构优化,以便快速查询场景对象和快速访问,例如:
```python
qr = scene.query(HasMotion, HasPosition) # 查询结果像一个形状为(N, ...)的numpy数组
qr.position += ... # 像numpy一样操作/向量化
```
无论如何,这个独立库只需要Python和numpy。Raylib仅用于渲染,但原始数据结构并不需要它。
我希望能得到一些反馈,比如它缺少什么,或者在模拟器开发过程中我可能会遇到的陷阱。
作为一个小插曲:我把Claude当作“工程经理”,我自己编写代码,它负责代码审查、任务管理和测试(对于边缘案例非常有用)。
[1] [hytale的ECS视频(适合初学者)](https://www.youtube.com/watch?v=qglU107_DA4)
[2] [Casey Muratori关于游戏行业第一个ECS的最新视频](https://www.youtube.com/watch?v=73Do0OScoOU)