跳转至

SOUI 图片解码器系统

本文详细介绍了 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

最佳实践

  1. 开发阶段

    SComMgr *pComMgr = new SComMgr("imgdecoder-png");
    

  2. 发布阶段

    SComMgr *pComMgr = new SComMgr("imgdecoder-gdip");
    

  3. 性能优化

  4. 根据实际需求选择解码器
  5. 考虑图片格式和大小
  6. 注意内存占用

总结

SOUI的图片解码器系统提供了:

✓ 灵活的模块化设计
✓ 多种解码器选择
✓ 良好的扩展性
✓ 性能和功能的平衡

选择合适的解码器对于应用程序的性能和功能都有重要影响。开发者应该根据具体需求,在不同的场景下选择最适合的解码器。