I'm currently developing a robotics simulator from scratch (python+raylib) and, due to lack of game dev experience I went "full OOP" on it. A SceneObject with a lot of inherited interfaces (e.g. Collidable, Movable etc.). These are inherited and fixed at run time.
The main loop inevitably became:
for scene_object in sim.scene_objects:
scene_object.update(...)
for scene_object in sim.scene_objects:
scene_object.draw(...)
Well, it turns out that this can become a bottleneck if you have many scene objects because computers love contiguous memory for caching, physics/math vectorization and so on.Having recently learned more about ECS[1,2], I started doing a bunch of experiments in a sandbox with turning the update() function into ECS. The idea is that the data is stored in columnar numpy arrays (components) + a lot of data structure optimizations for querying scene objects and fast access e.g.
qr = scene.query(HasMotion, HasPosition) # query result acting like a np array of (N, ...) shape
qr.position += ... # operate like numpy / vectorized
In any case, the standalone library only needs python and numpy. Raylib is only for rendering, but the raw data structures don't need it.I'd love some feedback on it, e.g. what is it missing or what are gotchas I'll find out later on during the simulator development.
As an anecdote: I used Claude as an 'engineering manager', I wrote the code myself, it did the code review, tasks management and tests (super useful for corner cases).
[1] https://www.youtube.com/watch?v=qglU107_DA4 hytale's ECS video (great for beginners)
[2] Casey Muratori's latest video about the first ECS in the game industry (https://www.youtube.com/watch?v=73Do0OScoOU)

Discussion (0 Comments)Read Original on HackerNews
No comments available or they could not be loaded.