我在Flash 10中创建了一个Paralax效果,其中我有大约5层,每个坐在不同的Z轴上。这5个图层已经按照符号进行分组,因此当围绕其x和y轴移动符号时,图层会按预期以3D透视图移动。
我们需要在每个图层上动态渲染文本,但问题是,我使用addChild()将textFields添加到这些图层以显示文本,这导致帧速率大幅减慢到大约12 fps。
我尝试了一种不同的方法,我采用每个图层的位图快照,删除所有子项(文本字段)并将位图添加到图层上,希望帧速率有所改善......但无济于事。
我怎样才能获得更多性能呢?使用像PixelBender这样的东西会更好吗(即如果我可以在PixelBender中动态渲染文本),或者在这里使用像Away3D或Papervision这样的3D引擎吗?
答案 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个是完全的时间浪费。
通过确定图层的哪些部分是可见的并且只绘制这些区域,可以节省大量“透支”,从而使其更快