1作者: meehai10 天前原帖
你好,在过去的一个月里,我对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)