mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-23 04:22:34 +00:00
- be a bit more aggressive with the GC when not running the game loop.
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
This commit is contained in:
parent
88be3b8a1b
commit
b4d03501af
4 changed files with 22 additions and 1 deletions
|
@ -229,6 +229,7 @@ DObject::DObject ()
|
|||
ObjNext = GC::Root;
|
||||
GCNext = nullptr;
|
||||
GC::Root = this;
|
||||
GC::AllocCount++;
|
||||
}
|
||||
|
||||
DObject::DObject (PClass *inClass)
|
||||
|
@ -238,6 +239,7 @@ DObject::DObject (PClass *inClass)
|
|||
ObjNext = GC::Root;
|
||||
GCNext = nullptr;
|
||||
GC::Root = this;
|
||||
GC::AllocCount++;
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
@ -275,6 +277,7 @@ DObject::~DObject ()
|
|||
|
||||
void DObject::Release()
|
||||
{
|
||||
if (GC::AllocCount > 0) GC::AllocCount--;
|
||||
DObject **probe;
|
||||
|
||||
// Unlink this object from the GC list.
|
||||
|
|
|
@ -108,6 +108,7 @@ namespace GC
|
|||
size_t AllocBytes;
|
||||
size_t Threshold;
|
||||
size_t Estimate;
|
||||
size_t AllocCount;
|
||||
DObject *Gray;
|
||||
DObject *Root;
|
||||
DObject *SoftRoots;
|
||||
|
|
|
@ -43,6 +43,9 @@ namespace GC
|
|||
// Number of bytes currently allocated through M_Malloc/M_Realloc.
|
||||
extern size_t AllocBytes;
|
||||
|
||||
// Number of allocated objects since last CheckGC call.
|
||||
extern size_t AllocCount;
|
||||
|
||||
// Amount of memory to allocate before triggering a collection.
|
||||
extern size_t Threshold;
|
||||
|
||||
|
@ -105,10 +108,15 @@ namespace GC
|
|||
}
|
||||
|
||||
// Check if it's time to collect, and do a collection step if it is.
|
||||
static inline void CheckGC()
|
||||
static inline bool CheckGC()
|
||||
{
|
||||
AllocCount = 0;
|
||||
if (AllocBytes >= Threshold)
|
||||
{
|
||||
Step();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Forces a collection to start now.
|
||||
|
|
|
@ -1316,6 +1316,15 @@ void G_Ticker ()
|
|||
default:
|
||||
break;
|
||||
}
|
||||
// Do some more aggressive GC maintenance when the game ticker is inactive.
|
||||
if ((gamestate != GS_LEVEL && gamestate != GS_TITLELEVEL) || paused || P_CheckTickerPaused())
|
||||
{
|
||||
size_t ac = std::max<size_t>(10, GC::AllocCount);
|
||||
for (size_t i = 0; i < ac; i++)
|
||||
{
|
||||
if (!GC::CheckGC()) break;
|
||||
}
|
||||
}
|
||||
|
||||
// [MK] Additional ticker for UI events right after all others
|
||||
primaryLevel->localEventManager->PostUiTick();
|
||||
|
|
Loading…
Reference in a new issue