2013-12-17 49 views
0

- 我正在用AS3製作一個模擬器,我已經差不多完成了它,但是一些有效的問題困擾着我。
- 通過使用setPixel方法,重畫看起來非常緩慢,我知道它不是通過AS3實現它的最佳方式。
- 我只是想知道是否有更好的方法來加速它?AS3:通過ActionScript更新位圖是否更快?

for (var a:int = 0; a<8; a++) 
{ 
    color = 0; 
    if (vram&1) color = 0x0000FF00; 
    setPixel(k, j, color); 
    k++; 
    vram = vram >> 1; 
} 
+2

循環之前,您應該鎖定的位圖數據後解鎖。 – Florent

+0

你是完全正確的! –

回答

2

我不知道多少,這會加快速度,但在組合使用鎖()和unlock()與copyPixels()而不是setPixel()應該會更快。

首先創建一個1x2 BitmapData實例,您可以將其用作緩衝區。最左邊的像素位於0x0,最右邊的位置位於0x0000FF00。這樣你可以簡單地從緩衝區複製適當的像素。

這種方式,您也刪除設置顏色變8次,每次調用它駐留在該函數的開銷。

這裏是什麼,我的意思是一個總體思路,不要忘記填寫相應的對於alpha值,如果你打算複製以及

// Instantiate these once only(!) 
// Preferably in the constructor or an init functin 
var buffer:BitmapData = new BitmapData(2,1); 
var rect:Rectangle = new Rectangle(0,0,1,1); 
var p:Point = new Point(); 

而這裏的代碼

lock(); 

for(var a:uint = 0; a < 8; a++) 
{ 
    // Select what color to copy, i.e. it's position in the buffer 
    rect.x = (vram&1) ? 1 : 0; 

    p.x = k; p.y = j; 
    copyPixels(buffer, rect, p); 
    k++; 
    vram = vram >> 1; 
} 

unlock(); 
+0

太棒了!因爲8次不是總循環,如果我鎖定並解鎖整個框架,速度應該快多少? –

+0

這取決於環路的真實程度以及訪問BitmapData的外部環境有多少。 lock()所做的是防止BitmapData被渲染,直到unlock()被調用爲止 – stalem

+0

ok,我會在另一次嘗試後回頭:-) –