AS3瓷砖地图渲染(1000块瓷砖)

时间:2012-08-12 00:20:55

标签: performance actionscript-3 tiles starling-framework

首先我会说这里的上下文是Actionscript 3.0(IDE:Flashbuilder)以及Starling Framework

所以,我想创建一个可用于平台游戏或类似东西的平铺地图。

我想在800x600像素的舞台上使用8x8像素图块,而我遇到的问题是我不知道如何在不显着降低帧速率的情况下将这些7500+图块对象添加到舞台上。

我发现性能下降来自于将每个磁贴添加到舞台,而不是初始化每个Tile对象。

我知道我没有提供太多具体信息,但我要求的是,如果有一种标准化的方法可以在不损失性能的情况下将数千个静态对象绘制到舞台上。我觉得有办法,我还没有找到它。

更新

在你的所有帮助之后,我找到了一个似乎是一个很好的解决方案。起初我想实现Amy的解决方案,使用copyPixels()和draw()为整个地图制作一个大的位图数据,然后将其渲染到屏幕上。然而,我想知道是否有一个与之相当的Starling,因为如果我不需要将Starling与Native Flash混合,一切都会变得如此简单。

再次感谢Amy,我更多地研究了Starling的RenderTexture类,并发现使用它的“drawBundled()”和“draw()”方法,我可以轻松地将所有的tile绘制到RenderTexture中,然后将RenderTexture放入图像(Starling的图像类),然后将该图像添加到屏幕上。

这个解决方案比我以前尝试过的愚蠢的慢速解决方案快了一百万倍,还有扁平的精灵等等。它的初始化时间更快,并且当renderTexture的图像出现在屏幕上时,帧速率似乎没有下降。

我想用此测试的一件事是,在游戏过程中更容易更新磁贴的图形。比方说,如果水从源(或某物)传播并且“草”瓦片必须变成“水”瓦片,RenderTexture及其图像是否能够在没有某种滞后尖峰或性能打嗝的情况下改变其外观。我很快就会对此进行测试。

谢谢大家的帮助!

2 个答案:

答案 0 :(得分:9)

不要将多个对象添加到舞台上。相反,创建一个与舞台大小相同的BitmpaData,并使用copyPixels()或draw()绘制它。 Here's an article应该让你开始。然后,您可以在该帖子中学习您所学到的概念,并学习您需要做的任何未涵盖的内容(flashandmath.com有很多关于像素操作的好教程)

答案 1 :(得分:3)

您需要管理在游戏中移动时需要添加和删除的切片。仅添加到屏幕中心800像素的舞台拼贴。一旦瓷砖距离中心超过800像素,请将其移除。这应该保持一切顺利。祝你好运。

或者查看将图块绘制/复制到一个位图中。你基本上会将你的瓷砖压印到新的位图上。以下是adobe的一个例子:

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Point;

var bmd1:BitmapData = new BitmapData(40, 40, false, 0x000000FF);
var bmd2:BitmapData = new BitmapData(80, 40, false, 0x0000CC44);

var rect:Rectangle = new Rectangle(0, 0, 20, 20);
var pt:Point = new Point(10, 10);
bmd2.copyPixels(bmd1, rect, pt);

var bm1:Bitmap = new Bitmap(bmd1);
this.addChild(bm1);
var bm2:Bitmap = new Bitmap(bmd2);
this.addChild(bm2);
bm2.x = 50;

More Info on the bitmapData class. I think copyPixels is what you are after.