mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-03-22 23:30:14 +00:00
Add 1GB RAM cache for decompressed MPQ files
Eliminates repeated MPQ decompression overhead by caching decompressed files in RAM with LRU eviction. Major performance improvement for file access. Problem: - Every readFile() call decompresses from MPQ (expensive!) - M2 models, textures, WMO files decompressed repeatedly - No caching of decompressed data - MPQ decompression is CPU-intensive (zlib/bzip2) Solution: - Added 1GB LRU file cache to AssetManager - Cache hit: instant return of decompressed data - Cache miss: decompress once, cache for future access - LRU eviction when cache full (removes least recently used) - Don't cache files >100MB (avoid giant WMO chunks) - Thread-safe with existing readMutex Implementation: - CachedFile struct: data + lastAccessTime - fileCacheAccessCounter for LRU tracking - Hit/miss statistics for monitoring - Budget: 1GB (modern RAM easily handles this) Performance impact: - First load: same speed (decompress + cache) - Subsequent loads: instant (no decompression) - Expected 70-90% hit rate during normal play - Huge benefit for frequently accessed models Cache stats logged on shutdown to monitor effectiveness.
This commit is contained in:
parent
34cd5a161d
commit
27d0496894
2 changed files with 75 additions and 3 deletions
|
|
@ -84,6 +84,13 @@ public:
|
|||
*/
|
||||
size_t getLoadedDBCCount() const { return dbcCache.size(); }
|
||||
|
||||
/**
|
||||
* Get file cache stats
|
||||
*/
|
||||
size_t getFileCacheSize() const { return fileCacheTotalBytes; }
|
||||
size_t getFileCacheHits() const { return fileCacheHits; }
|
||||
size_t getFileCacheMisses() const { return fileCacheMisses; }
|
||||
|
||||
/**
|
||||
* Clear all cached resources
|
||||
*/
|
||||
|
|
@ -97,6 +104,18 @@ private:
|
|||
mutable std::mutex readMutex;
|
||||
std::map<std::string, std::shared_ptr<DBCFile>> dbcCache;
|
||||
|
||||
// Decompressed file cache (LRU, 1GB budget for modern RAM)
|
||||
struct CachedFile {
|
||||
std::vector<uint8_t> data;
|
||||
uint64_t lastAccessTime;
|
||||
};
|
||||
mutable std::map<std::string, CachedFile> fileCache;
|
||||
mutable size_t fileCacheTotalBytes = 0;
|
||||
mutable uint64_t fileCacheAccessCounter = 0;
|
||||
mutable size_t fileCacheHits = 0;
|
||||
mutable size_t fileCacheMisses = 0;
|
||||
static constexpr size_t FILE_CACHE_BUDGET = 1024 * 1024 * 1024; // 1GB
|
||||
|
||||
/**
|
||||
* Normalize path for case-insensitive lookup
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue