2009-09-25 19 views
4

我想使用PNGEncoder將一個bitmapData對象編碼成一個png ByteArray,這樣我就可以將數據發送到服務器。除了bitmapData是4000x4000px,並且當我運行PNGEncoder.encode函數時,所有東西都會變成桃色,整個應用程序在運行時停止(UI被阻止)5-8秒。有沒有人有任何建議,如何不阻止這麼糟糕,我讀了關於整理過程(因爲你不能在AS3中多線程),但找不到任何示例代碼來分解過程。Actionscript PNGEncoder性能和UI阻止

感謝, 山姆

回答

3

主要有兩種方法可以做到這一點。

a)使用像素彎曲器: 您可以將工作加載到像素彎曲器(陰影,如as3中的語言)。這在一些情況下具有使用gpu的優點,但它也是assynchronous和non-blocking(在另一個線程上運行)。但它確實需要玩家10+。我沒有看到像素彎曲編碼器,說實話,它可能是不可能的(我不熟悉png編碼告訴),但它可能是一個選項。這是,性能明智,最好的,你可以得到。更多信息here

b)使用chuncking。基本上,您可以重寫編碼器以對塊(線,列或更小的區域)進行編碼,然後將其掛接到輸入幀事件,您將在編碼器上接下來調用的每個幀,直到沒有更多編碼要做。 Zeh有一個整潔的LWZ chunked encoder和源代碼,可以讓你深入瞭解細節。

乾杯 亞瑟

+0

注意http://theflashblog.com/?p=822 – jedierikb 2009-10-31 23:01:00

0

您可以單獨編碼多個PNG文件,並將它們發送到服務器。一旦在服務器上,您可以重建較大的圖像。

+0

我仔細考慮過,但在這個特定的使用情況下,這不是一個選項:( – Shizam 2009-09-26 00:09:30

4

除了亞瑟的評論,你也可以把它寫在C/C++爲Alchemy,因爲煉丹支持綠色線程。像PixelBender,鍊金術還需要Flash 10

+0

其實libpng(在C中,我認爲)是包含作爲示例時你下載鍊金術 – 2009-09-26 17:54:55

0

正如亞瑟。Debert說,你可以用分塊。我建議,而不是編碼一次/幀,你嘗試一個setTimeout(chunkingFunction, 0);的方法。延遲時間爲0毫秒將盡快發生,允許分塊快速處理,但不會破壞用戶界面。

1

另一個無恥的插頭!

您可以使用我最近完成的PNGEncoder2庫(也需要Flash 10+),它支持巨大的圖像。它做適當的異步編碼,最後沒有單個壓縮步驟。此外,它真的很快;-)

從GitHub(README),並檢查了benchmark比較它與我的博客文章中的其他編碼器。

它對速度進行了高度調整,並使用Alchemy操作碼和domain memory加速(感謝haXe),所以它應該與使用Alchemy編譯的任何東西相當。

+0

非常好!這是比異步JPEG編碼器像http:// segfaultlabs更快。com/devlogs/alchemy-asynchronous-jpeg-encoding-2? – sydd 2011-12-15 01:53:31

+0

@sydd:謝謝!我不知道JPEG編碼器有多快;你必須運行一個基準來找出(雖然不應該很難把它扔到一起)。請記住,JPEG是與PNG完全不同的格式; JPEG可能會產生更小的文件大小,但不能編碼alpha通道等。另外請注意,在Flash中快速獲取異步編碼非常棘手(至少,很難一致*快速獲取它跨越不同的系統和負載,同時保持幀速率) - 所以單獨測試同步版本。 – Cameron 2011-12-15 03:15:38