前面介绍了Starling中三种(着色处理、画家算法、纹理图集)图片优化的技巧,下面介绍几种其他方法来优化你的Starling项、项目性能:
强大的Sprites
Sprite容器中有一个Flatten方法,它可以帮你减少GPU对帧的处理。如果您的游戏中有一些内容是静态的,并且不会发生(或很少)改变,就可以调用这个Sprite容器的 Flatten方法。Starling将会预处理它的子元件,并上传它们的数据到GPU。在后续的帧中,它们就可以马上被呈现,而且不需要任何额外的GPU处理,也无需向GPU上传新的数据。Sprites非常强大,Sprites能够极大的减少cpu的负载极大的提高你Flash游戏的性能!
QuadBatch
Sprites虽然强大也能非常快速的使用,但是它同样会带来一些其他的负担。主要有两方面:一 当您在Sprite上添加了一个对象,它们将派发”ADDED”和”ADDED_TO_STAGE”事件,如果有很多子元件需要添加,这可能也是不小的开销。二 对于任何的显示对象容器来说,一个特定的子元件只能添加一次。QuadBatch是解决这些限制的最好的办法,它是Starling的一个底层类。下面把它的工作原理写下来:
var quadBatch:QuadBatch = new QuadBatch();
var image:Image = new Image(texture);
quadBatch.addImage(image);
For (var i:int=0; i<100; ++i)
{
image.x += 10;
quadBatch.addImage(image);
}
通过使用这样的处理,您可以重复添加相同的图像!此外,它不会引发任何事件调度。然而事务都有两面性,这样做也有一些缺点:您添加的所有的对象必须具备相同的状态(比如:使用同一个纹理图集)。您添加到 QuadBatch 的第一个图像决定了它的状态。您不能再改变状态,除非完全重置这个 QuadBatch 。您只能添加 Image 、 Quad, 或 QuadBatch 类的实例。由于这些原因,它仅适用于一些特定的场景(比如位图字体类,就直接使用了四边形批次)。在这些情况下,它肯定是最快的选择。您将找不到一个更有效的方式来呈现 Starling 对象。
位图字体
使用位图字体不会占用任何额外的纹理内存,除了它们所需的原始纹理;同时使用位图字体的文本框,创建和更新都是非常快速的。文本框支持两种不同的字体:True Type字体和位图字体。TrueType字体最容易使用:只需嵌入所需的“ttF”文件,您就大功告成了。为静态文本框包含数百个字符,这是一个很好的和快速的选 择。Starling会将文本渲染成位图,显示文本的时候就像一个纹理一样。对于重复改变的短文本(比如分行显示),这样处理还是挺慢的。如果您的游戏需要显示的文本中包含许多非ASCII字符(如中文或阿拉伯文),TrueType字体可能是您唯一的选择。位图文本只是受限于它们的纹理大小。
容器点击处理
当年你移动光标时,,Starling会自动寻找哪一个容器对象可以被点击。这项操作是一项昂贵的操作,因为它需要遍历所有的显示对象,并调用hitTest方法。因此,如果您不需要一个对象被触碰,将它设置为“untouchable”是非常有帮助的。最好是在容器上进行禁用:这样,Starling就不会遍历它的子元件。
你可以通过一下方法处理容器点击:
// 方案一:
For (var i:int=0; i<container.numChildren; ++i)
containter.getChildAt(i).touchable = False;
// 方案二:
container.touchable = False;
// 很明显,第二种方案较第一种要好。
创建对象处理
大量的临时对象不仅占用内存并且需要由垃圾收集器进行清理,这会使你的游戏在应用过程中经常出现你不想要看到的情况“卡壳”。下面给大家推荐一个好的处理临时对象的方法:
var point:Point = new Point();
For (var i:int=0; i<10; ++i)
{
point.setTo(i, 2*i);
doSomethingWith(point);
}
大家可以去试用一下。
上面这些方法旨在提高你Flash项目的性能,让你的项目不管是Flash网站还是Flash游戏都能给用户带来一个非常高的用户感觉——这是我们做项目的重要目标。