我想更好地了解Flash如何呈现显示对象,因此我更了解如何优化游戏。
我之前创建了一个具有滚动,重复(和parallaxing)背景的游戏。我将其平铺并缓存为位图,这在考虑背景中制作动画显示对象时非常痛苦。有更好的方法吗?
另一个问题是,如果我有一个大的位图(或我已经缓存为位图的矢量艺术),如果它完全不在屏幕上会有任何性能损失吗?如果它部分在屏幕上怎么样 - 闪存是否必须呈现整个位图,或者只是它在屏幕上看到的内容?
答案 0 :(得分:1)
如果它不在scrollRect范围内,即使屏幕外也是如此。拥有一个ENTER_FRAME监听器或类似的东西,以便在剪辑达到舞台宽度时检测,然后将另一个背景实例添加到滚动动画片段的末尾也许是一个好主意。然后,为了提高性能,请使用scrollRect仅渲染当前时刻舞台上的内容。
答案 1 :(得分:1)
如果没有动画,你只应该cacheAsBitmap,你没有缩放而不是旋转它。垂直和水平运动都很好。否则,每次MovieClip更改时,都需要重新缓存它,这比根本不缓存它要花费更多。
如果它不在舞台上,请将其从显示列表中删除或将其可见性设置为false。
您可以使用内存管理组件进行一些很好的测试。调整东西,看看它对你的记忆/ fps有什么影响.Mrdoob有一个非常好的。 http://www.as3gamegears.com/profiling/mrdoob-stats/
答案 2 :(得分:1)
滚动背景有几个选项:
您可以将背景资源添加到显示列表中,移动它们并使用scrollRect剪辑到可见区域(基本上就是您已经在做的事情+ scrollRect)。
编写自己的自定义渲染解决方案,在内存中跟踪游戏对象状态,但实际上并未将它们添加到显示列表中。您可以使用bitmapData.lock(),copyPixels()和bitmapData.unlock()的组合将游戏对象渲染到屏幕,并且只渲染可见区域。
使用已经优化的预先存在的游戏库。其他人提到Flixel,这是一个不错的选择。
您选择哪一个取决于它是什么类型的游戏(光栅与矢量)以及您的目标是什么(您想要了解更多还是想更快地完成它?)。如果没有其他原因,我建议在某些时候尝试#2,而不是了解底层机制的工作原理。
关于选项#1和#2之间的区别,您可以找到很多有用的讨论。这是其中之一:
https://gamedev.stackexchange.com/questions/1081/rendering-performance-for-flash-games
答案 3 :(得分:0)