2016-07-13 60 views
3

我的目標是擁有低分辨率的圓圈(非常像素化)。我知道還有其他方法可以做到這一點,但我想了解cacheAsBitmap的工作原理。當我使用我繪製的非常小的精靈片,然後縮放位圖時,它看起來很棒(非常塊狀,像素化,平滑關閉)。精細。但是,當我以編程方式繪製一個非常小的圓(例如半徑爲4),然後將其緩存,然後對其進行縮放時,它會像素化,但非常圓,完整。我認爲玩家不會將它緩存爲位圖,直到它在屏幕上呈現。即使我在swf完全加載和運行之前不進行擴展,我仍然會得到完美的圓形(但像素化)的大圓圈。有沒有辦法通過編程方式緩存某些東西,然後按比例放大導入的位圖的方式?AS3 cacheAsAsyncmap混淆

我試過的代碼基本上是這樣的:

 for (var i: int = 0; i < 200; i++) { 
      var size: Number = 8; 
      var item: RunnerMassObj = new RunnerMassObj(); 
      item.graphics.lineStyle(0,0x0,0,true); 
      item.graphics.beginFill(0xFF8844 + i * 10); 
      if (i < 10) { 
       item.graphics.drawCircle(0, 0,size); 
      } else { 
       item.graphics.drawRect(0, 0, size, size); 
      } 
      item.graphics.endFill(); 
      addChild(item); 
      item.x = Math.random() * 1000 + 50; 
      item.y = Math.random() * 1000; 
      item._bottom.y = size; 

      // here I cache it as a bitmap. 
      item.cacheAsBitmap = true; 
      allMassObj.push(item); 
     } 

,然後在我的engineTick代碼,我有這樣的:和

for(var i:int = 0; i < allMassObj.length; i++) 
    { 
     // and here I scale it up, expecting the pixels to stay pixelated. 
     // has the circle somehow maintained its vector shape? 
     allMassObj[i].scaleX = 10; 
     allMassObj[i].scaleY = 10; 
    } 

,而不是左邊的大像,我得到的微小的 「真實畫面」 右側像素:

enter image description here

任何見解都將非常感謝!

回答

3

如果您將您的項目BitmapData,那麼你可以順利禁用:

item = new BitmapData(instance.width * scale, instance.height * scale, true, 0x0); 

item.draw(instance, m, null, null, null, false); // final false disables smoothing 

(不要tryied,但我認爲這是值得看看)

最佳。

編輯:另外:嘗試調查位圖顏色深度附近的東西。如您所知,如果您可以將位圖轉換爲1或2位顏色,然後調整其大小,則可能會根據需要獲得硬像素圖像。

+0

+1讓我有信心朝着這個方向前進。我認爲這只是爲了抗鋸齒。我只是最終得到它的工作,減去了一些需要的tweeks,但我得到了粗糙的像素。我會用完整的工作代碼編輯你的答案。 –

+0

謝謝您的關注Neal。我很高興看到你找到了自己的路。上帝保佑。 – statosdotcom

2

但是,當我以編程方式繪製一個非常小的圓(例如半徑爲4),然後將其緩存起來,然後將其放大,它就像素化了,但非常圓。

問題是,它只是緩存作爲位圖。它不像一個行爲。 The documentation是在這一個很清楚:

設置好後cacheAsBitmap屬性true呈現不改變

cacheAsBitmap的一點是要提高對複雜的矢量數據渲染性能是不改變:

如果設置爲true,Flash運行時緩存內部位圖表示的顯示對象。此緩存可以提高包含複雜矢量內容的顯示對象的性能。

它基本上是將矢量幾何體「烘烤」成幕後的像素,因此它不需要進行計算來一次又一次地顯示它。

DisplayObject被轉換時,緩存被更新。這就是爲什麼你永遠不會看到你的圈子的像素化版本。

+0

感謝您提高清晰度!非常感激! –