VideoCommon: handle asset memory going over reserved limit correctly by erroring when the memory is exceeded and not allowing more assets to load until memory is released
This commit is contained in:
parent
70b7a59456
commit
b669580aeb
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
#include "VideoCommon/Assets/CustomAssetLoader.h"
|
#include "VideoCommon/Assets/CustomAssetLoader.h"
|
||||||
|
|
||||||
#include "Common/Logging/Log.h"
|
|
||||||
#include "Common/MemoryUtil.h"
|
#include "Common/MemoryUtil.h"
|
||||||
#include "VideoCommon/Assets/CustomAssetLibrary.h"
|
#include "VideoCommon/Assets/CustomAssetLibrary.h"
|
||||||
|
|
||||||
|
@ -48,19 +47,22 @@ void CustomAssetLoader::Init()
|
||||||
m_asset_load_thread.Reset("Custom Asset Loader", [this](std::weak_ptr<CustomAsset> asset) {
|
m_asset_load_thread.Reset("Custom Asset Loader", [this](std::weak_ptr<CustomAsset> asset) {
|
||||||
if (auto ptr = asset.lock())
|
if (auto ptr = asset.lock())
|
||||||
{
|
{
|
||||||
|
if (m_memory_exceeded)
|
||||||
|
return;
|
||||||
|
|
||||||
if (ptr->Load())
|
if (ptr->Load())
|
||||||
{
|
{
|
||||||
std::lock_guard lk(m_asset_load_lock);
|
std::lock_guard lk(m_asset_load_lock);
|
||||||
const std::size_t asset_memory_size = ptr->GetByteSizeInMemory();
|
const std::size_t asset_memory_size = ptr->GetByteSizeInMemory();
|
||||||
if (m_max_memory_available >= m_total_bytes_loaded + asset_memory_size)
|
m_total_bytes_loaded += asset_memory_size;
|
||||||
|
m_assets_to_monitor.try_emplace(ptr->GetAssetId(), ptr);
|
||||||
|
if (m_total_bytes_loaded > m_max_memory_available)
|
||||||
{
|
{
|
||||||
m_total_bytes_loaded += asset_memory_size;
|
ERROR_LOG_FMT(VIDEO,
|
||||||
m_assets_to_monitor.try_emplace(ptr->GetAssetId(), ptr);
|
"Asset memory exceeded with asset '{}', future assets won't load until "
|
||||||
}
|
"memory is available.",
|
||||||
else
|
|
||||||
{
|
|
||||||
ERROR_LOG_FMT(VIDEO, "Failed to load asset {} because there was not enough memory.",
|
|
||||||
ptr->GetAssetId());
|
ptr->GetAssetId());
|
||||||
|
m_memory_exceeded = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
#include "Common/Flag.h"
|
#include "Common/Flag.h"
|
||||||
|
#include "Common/Logging/Log.h"
|
||||||
#include "Common/WorkQueueThread.h"
|
#include "Common/WorkQueueThread.h"
|
||||||
#include "VideoCommon/Assets/CustomAsset.h"
|
#include "VideoCommon/Assets/CustomAsset.h"
|
||||||
#include "VideoCommon/Assets/MaterialAsset.h"
|
#include "VideoCommon/Assets/MaterialAsset.h"
|
||||||
|
@ -67,6 +68,11 @@ private:
|
||||||
std::lock_guard lk(m_asset_load_lock);
|
std::lock_guard lk(m_asset_load_lock);
|
||||||
m_total_bytes_loaded -= a->GetByteSizeInMemory();
|
m_total_bytes_loaded -= a->GetByteSizeInMemory();
|
||||||
m_assets_to_monitor.erase(a->GetAssetId());
|
m_assets_to_monitor.erase(a->GetAssetId());
|
||||||
|
if (m_max_memory_available >= m_total_bytes_loaded && m_memory_exceeded)
|
||||||
|
{
|
||||||
|
INFO_LOG_FMT(VIDEO, "Asset memory went below limit, new assets can begin loading.");
|
||||||
|
m_memory_exceeded = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
delete a;
|
delete a;
|
||||||
});
|
});
|
||||||
|
@ -85,6 +91,7 @@ private:
|
||||||
|
|
||||||
std::size_t m_total_bytes_loaded = 0;
|
std::size_t m_total_bytes_loaded = 0;
|
||||||
std::size_t m_max_memory_available = 0;
|
std::size_t m_max_memory_available = 0;
|
||||||
|
std::atomic_bool m_memory_exceeded = false;
|
||||||
|
|
||||||
std::map<CustomAssetLibrary::AssetID, std::weak_ptr<CustomAsset>> m_assets_to_monitor;
|
std::map<CustomAssetLibrary::AssetID, std::weak_ptr<CustomAsset>> m_assets_to_monitor;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue