Yeah, they generally tend to be gameplay/engine specific. Much in the same way that you wouldn't want to use an open world(heavy emphasis on streaming, instancing) for a fighting game(no frame drops ever, 60 fps) and vice-versa.
Usually they get broken down into a couple discreet subsystem:
1. Particle systems - Pooled, fixed size.
2. Per-level/region entity pooling - Tuned based on encounter.
3. Strings, etc - Usually preallocated to avoid fragmentation.
4. Ring/command buffers - Again, fixed size and mostly preallocated. Generally used for rendering and job systems.
There's a couple other case I'm missing and as always a lot of this is also biased not only towards avoiding allocation but also arranging data in memory in such a way that it's friendly to your L1/L2 cache(things accessed sequentially laid out in memory sequentially, SoA/AoS and all that good stuff).
There's a lot of really impressive engineering that goes into things like allocation, in-place loading, seek-free loading(less so now with caching to HDD) and the like.
Usually they get broken down into a couple discreet subsystem:
1. Particle systems - Pooled, fixed size.
2. Per-level/region entity pooling - Tuned based on encounter.
3. Strings, etc - Usually preallocated to avoid fragmentation.
4. Ring/command buffers - Again, fixed size and mostly preallocated. Generally used for rendering and job systems.
There's a couple other case I'm missing and as always a lot of this is also biased not only towards avoiding allocation but also arranging data in memory in such a way that it's friendly to your L1/L2 cache(things accessed sequentially laid out in memory sequentially, SoA/AoS and all that good stuff).
There's a lot of really impressive engineering that goes into things like allocation, in-place loading, seek-free loading(less so now with caching to HDD) and the like.