XE4中FMX一些改进

今天把XE3的一些项目升级到了XE4,发现了一些不同.
1.Style文件格式发生了变化
2.FMX单元的做了一些拆分和调整.这个正是之前我最诟病的.FMX的单元引用十分混乱,一看就没有经过仔细的设计.
例如XE3中FMX.Types单元辗转竟然赢了ListBox,Edit等单元.
动画和滤镜等单元也比较恶心,一旦使用了一个特效就会引用全部特效类,因为单元初始化节把所有的特效都注册了,结果因为这些类用到过了,所以没法被优化掉.
如:FMX.Ani中

initialization
  RegisterFmxClasses([TColorAnimation, TGradientAnimation, TFloatAnimation,
    TRectAnimation, TBitmapAnimation, TBitmapListAnimation, TColorKeyAnimation,
    TFloatKeyAnimation, TPathAnimation]);

导致只要引用了这个单元这些所有的动画类都会被编译到结果中.
早期VCL的TPicture类是比较成功的,他单独处于Graphic单元中,其他图形实现则是在单独的单元中实现的,如对JPEG的支持.
JPEG单元中

initialization
  InitDefaults;
  TPicture.RegisterFileFormat('jpeg', sJPEGImageFile, TJPEGImage);
  TPicture.RegisterFileFormat('jpg', sJPEGImageFile, TJPEGImage);
finalization
  TPicture.UnregisterGraphicClass(TJPEGImage);
end.

也就是引用JPEG单元才会把这个单元的代码编译进来.如果FMX的Animation和Effects也这样设计就可以用到哪个特效才引用该特效所在的单元,而不是把所有的特效都一股脑在一个单元中实现,一股脑注册在一块.那么FMX编译出来的代码会小很多.

类似的还有3D的实现和2D的混在一起,即使不使用3D的项目也会把这部分代码编译进来.

现在XE4中Animation和Effects虽然还没这样做.但是其他的一些实现做了一些拆分,例如TLabel,TButton等类从FMX.Controls中拆出来到了FMX.StdCtrls中.还有一些类似单元拆分的变化.
例如FMX.Types是几乎所有FMX工程都要引用的单元.
但是XE3中

uses FMX.Grid, FMX.ListBox, FMX.Edit, FMX.Platform, FMX.Dialogs;

也就是相当于所有的FMX工程都会把Grids,ListBox,Edit编译进去.
而XE4中

uses FMX.Forms, FMX.Platform, FMX.Dialogs, FMX.Controls;

基本没用到的单元都被拆分出去了,尽管拆的还没想象的那么彻底,但是至少少了Grids,ListBox,Edit这三个单元中RegisterFmxClasses那些大量的类并且Controls单元中又拆分出去了大量的类.,实际体积缩减的还是挺厉害的.

因为FMX的架构是每个类都会RegisterFmxClasses,那么是实际凡是RegisterFmxClasses过的类编译器都没法优化掉,所以设计的时候类分门别类,单元中的类越少越好.极限就是每个类一个单元,只有不引用单元类才不会被编译到代码中.

说明易博龙FMX早期设计的比较匆忙,很多地方设计考虑的不是太合理,仅仅是为了实现出来.好事情是现在正在慢慢调整设计.

这些变化导致FMX项目编译出来的体积变小了,尽管还没到我们所希望的,但是是一种可喜的变化.希望后面能把动画/特效和3D等处理好.

空FMX工程
XE3的编译体积:Debug 19.8 MB Release 8.04 MB
XE4的编译体积:Debug 17.8 MB Release 4.68 MB

Debug空工程中 XE4 和XE3 各个单元所占的空间.

可见XE3中什么都不走也会引用FMX.Filter.Standard,FMX.Materials,FMX.Filter.Custom这几个单元.而且都很大,但是XE4中已经分离开了,空工程不会引用这些单元.

此条目发表在Delphi, 未分类分类目录。将固定链接加入收藏夹。

XE4中FMX一些改进》有5条回应

  1. TINTIN说:

    呵呵,很期待XE4

  2. bellsouth说:

    松哥 我想用FM开发一套界面程序,主要看重了他可以套style,请教一下用FM好呢 还是用贴图的方式好?

  3. admin说:

    如果想要炫,能换肤,能有各种滤镜以及动画的话FireMonkey最好了.而且也是趋势.还能跨平台,我同事做了一个Windows和Mac上的小工具,代码都没改,直接就可以在Mac上跑起来.

    只是现在FireMonkey易用性还有点点小问题,比如Style设计器就很不方便.仅仅是能用而已.

    不过由于FireMonkey是跨平台的,很多和平台相关的特性都没有,甚至有些东西要看源代码绕弯去搞.举个例子就是做托盘程序隐藏后把Application在TaskBar上的按钮隐藏掉就要绕点弯子.需要有比较多的相关平台上的开发经验,和代码阅读以及解决问题的能力.

评论已关闭。