前段时间抽空做了点cegui的优化,主要是内存消耗相关的。 基于序列化的目的引入的属性集虽然用起来确实很方便,但是也有自己的短板----相当的吃内存。加上cegui的字符串又是那么的庞大....
基本上一个最普通的Window窗口占用内存在7-8k左右,扩展一点的窗口达到10K很正常了,游戏中随便创建几个几千个小窗口也不足为奇。内存是相当的客观,这些都不算UI资源的占用---- 优化目的所在。
优化主要集中在属性集这块,这是细分定位出来的内存消耗大头所在,当然也就那它开刀了。优化方式是基于窗口的属性集关联关系移到基于类的属性集关联。这样优化会牵扯到比较多的地方改动,不过这些都是次要的。需要注意的是不要因为这个修改影响到窗口属性序列化功能,因为这是cegui的一个优势所在,同时也影响到布局编辑器的正常工作。
优化的另外一个地方就是体会了cegui的字符串。原始的cegui字符串支持utf8和utf32编码,使用的是utf8编码,同时存储是以4字节来存储,很耗内存。另外还有一个问题就是针对中文等的编码不正统,了解的人应该明白,这个可能是CE没有考虑或者说测试到位的地方,需要做一些完善,当然这些都不是什么大问题。目前使用了mbcs,直接使用了基于std::basic_string<char>来替换。暂时没有考虑用TCHAR,比较相对于我们的应用来说短期来说是足够了。
这样优化下来,基本上一个Window下来就占用2K左右了,效果显而易见。对于性能上的优化,分层渲染、引入RTT(需要比较好的规划)都是应该做的,这是大的方面,细节的就不多讲了。
此外,图片集的动态加载也是内存优化的一个方面。
后续: 关于属性集的优化做了,但是Falagard内部的优化还没有做。其实做优化也是一个折中,很多东西都可以做,只不过在内存 、 运行性能 、 扩展性和灵活性中做抉择罢了。
有小孩了,都没啥事情整自己的东西了,没事也就下下军旗斗斗地主,文章也只是兴趣了才东拼西凑,突然想起小时候写日记,嘿嘿,现在才能体会到那时候人家说写日记也是一种乐趣....