我正在开发Flash(AS3)中的小游戏,它使用小磁贴生成关卡。
图块的位置,宽度,高度和其他属性在生成时存储在数组中。每个图块都添加到同一个容器动画片段中。生成所有切片后,容器动画片段将转换为位图,从舞台中删除所有切片,并从舞台中删除原始容器,然后将其删除。除了播放器之外,位图是舞台上唯一剩下的“图形”。
这比在游戏过程中单独渲染所有60,000多个图块产生更好的性能;然而,随着瓦片数量的增加,帧率仍然会降低。这没有任何意义,因为无论瓷砖的数量多少,所有瓷砖都会添加到始终具有相同尺寸的单个位图。
在发电过程中有2万个瓷砖,游戏以完整的FPS运行,但是60,000它运行相对不稳定,可能大约4-5 FPS。
我已经删除了碰撞检测以及通过磁贴阵列运行的任何/每个脚本,以排除脚本的其他CPU密集部分滞后帧速率的可能性。
任何想法为什么,尽管事实上所有的牌都已从舞台上移除并且他们的容器被删除,但即使背景位图包含相同数量的数据而不管生成的牌数是多少,游戏仍然运行缓慢?
这是级别生成算法的最后一部分,它将容器动画片段转换为位图,然后删除所有的片段:
var temp_bitmap_data:BitmapData = new BitmapData(this.stage_background_mc.width,this.stage_background_mc.height);
temp_bitmap_data.draw(this.stage_background_mc);
this.stage_background_bitmap = new Bitmap(temp_bitmap_data);
main_class.main.stage.addChild(this.stage_background_bitmap);
for (var block in blocks_array)
{
//every block in blocks_array has a child that is the actual graphic of the tile
blocks_array[block]["block"].removeChild(blocks_array[block]["block"].getChildAt(0));
if (blocks_array[block]["type"] == "bg_block")
{
this.stage_background_mc.removeChild(blocks_array[block]["block"]);
blocks_array[block]["block"] = null;
}
if (blocks_array[block]["type"] == "path_block")
{
//path_blocks have a second child in addition to the first one that's already been removed. the second child is the only other child
blocks_array[block]["block"].removeChild(blocks_array[block]["block"].getChildAt(0));
this.stage_background_mc.removeChild(blocks_array[block]["block"]);
}
}
this.stage_background_mc = null;
[编辑] 这是一张游戏图片,可让您更好地了解正在发生的事情:
即使从舞台上删除最终创建的位图,最终只有1个子舞台,并将删除的位图设置为null也不会提高速度。
答案 0 :(得分:4)
一些想法。
首先,你有点利用AS3的快速工作和blitting。您对舞台上只有一个Bitmap
,但前面的步骤(将DisplayObjects
添加到MovieClip
以及在draw
上执行MovieClip
时有了正确的想法{1}})不是最快的过程。首先,BitmapData.draw
比BitmapData.copyPixels
慢(here是一个帖子)。获得速度的最佳方法之一是预先显示所有图形,并将其存储为BitmapData
。然后,为每个图形保留Object
个引用(包含位置等)。在渲染循环中,遍历每个对象,并使用copyPixels
将图形的像素信息复制到单个舞台上位图中的相应位置。这样,所有慢速BitmapData.draw
命令都发生在前面,现在你只是推动像素,Flash真的很快。
然而,这个过程并非没有缺点。例如,你不能用它做简单的变换。例如,您必须预先旋转所有旋转帧,以便旋转单个图形(因为您无法旋转BitmapData,并且您没有在{{1}上使用draw
}})。尽管如此,如果你能忍受这些限制,它仍然会很快。
这是一个post,作为我上面解释过程的教程。它虽旧,但信息量很大。
最后,60,000是一个非常大的数字。 Flash并不是一个“速度恶魔”。无论如何优化,最终你都会达到极限。请记住一些事情。
哦,这个额外的post提供了一些关于Flash性能的好建议。