AS3:如何有效地访问像素数据?

时间:2010-06-03 02:51:23

标签: actionscript-3 pixel-bender getpixel

我正在玩游戏。

游戏需要实体分析图像并朝向具有特定属性(高红色通道等)的像素。

我已经研究过Pixel Bender,但这对于为图像写入新颜色似乎很有用。目前,即使在低分辨率(200x200)下,只有一个实体扫描图像速度减慢到1-2帧/秒。

我正在嵌入图像并将其作为Bitmap实例化为舞台的子级。 1-2 FPS情况是使用BitmapData.getPixel()(在每个像素上)预先进行距离计算。

我想知道是否有任何办法可以更有效地做到这一点......我的第一个想法是某种空间分离,再加上将图像分成许多小块。

我也觉得像Pixel Bender应该能够以某种方式提供帮助,但我对它的经验不多。

为任何帮助干杯。 乔纳森

3 个答案:

答案 0 :(得分:2)

让我们称实体朝向“吸引子”的像素,因为它们吸引了实体。

您描述了由于扫描吸引器而导致的低帧速率。这表示您可能正在每帧扫描图像。您不指定扫描的图像是静态的还是频繁更改,例如视频输入。如果图像随每一帧而变化,那么你必须以某种方式重新计算吸引子,那么你正在尝试的是ABC虚拟机的实时计算机视觉,请参见下文。

如果您有一个不变的图像,那么您可以进行的最重要的优化是仅扫描图像一次,然后保存吸引子位置的摘要(或“记忆”)。在每个渲染帧中,您可以搜索已知吸引子的列表或数组,而不是扫描整个图像。当用户更改图像时,您可以从头开始重新计算,或者按照您认为合适的方式逐步更新计算。

如果您尝试使用ActionScript 3进行实时计算机视觉,我建议您查看新的vector类型的Flash 10.1以及使用abcsx编写ABC的情况汇编代码,或使用Adobe's Alchemy将C编译到Flash运行时。 ABC是Flash的字节代码。换句话说,重新考虑使用AS3进行实时计算机视觉。

答案 1 :(得分:0)

BitmapData有一个 getPixels 方法(注意它是复数)。它返回一个所有像素的字节数组,它可以比调用getPixel的for循环更快地迭代,嵌套在另一个for循环中。不幸的是,正如其名称所示,bytearrays是1维字节数组,因此迭代每个像素(4个字节)需要使用for循环,而不是foreach循环。默认情况下,您可以单独访问每个像素的颜色通道,但这听起来像您想要的(找到具有“高红色通道”的像素),因此您不必按位和每个像素值来隔离特定通道。 / p>

我读到某个地方,getPixel很慢,所以我认为你节省的最多。我可能错了,所以值得计时。

答案 2 :(得分:0)

我会说Heath Hunnicutt的anwser很好。如果图像没有改变,只需将所有颜色值存储在矢量中。或者byteArray,并将其用作查找表,因此您不需要每帧调用getPixel()。