Flash 滚动背景

Flash 滚动背景,flash,Flash,我想更好地了解Flash是如何渲染显示对象的,因此我对如何优化我的游戏有了更好的想法 我之前创建了一个具有滚动、重复(和视差)背景的游戏。我将其平铺并缓存为位图,这在考虑在背景中设置显示对象的动画时非常痛苦。有更好的方法吗 另一个问题是,如果我有一个大的位图(或者我缓存为位图的矢量艺术),如果它完全脱离屏幕,是否会对性能造成影响?如果部分在屏幕上,flash是否必须渲染整个位图,或者只渲染屏幕上看到的位图?如果它不在屏幕内,即使在屏幕外也会渲染。当剪辑达到舞台宽度时,最好有一个输入帧侦听器或类似

我想更好地了解Flash是如何渲染显示对象的,因此我对如何优化我的游戏有了更好的想法

我之前创建了一个具有滚动、重复(和视差)背景的游戏。我将其平铺并缓存为位图,这在考虑在背景中设置显示对象的动画时非常痛苦。有更好的方法吗


另一个问题是,如果我有一个大的位图(或者我缓存为位图的矢量艺术),如果它完全脱离屏幕,是否会对性能造成影响?如果部分在屏幕上,flash是否必须渲染整个位图,或者只渲染屏幕上看到的位图?

如果它不在屏幕内,即使在屏幕外也会渲染。当剪辑达到舞台宽度时,最好有一个输入帧侦听器或类似的东西来检测,然后在滚动movieclip的末尾添加另一个背景实例。然后,为了提高性能,使用scrollRect只渲染当前阶段上的内容

也许您可以研究像这样的库是如何处理这些问题并创建其优化的


我可以合理地确定,至少当缓存的位图完全脱离屏幕或隐藏时,内存会被释放,但我不知道部分情况,我希望不会。这篇文章可能会回答您的一些疑问(tbh:)

如果没有动画,您应该只缓存位图,而不是缩放和旋转它。垂直和水平运动都很好。否则,每次MovieClip更改时,它都需要重新缓存它,这比根本不缓存它的成本更高

如果它不在舞台上,请将其从显示列表中删除或将其可见性设置为false


您可以使用内存管理组件进行一些良好的测试。调整东西,看看它对你的记忆/fps等有什么影响。Mrdoob有一个非常好的

您有几个滚动背景选项:

  • 您可以将您的背景资源添加到显示列表中,移动它们并使用scrollRect将其剪辑到可见区域(基本上就是您已经在做的+scrollRect)

  • 编写自己的自定义渲染解决方案,跟踪内存中的游戏对象状态,但不实际将它们添加到显示列表中。使用bitmapData.lock()、copyPixels()和bitmapData.unlock()的组合将游戏对象渲染到屏幕上,而只渲染可见区域

  • 使用已优化的现有游戏库。还有人提到了Flixel,这是一个不错的选择

  • 你选择哪一个取决于它是什么类型的游戏(光栅vs矢量)以及你的目标是什么(你想学习更多还是想更快地完成?)。我建议在某个时候尝试一下#2,如果没有其他原因的话,那就是为了了解底层机制是如何工作的

    关于选项1和选项2之间的区别,您可以找到许多有用的讨论。以下是其中之一:


    使用cacheAsBitmapMatrix的DisplayObjects可以在不重新缓存的情况下进行转换。顺便说一句,这并不能回答问题。我的理解是cacheAsBitmapMatrix仅在某些移动设备上可用。