大家好,在过去的一个月左右,我学到了很多关于ECS(Entity-Component-System)的知识,包括从这个视频https://www.youtube.com/watch?v=qglU107_DA4或从Casey Muratori关于游戏行业中第一款ECS的最新视频(https://www.youtube.com/watch?v=73Do0OScoOU)学习。
我目前正在从头开始开发一个机器人模拟器(python+raylib),由于缺乏游戏开发经验,我决定“全面面向对象”地开发它。一个SceneObject类包含了很多我称之为Traits的属性(例如Collidable、Movable等)。这些属性可以在运行时继承和固定。
主循环不可避免地变成了:
for scene_object in sim.scene_objects:
scene_object.update(...)
for scene_object in sim.scene_objects:
scene_object.draw(...)
然而,事实证明,如果有很多场景对象,这个循环会成为一个瓶颈,因为计算机喜欢连续的内存空间来缓存、物理/数学向量化等。
所以,我在一个沙盒环境中开始进行了一系列实验,尝试将update()函数转换为ECS,数据存储在列式numpy数组(组件)中,另外进行了大量数据结构优化来查询场景对象和快速访问等。
例如:
qr = scene.query(HasMotion, HasPosition) # 查询结果
qr.position += ... # 操作像numpy/向量化
无论如何,这个独立库在这里:https://github.com/Meehai/microecs(也在pip上)。它只需要python和numpy。Raylib仅用于渲染,但原始数据结构不需要它。
我非常希望得到一些反馈,例如它缺少什么或我在模拟器开发过程中会遇到的陷阱。
附注:我只用CLAUDE作为工程经理,我自己编写了代码,CLAUDE进行了代码审查和测试(对于边缘案例非常有用)。
评论 (0)