From 44dfb6061654d91a13e062a8465dbd119de9abdc Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Sat, 23 Jul 2005 03:09:55 +0000 Subject: [PATCH] run cleanups after deleting a screen via pop don't expose DeletePreparedScreens (unneeded; simplify the interface) --- stepmania/src/ScreenManager.cpp | 60 ++++++++++++++++++++------------- stepmania/src/ScreenManager.h | 1 - 2 files changed, 36 insertions(+), 25 deletions(-) diff --git a/stepmania/src/ScreenManager.cpp b/stepmania/src/ScreenManager.cpp index f57badf982..3107470d48 100644 --- a/stepmania/src/ScreenManager.cpp +++ b/stepmania/src/ScreenManager.cpp @@ -141,6 +141,39 @@ namespace } return false; } + + /* If we're deleting a screen, it's probably releasing texture and other + * resources, so trigger cleanups. */ + void AfterDeletingScreen() + { + /* Now that we've actually deleted a screen, it makes sense to clear out + * cached textures. */ + TEXTUREMAN->DeleteCachedTextures(); + + /* Cleanup song data. This can free up a fair bit of memory, so do it after + * deleting screens. */ + SONGMAN->Cleanup(); + } + + /* Called when changing screen groups. Delete all prepared screens, + * reset the screen group and list of persistant screens. */ + void DeletePreparedScreens() + { + FOREACH( LoadedScreen, g_vPreparedScreens, s ) + { + if( s->m_bDeleteWhenDone ) + SAFE_DELETE( s->m_pScreen ); + } + g_vPreparedScreens.clear(); + FOREACH( Actor*, g_vPreparedBackgrounds, a ) + SAFE_DELETE( *a ); + g_vPreparedBackgrounds.clear(); + + g_setGroupedScreens.clear(); + g_setPersistantScreens.clear(); + + AfterDeletingScreen(); + } }; void RegisterScreenClass( const CString& sClassName, CreateScreenFn pfn ) @@ -247,7 +280,10 @@ ScreenMessage ScreenManager::PopTopScreenInternal() else { if( ls.m_bDeleteWhenDone ) + { SAFE_DELETE( ls.m_pScreen ); + AfterDeletingScreen(); + } } return ls.m_SendOnPop; @@ -517,30 +553,6 @@ bool ScreenManager::ConcurrentlyPrepareScreen( const CString &sScreenName, Scree return true; } -void ScreenManager::DeletePreparedScreens() -{ - FOREACH( LoadedScreen, g_vPreparedScreens, s ) - { - if( s->m_bDeleteWhenDone ) - SAFE_DELETE( s->m_pScreen ); - } - g_vPreparedScreens.clear(); - FOREACH( Actor*, g_vPreparedBackgrounds, a ) - SAFE_DELETE( *a ); - g_vPreparedBackgrounds.clear(); - - g_setGroupedScreens.clear(); - g_setPersistantScreens.clear(); - - /* Now that we've actually deleted a screen, it makes sense to clear out - * cached textures. */ - TEXTUREMAN->DeleteCachedTextures(); - - /* Cleanup song data. This can free up a fair bit of memory, so do it after - * deleting screens. */ - SONGMAN->Cleanup(); -} - void ScreenManager::PushScreen( Screen *pNewScreen, bool bDeleteWhenDone, ScreenMessage SendOnPop ) { if( g_ScreenStack.size() ) diff --git a/stepmania/src/ScreenManager.h b/stepmania/src/ScreenManager.h index 1f8567a7f0..e5aba262e7 100644 --- a/stepmania/src/ScreenManager.h +++ b/stepmania/src/ScreenManager.h @@ -36,7 +36,6 @@ public: void PersistantScreen( const CString &sScreenName ); bool ConcurrentlyPrepareScreen( const CString &sScreenName, ScreenMessage send_when_done = SM_None ); bool IsConcurrentlyLoading() const; - void DeletePreparedScreens(); void PushScreen( Screen *pNewScreen, bool bDeleteWhenDone=false, ScreenMessage SendOnPop=SM_None ); void PopTopScreen( ScreenMessage SM ); Screen* MakeNewScreen( const CString &sName );