| 72 | static_assert(MIN_REQUESTED_TIME_FOR_PENDING < MIN_UNLOAD_TIME_PENDING, "Unloading pending skins must take longer than adding more pending skins"); |
| 73 | |
| 74 | void CSkins::CSkinContainer::RequestLoad() |
| 75 | { |
| 76 | if(m_AlwaysLoaded) |
| 77 | { |
| 78 | return; |
| 79 | } |
| 80 | |
| 81 | // Delay loading skins a bit after the load has been requested to avoid loading a lot of skins |
| 82 | // when quickly scrolling through lists or if a player with a new skin quickly joins and leaves. |
| 83 | if(m_State == EState::UNLOADED) |
| 84 | { |
| 85 | const std::chrono::nanoseconds Now = time_get_nanoseconds(); |
| 86 | if(!m_FirstLoadRequest.has_value() || |
| 87 | !m_LastLoadRequest.has_value() || |
| 88 | Now - m_LastLoadRequest.value() > MAX_REQUESTED_TIME_FOR_PENDING) |
| 89 | { |
| 90 | m_FirstLoadRequest = Now; |
| 91 | m_LastLoadRequest = m_FirstLoadRequest; |
| 92 | } |
| 93 | else if(Now - m_FirstLoadRequest.value() > MIN_REQUESTED_TIME_FOR_PENDING) |
| 94 | { |
| 95 | m_State = EState::PENDING; |
| 96 | } |
| 97 | } |
| 98 | else if(m_State == EState::PENDING || |
| 99 | m_State == EState::LOADING || |
| 100 | m_State == EState::LOADED) |
| 101 | { |
| 102 | m_LastLoadRequest = time_get_nanoseconds(); |
| 103 | } |
| 104 | |
| 105 | if(m_State == EState::PENDING || |
| 106 | m_State == EState::LOADED) |
| 107 | { |
| 108 | if(m_UsageEntryIterator.has_value()) |
| 109 | { |
| 110 | m_pSkins->m_SkinsUsageList.erase(m_UsageEntryIterator.value()); |
| 111 | } |
| 112 | m_pSkins->m_SkinsUsageList.emplace_front(Name()); |
| 113 | m_UsageEntryIterator = m_pSkins->m_SkinsUsageList.begin(); |
| 114 | } |
| 115 | } |
| 116 | |
| 117 | CSkins::CSkinContainer::EState CSkins::CSkinContainer::DetermineInitialState() const |
| 118 | { |
no test coverage detected