3

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

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

然而,这个问题与 ATF 或压缩无关 - 我已经完成了所有工作。

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

我目前正在使用嵌入元数据来包含 .atf 文件,并且我认为元数据不能在编译时动态修改(即根据哪个目标将嵌入源从 xxx_ios.atf 切换到 xxx_android.atf选择)

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

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

谢谢

4

1 回答 1

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 文章,特别是User-defined constants中间的部分),但这里是您将定义的编译器命令:

对于 iOS:

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

对于安多里德:

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

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

于 2013-08-14T15:26:05.173 回答