2010-09-09 103 views
0

我對使用blitting進行圖形處理有點新。但是我自己也做了一些演示,並且我一直在閱讀關於所用方法的大量信息。使用blitting提高性能

我一直看到的一個常見主題是,它們都是暴力渲染;先繪製最遠的後部物體,然後逐步穿過所有其他物體。甚至繪製將要完全重疊的對象。

他們之所以說這是因爲任何一種測試,看看應該繪製什麼,實際上需要更多的時間,而不是僅僅繪製沒有檢查的東西。

是否有任何方式來檢測應該繪製什麼,比繪製所有東西更快運行?

回答

0

實際上很難判斷檢查繪製或繪製東西的速度是否更快。你可以使用兩個像如果有超過圖像,使用繪製檢查,如果沒有,繪製它們全部。 ...

所以 - 在吸引他們所有的方法是非常明顯的,並且對平局檢查它是這樣的:

// drawCheck 
var w:int = 300; 
var h:int = 200; 

var result:Bitmap = new Bitmap(w, h); 

for (var x:int = 0; x < w; x++){ 
    for (var y:int = 0; y < h; y++){ 
     result.bitmapData.setPixel32(x, y, 0x00FFFFFF); 

     for (var iid:int = 0; iid < images.length; iid++){ 
      var resC:uint = result.bitmapData.getPixel32(x, y); 
      var resA:uint = resC >>> 24; 
      var resR:uint = resC >>> 16 & 0xFF; 
      var resG:uint = resC >>> 8 & 0xFF; 
      var resB:uint = resC & 0xFF; 

      if (resA == 0xFF){ 
       break; 
      } 

      var oriC:uint = images[iid].bitmapData.getPixel32(x, y); 
      var oriA:uint = oriC >>> 24 &; 
      var oriR:uint = oriC >>> 16 & 0xFF; 
      var oriG:uint = oriC >>> 8 & 0xFF; 
      var oriB:uint = oriC & 0xFF; 

      var newA:uint = resA + oriA; 
      var newR:uint = (256/resA) * resR + (256/oriA) * oriR; 
      var newG:uint = (256/resA) * resR + (256/oriA) * oriG; 
      var newB:uint = (256/resA) * resR + (256/oriA) * oriB; 

      var newC:uint = newA << 24 | newR << 16 | newG << 8 | newB; 

      result.bitmapData.setPixel32(x, y, newC); 
     } 
    } 
} 

基本上,也許繪圖可能會更快,但我不知道 - 按位操作...反正 - 你應該明白 - 這個循環通過X和Y座標,最後通過圖像。

注:圖像被存儲,如:0 =前,images.length - 1 =背面

它檢查(該處)如果所生成位圖已經完全通過檢查阿爾法繪製(如果它等於0xFF,沒有使用繪圖),如果不是,它合併顏色並添加alpha。

你應該做一些性能測試,以便我們知道什麼是更快,什麼時候...