About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Feb

    27

    管理 Feathers 资源的两种主要方式:一种是静态嵌入,另一种运行时动态加载。

    静态嵌入

    在 Feathers 中只需如下类似代码即可完成对主题资源的使用(现在新版的 Feathers 已经不需要一个类对象或对象的属性去保存对一个主题的引用了,直接 new 就可以):

    new MetalWorksMobileTheme()

    这种方式比较简单,适合初学者或资源文件不大的情况下。但这种方式要求更多的内存(基本上就是翻倍的内存要求),所以不适合资源文件非常大的情况:Flash 运行时环境在运行 SWF 文件时会存储整个 SWF 文件,当一个嵌入的资源文件被实例化的时候,它又会被复制一份到内存中,所以这种静态嵌入资源对内存的使用基本上会让内存翻一倍。

    在 MetalWorksMobileTheme 默认的这个主题中因为资源文件较小,所以影响不大,但一个自定义的主题资源文件可能会有非常大的内存需求,特别是在开发游戏时的那些大型资源,建义都使用运行时动态加载。

    运行时动态加载

    通过 Starling 的 AssetManager 类在运行时可以动态的加载资源文件,资源文件可以通过 URL 加载(网络服务器上的资源),在 AIR 环境里也可以直接加载本地文件系统中的资源文件。这种方式相对于静态嵌入资源的方式优点是使用内存较少,因为它只会在内存中出现一次,缺点是使用资源管理对象时会相对来说稍复杂一些。

    首先需要指定资源的位置,在一个 AIR 程序中,需要同时打包被引用的资源文件,比如,MetalWorksMobileThemeWithAssetManager 需要以下两个资源文件(MetalWorksMobileTheme 继承自 MetalWorksMobileThemeWithAssetManager ) 

    images/metalworks.xml
    images/metalworks.png

    然后通过下面的代码来告诉主题 images 目录(包含了上面两个文件)的位置在 File.applicationDirectory 下(当然这个资源文件的位置也可以放在其它子目录中):

    var theme:MetalWorksMobileThemeWithAssetManager =
        new MetalWorksMobileThemeWithAssetManager( File.applicationDirectory );

    然后侦听 theme 对象的 Event.COMPLETE 事件:

    theme.addEventListener( Event.COMPLETE, theme_completeHandler );

    当资源文件被加载完成后,并且可用于组件时,资源管理对象调度这个事件,换句话说,开发者必须等待这个事件调度后才能使用资源文件中的东西,否则就不会有任何纹理或其它东西可以提供给组件的皮肤,事件的侦听器可能是如下类似代码:

    private function theme_completeHandler( event:Event ):void
    {
        // the theme is ready!
        this.button = new Button();
        this.button.label = "Click Me";
        this.addChild( button );
    }

     PS:春节前我才刚升级到 Starling 1.6.0 与 Feathers 2.0.1 版本,过完春节后发现它们又分别升级到了 1.6.1 与 2.1.0 版本(并且 Feathers 已经开始出了 2.2 的测试版本),看来还是有不少人在用的样子