SOUI, UI, just so so!

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 568|回复: 1

如何减少使用SOUI开发的产品的编译的EXE的大小

[复制链接]

14

主题

25

帖子

252

积分

超级版主

Rank: 8Rank: 8

积分
252
发表于 2017-12-15 11:40:46 | 显示全部楼层 |阅读模式
SOUI是一个DirectUI项目,目前随着越来越多的控件的加入,使用SOUI开发的产品的EXE文件也在增加,问题的关键在于链接了大量不需要的控件进来。
有没有办法在不修改代码的情况下减少EXE体积呢?
答案是肯定的。但是方法可能有点麻烦。
首先要把整个SOUI项目使用模块全静态的方式进行编译。这样在生成EXE的时候才能有选择的链接必须的代码。
然后是有选择的注册系统提供的控件。
新版本的SOUI的SApplication构造函数中多了一个参数 pSysObjRegister:
  1. /**
  2.      * SApplication
  3.      * @brief    构造函数
  4.      * @param    IRenderFactory * pRendFactory --  渲染模块
  5.      * @param    HINSTANCE hInst --  应用程序句柄
  6.      * @param    LPCTSTR pszHostClassName --  使用SOUI创建窗口时默认的窗口类名
  7.          * @param    ISystemObjectRegister *pSysObjRegister -- 系统控件注册器
  8.      *
  9.      * Describe  
  10.      */
  11.     SApplication(IRenderFactory *pRendFactory,HINSTANCE hInst,LPCTSTR pszHostClassName=_T("SOUIHOST"), ISystemObjectRegister *pSysObjRegister = new SObjectDefaultRegister());
复制代码
如果不提供这个参数,则自动注册全部系统控件。有了这个参数,你可以实现这个参数需要的接口,在里面有选择的注册需要的控件。这样那些不需要的控件就不会注册到APP中了,也就减少了这部分控件的代码。
示例可以参考demos/360/360.cpp
  1. //注册系统控件,只注册当前APP里需要的控件,可以减小静态链接生成的APP的体积。
  2. class CSystemObjectRegister : public TObjRefImpl<ISystemObjectRegister>
  3. {
  4. public:
  5.         void RegisterWindows(SObjectFactoryMgr *objFactory)
  6.         {
  7.                 objFactory->TplRegisterFactory<SWindow>();
  8.                 objFactory->TplRegisterFactory<SPanel>();
  9.                 objFactory->TplRegisterFactory<SStatic>();
  10.                 objFactory->TplRegisterFactory<SButton>();
  11.                 objFactory->TplRegisterFactory<SImageWnd>();
  12.                 objFactory->TplRegisterFactory<SProgress>();
  13.                 objFactory->TplRegisterFactory<SImageButton>();
  14.                 objFactory->TplRegisterFactory<SCheckBox>();
  15.                 objFactory->TplRegisterFactory<SIconWnd>();
  16.                 objFactory->TplRegisterFactory<SRadioBox>();
  17.                 objFactory->TplRegisterFactory<SLink>();
  18.                 objFactory->TplRegisterFactory<SGroup>();
  19.                 objFactory->TplRegisterFactory<SAnimateImgWnd>();
  20.                 objFactory->TplRegisterFactory<SScrollView>();
  21.                 objFactory->TplRegisterFactory<SToggle>();
  22.                 objFactory->TplRegisterFactory<SCaption>();
  23.                 objFactory->TplRegisterFactory<STabCtrl>();
  24.                 objFactory->TplRegisterFactory<STabPage>();
  25.                 objFactory->TplRegisterFactory<SHeaderCtrl>();
  26.                 objFactory->TplRegisterFactory<SListCtrl>();
  27.         }

  28.         void RegisterSkins(SObjectFactoryMgr *objFactory)
  29.         {
  30.                 objFactory->TplRegisterFactory<SSkinImgList>();
  31.                 objFactory->TplRegisterFactory<SSkinImgFrame>();
  32.                 objFactory->TplRegisterFactory<SSkinButton>();
  33.                 objFactory->TplRegisterFactory<SSkinScrollbar>();
  34.         }

  35.         void RegisterLayouts(SObjectFactoryMgr *objFactory)
  36.         {
  37.                 objFactory->TplRegisterFactory<SouiLayout>();
  38.         }
  39. };
复制代码
在这里只注册了一种布局,系统支持的线性布局,网格布局都没有注册。

回复

使用道具 举报

14

主题

25

帖子

252

积分

超级版主

Rank: 8Rank: 8

积分
252
 楼主| 发表于 2017-12-15 11:48:19 | 显示全部楼层
实践证明通过这样处理,最大可能可以从1M减少到700K
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|Setoutsoft Inc. ( 粤ICP备18051196-1 )

GMT+8, 2018-11-17 22:42 , Processed in 0.052517 second(s), 6 queries , File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表