NIM_Duilib_Framework
NIM_Duilib_Framework copied to clipboard
关于图片缓存指针问题
问题现象
换肤后会调用RemoveAllImages清理缓存 ` void GlobalManager::RemoveAllImages() { for (auto it = m_aPreMessages.begin(); it != m_aPreMessages.end(); it++) { (*it)->GetRoot()->ClearImageCache(); }
m_mImageHash.clear();
} `
该函数中ClearImageCache只能清理ROOT BOX的图片缓存,并不能清理所有子控件的图片缓存
而Global中所保存的图片缓存map,中的图片指针是weak_ptr
所以在调用m_mImageHash.clear时并不会真正释放图片资源,而是要等到下次窗体刷新消息时,才会重新加载图片资源。
这样会导致控件中的图片缓存所保存的图片信息是上一次皮肤的图片资源,会在刷新页面的时候再触发OnImageInfoDestroy,并调用RemoveFromImageCache
void GlobalManager::RemoveFromImageCache(const std::wstring& imageFullPath) { auto it = m_mImageHash.find(imageFullPath); if (it != m_mImageHash.end()) { m_mImageHash.erase(it); } else { ASSERT(FALSE); } }
但此时m_mImageHash中其实已经没有了改图片资源,触发了多次ASSERT。
预期结果
这里建议是否可以将GlobalManger和Control中的图片信息指针存储方式调换一下,比如GlobalManager中使用share_ptr 而控件中使用weak_ptr,这样控件在刷新时取图片缓存仅需判断引用计数决定需要重新加载还是直接绘制,而不需要重新遍历一下GlobalManager中的mapper.于效率和逻辑上好像会更合理一点。