2010-06-03 82 views
0

我正在玩一款遊戲。AS3:如何有效地訪問像素數據?

遊戲需要實體分析圖像和頭部朝與

我看着Pixel Bender的特殊性能(高紅色通道等)像素,但這只是寫新的色彩的似乎是有益圖片。目前,即使在低分辨率(200x200)下,只有一個實體掃描圖像的速度會降低到1-2幀/秒。

我正在嵌入圖像並將其實例化爲位圖,作爲舞臺的子代。 1-2 FPS的情況是事先使用BitmapData.getPixel()(在每個像素上)進行距離計算。

我想知道是否有任何方法可以更有效地做到這一點......我的第一個想法是某種空間分區,再加上將圖像分成許多小塊。

我也覺得像Pixel Bender應該能夠幫助某種方式,但是我沒有什麼經驗。

乾杯任何幫助。 Jonathan

回答

2

讓我們調用實體朝向「吸引子」的像素,因爲它們吸引實體。

由於掃描吸引子,你描述了一個低幀速率。這表示您可能會在每一幀掃描圖像。您不指定掃描的圖像是靜態的還是像視頻輸入一樣頻繁地更改。如果圖像隨着每一幀都在變化,所以你必須以某種方式重新計算吸引子,那麼你試圖用ABC虛擬機實時實現計算機視覺,請看下面。

如果您有一個不變的圖像,那麼您可以做的最重要的優化是僅掃描一次圖像,然後保存吸引器位置的摘要(或「memoization」)。在每個渲染幀中,不是掃描整個圖像,而是搜索已知吸引子的列表或數組。當用戶導致圖像發生變化時,您可以從頭開始重新計算,或者按照您認爲合適的方式遞增更新您的計算。

如果你正在嘗試做實時計算機視覺使用ActionScript 3,我建議你看看新vector類型的Flash 10.1,也即你考慮使用任何abcsx寫ABC彙編代碼,或使用Adobe's Alchemy來將C編譯到Flash運行時。 ABC是Flash的字節碼。換句話說,重新考慮將AS3用於實時計算機視覺。

0

BitmapData有一個getPixels方法(注意它是複數)。它返回一個所有像素的字節數組,它可以比for循環快得多迭代,內部調用getPixel,嵌套在另一個for循環。不幸的是,字節數組,正如其名稱所暗示的那樣,是1維字節數組,因此每個像素(4字節)的迭代需要使用for循環,而不是foreach循環。您可以默認單獨訪問每個像素的顏色通道,但是這聽起來像您想要的(找到具有「高紅色通道」的像素),因此您不必逐位,並且每個像素值都可以隔離特定通道。

我在某處讀到getPixel非常慢,所以這就是我認爲你最能節省的地方。我可能是錯的,所以這是值得的。

+0

對不起,但這是明顯錯誤的。迭代次數在兩種情況下都是相同的,如果你想要做的是評估*每個*像素。循環是否嵌套不會改變這一事實。在這種情況下,將像素放入ByteArray中將無濟於事。事實上,情況更糟糕:您將使用(至少)兩倍的內存;您將避免調用getPixel(),但最終會調用readUnsignedInt()的次數相同;如果你需要知道像素座標(很可能),你最終會添加x和y的計數器或者使用模塊。無論如何,這裏沒有收穫。 – 2010-06-03 03:31:33

+1

使用getPixels()絕對是getPixel()的首選。 Flash中任何方法調用的開銷都很大,因爲您可以像數組一樣訪問ByteArray,也就是myPixels [index],您可以節省調用每個像素方法的開銷。此外,Flash內部還對getPixel()進行了邊界檢查,這是另一次放緩。 – Quasimondo 2010-06-23 15:49:19

+0

@Quasimondo。你在圖像處理方面比我更懂得知道(我關注你的博客!)。不過,在這種情況下,我不確定getPixels比getPixels更好(即假設您想對每個像素執行一些操作)。函數調用肯定有開銷,但是IIRC,Nicolas Canasse證明了陣列訪問也相當慢(不確定這是否在最新的玩家中發生了變化)。 – 2010-07-22 01:34:09

0

我會說Heath Hunnicutt的anwser是一個很好的。如果圖像不改變,只需將所有顏色值存儲在矢量中。或byteArray,並將其用作查找表,因此您無需每幀都調用getPixel()。