Actionscript 3 基于包装器的资产嵌入

Actionscript 3 基于包装器的资产嵌入,actionscript-3,air,compilation,assets,Actionscript 3,Air,Compilation,Assets,情况如下。目前,我正在开发一个空中游戏,将包含大量的位图资产。我希望瞄准几款平板电脑(iPad、Xoom等),因此,我正在考虑用不同的ppi制作这些资产,以便在设备间实现更高的视觉一致性。我不太关心分辨率,因为我将使用滚动来查找屏幕上不适合的资产;但是,无论使用何种设备,单位、建筑物和敌人的外观都应该基本相同 问题是: 这可以做到吗?如何做到(基于包装商?) 这样做的最佳方式是什么 我应该麻烦吗 到目前为止,我想到的唯一一个想法是为每个目标设备(实际上是ppi)提供一个应用程序文件,该文件会

情况如下。目前,我正在开发一个空中游戏,将包含大量的位图资产。我希望瞄准几款平板电脑(iPad、Xoom等),因此,我正在考虑用不同的ppi制作这些资产,以便在设备间实现更高的视觉一致性。我不太关心分辨率,因为我将使用滚动来查找屏幕上不适合的资产;但是,无论使用何种设备,单位、建筑物和敌人的外观都应该基本相同

问题是:

  • 这可以做到吗?如何做到(基于包装商?)
  • 这样做的最佳方式是什么
  • 我应该麻烦吗

到目前为止,我想到的唯一一个想法是为每个目标设备(实际上是ppi)提供一个应用程序文件,该文件会提取一个与设备ppi对应的大位图注册表。对于所有这些应用程序,静态注册表类本质上是相同的,只是在
[Embed]
指向的文件名(以及明显的类名)上有所不同。

如果您想为每种设备类型提供特定的资产集,我认为您的做法是正确的。我过去这样做的方式是使用
rake
脚本,但是任何与之兼容的
make
-like/
ant
-like实用程序都可以。从本质上讲,在项目编译之前运行的任务之一是挖掘文件结构并以编程方式构建这些助手类;它有助于避免手工构造这些映射的单调性。一旦你得到了一套非琐碎的资产,这会让你头脑麻木

在我的项目中,我的结构如下:

/ProjectRoot
    /src

    /imgs
        /132dpi
            /unit1.jpg
            /unit2.jpg
            .
        /160dpi
            /unit1.jpg
            /unit2.jpg
            .
        /264dpi
            /unit1.jpg
            /unit2.jpg
            .
        /326dpi
            /unit1.jpg
            /unit2.jpg
            .
我通常会有一些我所有的资产都会遵守的接口,比如

public interface IAssetSet {
     function get DPI():uint;
     function get Unit1():BitmapData;
     function get Unit2():BitmapData;
}
脚本将运行scrape文件夹/文件,并在文件夹中生成actionscript类,如
/src/assets
。诸如此类

public class AssetSet132dpi implements IAssetSet {

    public function get DPI():uint { return 132; }

    [Embed("img/132dpi/unit1.jpg")]
    private var _unit1Class:Class;
    private var _unit1:BitmapData;
    public function get Unit1():BitmapData { return _unit1; }

    [Embed("img/132dpi/unit2.jpg")]
    private var _unit2Class:Class;
    private var _unit2:BitmapData;
    public function get Unit2():BitmapData { return _unit2; }

    ...

    public function AssetSet132dpi() {
        _unit1 = BitmapData(new _unit1Class()).bitmapData;
        _unit2 = BitmapData(new _unit2Class()).bitmapData;
        ....
    } 
}
在初始化代码中,您可以确定正在哪个设备上运行,或者只为特定设备预编译,并实例化所需的dpi。在代码的其他地方,您只需传递对IASetSet的引用,并根据IASetSet.DPI确定要做什么

这是一种方法,但还有其他方法

另一种方法是将源图像存储在最高DPI的位置,然后在应用程序加载时,将它们在内存中缩小到所需的DPI,并
dispose()
原始图像

另一种方法,在Stage3D和Starling和nd2d等框架中更为可行,你可以让GPU——它非常擅长进行这种扩展——完成大部分传统合成中真正可行的繁重工作

我认为,如果您使用的是传统的合成,那么您可能会看到一些性能提升,使用特定大小的资产来满足您的需要,而不是一直尝试动态调整它们的大小。Flash有时会有点奇怪,因为它会在奇怪的时间重新生成这些资产的内部表示,并降低性能。也许最好的方法是利用Stage3D/Starling/nd3d,但是如果你建立了一个非常重要的代码库,那么在游戏的这个时候切换渲染引擎可能是一个非常重要的任务


至少,那是我的两分钱。也许其他人有过不同的经历。

谢谢你的详尽回答和一些好主意。我认为使用TexturePacker之类的工具可以部分避免刮擦/构建(似乎将尽可能少的次数上传到gpu是一种更好的做法)。然而,我目前主要关心的是性能。超级炒作的Stage3D支持GPU——一旦在设备上运行,即使是非常简单的低级测试也会运行得相当糟糕。