@@ -9,24 +9,32 @@ namespace wde::resource {
99 WDE_PROFILE_FUNCTION ();
1010 logger::log (LogLevel::DEBUG, LogChannel::RES) << " Ticking for resource manager." << logger::endl;
1111
12- // Delete resources that need to be deleted
13- for (auto & res : _resourcesToDelete) {
12+ // Select resources that need to be deleted
13+ std::vector<decltype (_resourcesToDelete)::key_type> vecToDelete;
14+ for (auto && el : _resourcesToDelete) {
1415 // Decrease ticks
15- res .second . first --;
16+ el .second --;
1617
1718 // If no ticks remaining, delete
18- if (res.second .first <= 0 ) {
19- if (res.second .second ->getReferenceCount () > 0 ) {
20- _resourcesToDelete.erase (res.first );
19+ if (el.second <= 0 ) {
20+ // Resource not loaded or reloaded since last time
21+ if (!_resources.contains (el.first ) || _resources.at (el.first )->getReferenceCount () > 0 ) {
22+ vecToDelete.emplace_back (el.first );
2123 continue ;
2224 }
2325
24- logger::log (LogLevel::DEBUG, LogChannel::RES) << " Releasing resource \" " << res. first << " \" . " << logger::endl;
25- _resourcesByType[res. second . second ->getType ()].erase (res .first );
26- _resources.erase (res .first );
27- _resourcesToDelete. erase (res .first );
26+ // Release resource
27+ _resourcesByType[_resources. at (el. first ) ->getType ()].erase (el .first );
28+ _resources.erase (el .first );
29+ vecToDelete. emplace_back (el .first );
2830 }
2931 }
32+
33+ // Erase resources that need to be deleted
34+ for (auto && key : vecToDelete) {
35+ logger::log (LogLevel::DEBUG, LogChannel::RES) << " Releasing resource \" " << key << " \" ." << logger::endl;
36+ _resourcesToDelete.erase (key);
37+ }
3038 }
3139
3240 void WdeResourceManager::cleanUp () {
0 commit comments