尽管所有图块都转换为单个位图,但基于图块的游戏中的Flash / AS3帧率很低

时间:2012-06-10 17:36:56

标签: actionscript-3 flash

我正在开发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;

[编辑] 这是一张游戏图片,可让您更好地了解正在发生的事情: the game level

[更新:]

即使从舞台上删除最终创建的位图,最终只有1个子舞台,并将删除的位图设置为null也不会提高速度。

1 个答案:

答案 0 :(得分:4)

一些想法。

首先,你有点利用AS3的快速工作和blitting。您对舞台上只有一个Bitmap,但前面的步骤(将DisplayObjects添加到MovieClip以及在draw上执行MovieClip时有了正确的想法{1}})不是最快的过程。首先,BitmapData.drawBitmapData.copyPixels慢(here是一个帖子)。获得速度的最佳方法之一是预先显示所有图形,并将其存储为BitmapData。然后,为每个图形保留Object个引用(包含位置等)。在渲染循环中,遍历每个对象,并使用copyPixels将图形的像素信息复制到单个舞台上位图中的相应位置。这样,所有慢速BitmapData.draw命令都发生在前面,现在你只是推动像素,Flash真的很快。

然而,这个过程并非没有缺点。例如,你不能用它做简单的变换。例如,您必须预先旋转所有旋转帧,以便旋转单个图形(因为您无法旋转BitmapData,并且您没有在{{1}上使用draw }})。尽管如此,如果你能忍受这些限制,它仍然会很快。

这是一个post,作为我上面解释过程的教程。它虽旧,但信息量很大。

最后,60,000是一个非常大的数字。 Flash并不是一个“速度恶魔”。无论如何优化,最终你都会达到极限。请记住一些事情。

哦,这个额外的post提供了一些关于Flash性能的好建议。