0

我正在开发一个使用小图块生成关卡的 Flash (AS3) 小游戏。

瓷砖的位置、宽度、高度和其他属性在生成时存储在一个数组中。每个图块都添加到同一个容器影片剪辑中。当所有切片都生成后,将容器动画剪辑转换为位图,从舞台上移除所有切片,并将原始容器从舞台上移除然后删除。除了播放器之外,位图是舞台上唯一剩下的“图形”。

这比允许在游戏过程中单独渲染所有 60,000 多个图块产生更好的性能;但是,随着图块数量的增加,帧速率仍然会降低。这是没有意义的,因为所有图块都添加到一个始终相同大小的位图中,而与图块的数量无关。

生成时有 20,000 个图块,游戏以全 FPS 运行,但在 60,000 个时,它运行相对不稳定,可能在 4-5 FPS 左右。

我已经删除了碰撞检测和通过 tile 数组运行的任何/每个脚本,以排除脚本的其他一些 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 也不会提高速度。

4

1 回答 1

4

几个想法。

首先,您在某种程度上利用了 AS3 快速处理 blitting 的优势。您对舞台上只有一个单曲的想法是正确Bitmap的,但之前的步骤(添加DisplayObjects到 aMovieClipdraw在 that 上执行MovieClip)并不是最快的过程。一方面,BitmapData.drawBitmapData.copyPixels这里有一篇文章)慢。获得速度的最佳方法之一是预先对所有图形进行 blit,并将它们存储为BitmapData. 然后,Object为每个图形保留参考(包含位置等)。在您的渲染循环中,遍历每个对象,并使用copyPixels将图形的像素信息复制到单个舞台位图中的适当位置。这样,一切都慢BitmapData.draw命令已经预先发生,现在您只是在推动像素,Flash 非常快。

然而,这个过程并非没有缺点。例如,你不能用它做简单的转换。例如,您必须预先对旋转的所有帧进行 blit,以便旋转单个图形(因为您无法旋转 BitmapData,并且您没有使用drawa DisplayObject)。尽管如此,如果你能忍受这些限制,它还是非常快的。

这是一篇文章,作为我上面解释的过程的教程。它很旧,但内容丰富。

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

哦,这篇附加文章提供了一些关于 Flash 性能的重要提示。

于 2012-06-10T18:39:34.080 回答