perf: 添加内存缓存

This commit is contained in:
Xu Liu 2021-11-16 20:32:51 +08:00
commit c955e8d3bf
3 changed files with 38 additions and 4 deletions

View file

@ -152,10 +152,29 @@ std::wstring EffectCache::_GetCacheFileName(const wchar_t* fileName, std::string
return fmt::format(L".\\cache\\{}_{}.{}", ConvertFileName(fileName), StrUtils::UTF8ToUTF16(hash), _SUFFIX);
}
void EffectCache::_AddToMemCache(const std::wstring& cacheFileName, const EffectDesc& desc) {
_memCache[cacheFileName] = desc;
if (_memCache.size() > _MAX_CACHE_COUNT) {
// 清理一半内存缓存
auto it = _memCache.begin();
std::advance(it, _memCache.size() / 2);
_memCache.erase(_memCache.begin(), it);
SPDLOG_LOGGER_INFO(logger, "已清理内存缓存");
}
}
bool EffectCache::Load(const wchar_t* fileName, std::string_view hash, EffectDesc& desc) {
std::wstring cacheFileName = _GetCacheFileName(fileName, hash);
auto it = _memCache.find(cacheFileName);
if (it != _memCache.end()) {
desc = it->second;
return true;
}
if (!Utils::FileExists(cacheFileName.c_str())) {
return false;
}
@ -205,6 +224,8 @@ bool EffectCache::Load(const wchar_t* fileName, std::string_view hash, EffectDes
desc = {};
return false;
}
_AddToMemCache(cacheFileName, desc);
SPDLOG_LOGGER_INFO(logger, "已读取缓存 " + StrUtils::UTF16ToUTF8(cacheFileName));
return true;
@ -280,5 +301,7 @@ void EffectCache::Save(const wchar_t* fileName, std::string_view hash, const Eff
SPDLOG_LOGGER_ERROR(logger, "保存缓存失败");
}
_AddToMemCache(cacheFileName, desc);
SPDLOG_LOGGER_INFO(logger, "已保存缓存 " + StrUtils::UTF16ToUTF8(cacheFileName));
}

View file

@ -7,11 +7,22 @@
class EffectCache {
public:
static bool Load(const wchar_t* fileName, std::string_view hash, EffectDesc& desc);
static EffectCache& GetInstance() {
static EffectCache instance;
return instance;
}
static void Save(const wchar_t* fileName, std::string_view hash, const EffectDesc& desc);
bool Load(const wchar_t* fileName, std::string_view hash, EffectDesc& desc);
void Save(const wchar_t* fileName, std::string_view hash, const EffectDesc& desc);
private:
void _AddToMemCache(const std::wstring& cacheFileName, const EffectDesc& desc);
std::unordered_map<std::wstring, EffectDesc> _memCache;
static constexpr const size_t _MAX_CACHE_COUNT = 100;
static std::wstring _GetCacheFileName(const wchar_t* fileName, std::string_view hash);
// 缓存文件后缀名Compiled MagpieFX

View file

@ -1086,7 +1086,7 @@ UINT EffectCompiler::Compile(const wchar_t* fileName, EffectDesc& desc) {
} else {
md5 = Utils::Bin2Hex(hash.data(), hash.size());
if (EffectCache::Load(fileName, md5, desc)) {
if (EffectCache::GetInstance().Load(fileName, md5, desc)) {
// 已从缓存中读取
return 0;
}
@ -1262,7 +1262,7 @@ UINT EffectCompiler::Compile(const wchar_t* fileName, EffectDesc& desc) {
return 1;
}
EffectCache::Save(fileName, md5, desc);
EffectCache::GetInstance().Save(fileName, md5, desc);
return 0;
}