3D视差层阻碍Flash帧速率

时间:2009-11-18 08:23:49

标签: actionscript-3

我在Flash 10中创建了一个Paralax效果,其中我有大约5层,每个坐在不同的Z轴上。这5个图层已经按照符号进行分组,因此当围绕其x和y轴移动符号时,图层会按预期以3D透视图移动。

我们需要在每个图层上动态渲染文本,但问题是,我使用addChild()将textFields添加到这些图层以显示文本,这导致帧速率大幅减慢到大约12 fps。

我尝试了一种不同的方法,我采用每个图层的位图快照,删除所有子项(文本字段)并将位图添加到图层上,希望帧速率有所改善......但无济于事。

我怎样才能获得更多性能呢?使用像PixelBender这样的东西会更好吗(即如果我可以在PixelBender中动态渲染文本),或者在这里使用像Away3D或Papervision这样的3D引擎吗?

2 个答案:

答案 0 :(得分:2)

在pixelbender中渲染文本会非常疯狂。有一种更简单的方法。

不要使用z轴,而是自己做视差,只要剪辑不被转换,但只有翻译后的闪存可以缓存它们,一切都会很好而且快速。

我要做的是将它们添加到数组中,然后更新每帧的所有位置。为了方便地将它们放在一个数组中,我会创建一个小类来将偏移量与每个sprite相关联:

class Parallax
{
    public var sprite:DisplayObject;
    public var offset:Number = 1;

    public function ParallaxedSprite(sprite:DisplayObject, offset:Number) {
        this.sprite = sprite;
        this.offset = offset;
    }

}

完成该类之后,我们将每个想要视差的剪辑/精灵添加到数组中:

var _sprites:Array = [  new ParallaxedSprite(foo, 1), 
                        new ParallaxedSprite(bar, .75), 
                        new ParallaxedSprite(baz, .5) ];

(方括号是创建数组的简写)

然后,我们在每个帧上循环并相应地设置偏移量:

var offsetX:Number = 100;
var offsetY:Number = 100;

for each (var parallax:Parallax in _sprites) {
    parallax.sprite.x = offsetX * parallax.offset;
    parallax.sprite.y = offsetY * parallax.offset;
}

最后,要获得最后的速度提升,请在精灵上设置cacheAsBitmap属性:

foo.cacheAsBitmap = true;
bar.cacheAsBitmap = true;
baz.cacheAsBitmap = true;

请注意,只要没有转换精神,cacheAsBitmap就会加快精灵的绘制速度,但是一旦你用这个集合转换它们,你将有一个额外的开销来重新创建这个缓存​​,所以如果你计划旋转/缩放很多,最好不要这样做。

答案 1 :(得分:0)

尽量减少'透支'。过度绘制是重绘屏幕上像素(或区域)的次数,直到渲染最终帧为止。

假设你有5个视差层,第一个是完全不透明的,那么绘制另外4个是完全的时间浪费。

通过确定图层的哪些部分是可见的并且只绘制这些区域,可以节省大量“透支”,从而使其更快