我正在使用AIR将Flash浏览器游戏转换为Mobile。使用Flash Builder Profiler我发现我的瓶颈是
[渲染] - 42.31% [预渲染] - 41.41%
我的应用程序花在渲染上的时间超过80%。游戏目前使用矢量图形作为UI元素,角色和宠物(最多可以有15个角色和15个宠物)。背景是位图。
我们已经将矢量字符和宠物转换为位图,并发现在某些情况下,矢量艺术动画很多,我们获得了很大的增益,但对于其他动画很少的角色,它实际上运行速度较慢(我相信因为重绘矢量艺术上的区域是如此之小。)
我相信我们在渲染方面获得的最大收获是删除矢量艺术,但我不认为我们在每种情况下制作动画位图的基本方法都更好。是否有任何优化的AS3库可以处理动画位图或转换矢量图?我非常感谢您指导我研究这些主题的任何资源。
谢谢!
答案 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。