Adobe AIR - 如何针对Mobile进行优化

时间:2015-05-02 23:36:07

标签: actionscript-3 mobile air

我正在使用AIR将Flash浏览器游戏转换为Mobile。使用Flash Builder Profiler我发现我的瓶颈是

[渲染] - 42.31% [预渲染] - 41.41%

我的应用程序花在渲染上的时间超过80%。游戏目前使用矢量图形作为UI元素,角色和宠物(最多可以有15个角色和15个宠物)。背景是位图。

我们已经将矢量字符和宠物转换为位图,并发现在某些情况下,矢量艺术动画很多,我们获得了很大的增益,但对于其他动画很少的角色,它实际上运行速度较慢(我相信因为重绘矢量艺术上的区域是如此之小。)

我相信我们在渲染方面获得的最大收获是删除矢量艺术,但我不认为我们在每种情况下制作动画位图的基本方法都更好。是否有任何优化的AS3库可以处理动画位图或转换矢量图?我非常感谢您指导我研究这些主题的任何资源。

谢谢!

2 个答案:

答案 0 :(得分:1)

。避免使用矢量图形。

。保持Starling引擎和类似的绝对情况,图形显示性能必须是最佳的。使用这些引擎需要超精确的GPU内存管理+上传到GPU非常慢且CPU很重(应用程序因内存过载而崩溃)。如果必须使用它,请仅将其用于需要执行的图形部分。

。使用blittering和BitmapData很多。在大多数情况下,技术足以获得非常快速和灵活的图形显示。

答案 1 :(得分:1)

您可以创建常规mcs(矢量,jpgs,位图,动态文本等),创建位图副本以及删除常规mcs。您可以将位图放在动画片段和子动画片段中,并以60fps平滑移动它们,只要您使用的总ram合理(需要时使用池)。 Scout会告诉你

以下是一些显示将常规mcs转换为位图图块的代码 - 您必须将位图的尺寸保持在设备的最大值以下,因此简单的解决方案是将设备的屏幕尺寸用作最大值。

//  set the bmp dimensions to device screensize to prevent exceeding device's max bmp dimensions
if (bStagePortrait) {
    iTileWidth = Capabilities.screenResolutionX;
    iTileHeight = Capabilities.screenResolutionY;
} else {
    iTileWidth = Capabilities.screenResolutionY;
    iTileHeight = Capabilities.screenResolutionX;
}

//  mcList.mcListVector is the source mc - a regular mc containing mcs, jpgs, dynamic text, vector shapes, etc.
//  mcList.mcListBmp is an empty mc

aListTiles = new Array();
iNumberOfTiles = Math.ceil(mcList.height / iTileHeight);

for (i = 0; i < iNumberOfTiles; i++) {
    var bmpTile: Bitmap;
    //  move the source mc
    mcList.mcListVector.y = -(i * iTileHeight);
    bmpTile = fDrawTile(mcList, 0, 0, iTileWidth, iTileHeight);
    mcList.mcListBmp.addChild(bmpTile);
    bmpTile.x = 0;
    bmpTile.y = (i * iTileHeight);
    aListTiles.push(bmpTile);
}

//  remove the regular mc
mcList.mcListVector.removeChild(mcList.mcListVector.mcPic);
mcList.mcListVector.mcPic = null;
mcList.removeChild(mcList.mcListVector);
mcList.mcListVector = null;
}


function fDrawTile(pClip: MovieClip, pX: int, pY: int, pWidth: int, pHeight: int): Bitmap {
    trace("fDrawTile: " + pX + "," + pY + "  " + pWidth + "," + pHeight);
    var rectTemp: Rectangle = new Rectangle(pX, pY, pWidth, pHeight);
    var bdClip: BitmapData = new BitmapData(pWidth, pHeight, true, 0x00000000);
    var bdTemp: BitmapData = new BitmapData(pWidth, pHeight, true, 0x00000000);
    bdClip.draw(pClip, null, null, null, rectTemp, true);
    bdTemp.copyPixels(bdClip, rectTemp, new Point(0, 0));
    var bmpReturn: Bitmap = new Bitmap(bdTemp, "auto", true);
    return bmpReturn;
}

此转换会暂停你的fps一秒钟,但是你可以使用常规代码(补间)以60fps移动mcList。