With the delayed handling of internal references of destroyed objects the function now returned without making sure that it really got everything.
Repeating until it cannot delete anything new anymore makes it work again as intended.
- Have a real finalizer stage for destroying objects instead of mixing them
in to the sweep stage.
- Base GC rate on a running average of the allocation rate instead of basing
it on the amount of time taken since the last sweep started.
- More GC stats for better tweaking.
- Previous comments in dobjgc.cpp suggested that StepMul was used
to determine how quickly garbage was collected based on how quickly
memory was being allocated. This was not the case. Now it is.
- Remove calls to CheckGC from the thinkers. With GC running at a
stable rate (once per frame), there should be no need to inject
pauses into the collection process to keep it from injecting stutters
(provided StepMul is sane). The risk of running out of memory because
we don't run a collection pass absolutely every thinker should be
practically zero.
- Reduce DEFAULT_GCMUL from 400 to 200, since it does what it says now
instead of something else.
Since most CheckGC calls are within the main game ticker, the engine can accumulate a lot of data when creating/deleting objects in the menu or other UI parts and never manage to collect everything