SOUI 图片解码器系统¶
Warning
The current page still doesn't have a translation for this language.
You can read it through google translate.
本文详细介绍了 SOUI 中的图片解码器系统,包括其架构设计、不同解码器的特点以及如何选择合适的解码器。
系统架构¶
SOUI 的图片解码器被设计为独立的模块,这种模块化设计带来以下优势:
- 支持多种图片格式
- 可以根据需求选择不同的解码器
- 方便扩展和维护
- 优化资源占用
内置解码器¶
SOUI 提供了四种图片解码器:
解码器名称 | 支持格式 | 特点 |
---|---|---|
imgdecoder-png | 仅PNG | 支持APNG动画 |
imgdecoder-gdip | 全格式 | 基于GDI+ |
imgdecoder-wic | 全格式 | 基于WIC |
imgdecoder-stb | 全格式 | 基于stb |
默认配置¶
在debug模式下,SOUI默认使用imgdecoder-png作为解码器,这主要是为了: - 演示APNG动画功能 - 减小调试版本的体积 - 提供更快的调试体验
解码器配置¶
基本用法¶
在实例化 SComMgr 时指定解码器:
// 使用GDI+解码器
SComMgr *pComMgr = new SComMgr("imgdecoder-gdip");
// 使用默认解码器
SComMgr *pComMgr = new SComMgr();
实现细节¶
SComMgr类中的解码器创建逻辑:
class SComMgr
{
public:
SComMgr(LPCTSTR pszImgDecoder = NULL)
{
if(pszImgDecoder)
m_strImgDecoder = pszImgDecoder;
else
m_strImgDecoder = COM_IMGDECODER;
}
BOOL CreateImgDecoder(IObjRef ** ppObj)
{
if(m_strImgDecoder == _T("imgdecoder-wic"))
return SOUI::IMGDECODOR_WIC::SCreateInstance(ppObj);
else if(m_strImgDecoder == _T("imgdecoder-stb"))
return SOUI::IMGDECODOR_STB::SCreateInstance(ppObj);
else if(m_strImgDecoder == _T("imgdecoder-png"))
return SOUI::IMGDECODOR_PNG::SCreateInstance(ppObj);
else if(m_strImgDecoder == _T("imgdecoder-gdip"))
return SOUI::IMGDECODOR_GDIP::SCreateInstance(ppObj);
else
{
SASSERT(0);
return FALSE;
}
}
};
解码器选择指南¶
1. 开发阶段¶
- 使用 imgdecoder-png
- 快速调试
- 支持APNG
- 占用资源少
2. 生产环境¶
- 推荐 imgdecoder-gdip 或 imgdecoder-wic
- 支持全格式
- 性能稳定
- 兼容性好
3. 特殊需求¶
- APNG动画:imgdecoder-png
- 最小体积:imgdecoder-png
- 最大兼容性:imgdecoder-gdip
性能考虑¶
各解码器性能特点:
解码器 | CPU占用 | 内存占用 | 加载速度 |
---|---|---|---|
png | 低 | 低 | 快 |
gdip | 中 | 中 | 中 |
wic | 中 | 中 | 中 |
stb | 低 | 低 | 快 |
最佳实践¶
-
开发阶段
SComMgr *pComMgr = new SComMgr("imgdecoder-png");
-
发布阶段
SComMgr *pComMgr = new SComMgr("imgdecoder-gdip");
-
性能优化
- 根据实际需求选择解码器
- 考虑图片格式和大小
- 注意内存占用
总结¶
SOUI的图片解码器系统提供了:
✓ 灵活的模块化设计
✓ 多种解码器选择
✓ 良好的扩展性
✓ 性能和功能的平衡
选择合适的解码器对于应用程序的性能和功能都有重要影响。开发者应该根据具体需求,在不同的场景下选择最适合的解码器。