如果您想为每种设备类型提供特定的资产集,我认为您走在正确的轨道上。我过去这样做的方式是使用rake
脚本,但任何你符合的make
-like/ -like 实用程序都可以。ant
本质上,在项目编译之前运行的任务之一是挖掘文件结构并以编程方式构建这些帮助类;它有助于避免手工构建这些映射的单调性。一旦您获得了一组重要的资产,这可能会让人感到麻木。
在我的项目中,我会有这样的结构:
/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;
}
该脚本将运行抓取文件夹/文件并在文件夹中生成 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。在代码中的其他任何地方,您只需传递对 IAssetSet 的引用,然后根据 IAssetSet.DPI 确定要做什么。
这是一种方法,但还有其他方法。
另一种方法是以最高 DPI 存储嵌入源图像,然后在应用程序加载时,将它们在内存中缩小到所需的 DPI 和dispose()
原始图像。
另一种方法,现在使用 Stage3D 和 Starling 和 nd2d 等框架更可行,您可以让 GPU(非常擅长进行这种缩放)完成传统合成真正可行的大部分繁重工作.
我认为,如果您使用的是传统合成,那么您可能会使用专门针对您需要的资产进行一些性能提升,而不是一直尝试动态调整它们的大小。Flash 有时会有点奇怪,因为它会在奇怪的时间重新生成这些资产的内部表示并降低性能。可能最好的方法是利用 Stage3D/Starling/nd3d,但是如果您构建了一个非平凡的代码库,那么在游戏的这个阶段切换渲染引擎可能是一项不平凡的任务......
至少,那是我的两分钱。也许其他人有不同的经历。