有没有办法只在编译时嵌入某些资产?

时间:2013-08-09 10:49:18

标签: actionscript-3 mobile air

我在FlashDevelop中设置了一个x平台AIR项目。 相同的代码库可以发布到iOS或Android目标。 我正在使用Adobe的纹理格式(ATF)来压缩纹理地图集,目前我将所有压缩文件嵌入到每个atf容器文件中(因此它包含用于桌面,iOS和Android GPU芯片组的纹理)

我的问题是我们的应用程序包含许多纹理地图集,显然我们希望将下载保持在最低限度,所以我想分别压缩不同的目标(即将有一个atf文件只有pvrtc压缩iOS,另一个只包含android的etc1压缩版本,并且只包含每个平台的兼容文件。

这个问题与ATF或压缩无关 - 我这一切都有效。

我想知道的是:有没有一个解决方案只能在编译时包含必要的(目标兼容的)文件?

我目前正在使用Embed元数据来包含.atf文件并且我在印象中元数据无法在编译时动态修改(即将嵌入源从xxx_ios.atf切换到xxx_android.atf,具体取决于选择了哪个目标)

我想可能还有其他解决方案,即在运行时使用加载程序,并且在编译时仅使用adt编译器中的参数包含相应的资产文件夹,但它并不理想 - 一个可以嵌入文件列表的简单开关在编译时,我认为会更好/更优雅,特别是如果我可以使这个纯粹动态,所以它由项目的目标配置/包含,而不是必须手动切换import语句。

关于实现这一目标的最佳方法的任何想法?

谢谢

1 个答案:

答案 0 :(得分:1)

条件编译是使用嵌入时完成此任务的一种方法:

  CONFIG::IOS {
    [Embed(source="foo_ios.atf", mimeType="application/octet-stream")]
      private var foo:Class;
  }

  CONFIG::ANDROID {
    [Embed(source="foo_android.atf", mimeType="application/octet-stream")]
      private var foo:Class;
  }

或者如果您决定使用加载器(尽管您必须修改构建以仅包含适当的资源目录。)

CONFIG::IOS {
  var url:String = "foo_ios.atf"
}

CONFIG::ANDROID {
  var url:String = "foo_android.atf"
}

然后,您需要使用以下定义修改构建选项(请注意,您必须同时定义两者,将一个设置为true,将一个设置为false)。 Flash Develop中有一个菜单(参见Flash Develop article,特别是中间的User-defined constants部分),但这里是您要定义的编译器命令:

对于iOS:

mxmlc Main.as -define=CONFIG::IOS,true -define=CONFIG::ANDROID,false

对于Andorid:

mxmlc Main.as -define=CONFIG::IOS,false -define=CONFIG::ANDROID,true

或者,您也可以在运行构建之前,从assetsassets_ios对符号链接(对于Mac / Linux)或复制(对于Windows)assets_android目录。这是一个预处理解决方案(如果您希望避免使构建复杂化),肯定会有其他解决方案。您可以使用Flash Develop的.bat文件,使其在构建之前运行预处理步骤。

相关问题