I'm working on a video game which requires high performance so I'm trying to setup a good memory strategy or a specific part of the game, the part that is the game "model", the game representation.
I have an object containing a whole game representation, with different managers inside to keep the representation consistent, following the game rules. Every game entity is currently generated by a type-specific factory, so I have several factories that allow me to isolate and change the memory management of those entities as I wish.
Now, I'm in the process of choosing between those two alternatives:
Now, I had some real worlds experiences with the A so I'm not experienced with B and would like some advice regarding those solutions, for a long-life project. Which solution seem better for a long-life project and why? (Note: a pool is really necessary in this case because the game model is used for game editing too so there will be lot of allocation/deallocation of little objects).
Edit for clarification: I'm using C++ if (it's not clear yet)
“Standard” pool sizes The standard dimensions available on the market are: 6×3 metre pools (also 6×2 and 6×4 metre pools), i.e. an area of 18m² 7×3 metre pools (also 7×4 and 7×5 metre pools), i.e. an area of 21m² 8×4 metre pools (also 8×3 and 8×5 metre pools), i.e. an area of 32m²
A lap pool is a swimming pool built and used for fitness and health purposes. Relatively shallow and narrow, these are not pools for diving boards and water slides, but rather for enjoying daily workouts by swimming laps. Typically, lap pools are rectangular in shape, which can make them ideal for long, narrow lots.
Play pools are pools that are shallow at both ends and deeper in the middle. Typically play pool depths are three feet deep at each end and five feet in the middle, but you can customize the depths to suit you. Works best for: Play pools are a versatile pool design that's a favorite with both adults and kids.
The correct answer is specific to your problem domain. But in the problem domains that I work, the first is usually the one we choose.
I do realtime or near realtime code. Audio editing and playback mostly. In in that code, we generally cannot afford to allocate memory from the heap down in the playback engine. Most of the time malloc returns fast enough, but sometimes it doesn't. And that sometimes matters.
So our solutions is to have specific pools for certain objects, and use the general pool for everything else. The specific pools have a certain number of elements preallocated, and are implemented as a linked list (actually a queue), so allocation and release is never more than a couple of pointer updates and the cost of entering and leaving a critical section.
As a fallback for unusual cases; when someone needs to allocate from a special pool and it's empty - we will allocate a hunk of general memory (several objects) and add that to the special pool. Once an allocation is part of the special pool, it is NEVER returned to the general pool until the app exits or starts a new project.
Making good choices about the initial size and maximum size of the special pools are an important part of tuning the application.
One problem that you'll run into is that STL implementations are allowed to assume that two allocators of the same type are equivalent. This is the reason that Boost.Pool uses only one pool (technically it uses a different pool for each type). I.E., your allocators are not allowed to have any non-static members in the general case. If you're making a video game and you know that your STL implementation does not have this problem, then don't worry about this -- however there might still be some issues with list::splice
and std::swap
on containers.
It's not practical to use stl or boost for any type of video game, for starters. You can be absolutely sure the second you use one stl container your memory is fragmented and your performance is hopelessly in the toilet compared to the ideal at least (since most everyone's code is in this category most people never notice and can't really compare to anything else). I didn't always think so strongly but over time I have seen even a couple lines of code is like a little gremlin that will eventually some day cause you great pain.
The first method is most common, and as someone who's done both it's probably the only way that's practical if you don't want to spend a lot lot LOT more time and energy on the problem than it's probably worth to you. The second way is better because it's more general and yet can be tailored to your exact needs, but it's a lot of work and not something to jump into lightly.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With