簡體   English   中英

BitmapData鎖定和解鎖在Android上不起作用

[英]BitmapData lock and unlock not working on android

以下代碼將從另一個位圖(akka)中刪除一個位圖(畫筆akk液滴)
該代碼在PC上運行良好,並且可以正常運行。

當我在更多的android設備上對其進行測試時,它不起作用。 無論是高端設備還是慢速設備。 我進行了一些測試,發現問題出在BitmapData中的lock()和unlock()函數。 它只是不會一次更新設備上的映像。
我試圖將其刪除,但隨后仍然滯后。 在PC上性能下降也很明顯。 有誰知道解決方案,我在哪里做錯了?

import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Point;
import flash.events.MouseEvent;
import flash.geom.ColorTransform;
import flash.geom.Rectangle;

var m:BitmapData = new water_pattern;
var b:BitmapData = new droplet;

var bm:Bitmap = new Bitmap(m);

var bla = new blabla();
addChild(bla);
bla.addChild(bm);

function p($x,$y){


var refPoint = new Point($x-b.width/2,$y-b.height/2);
for(var i=0;i<b.width;i++)
for(var j=0;j<b.height;j++)
{
    var a:uint = (b.getPixel32(i,j)>> 24) & 0xFF;
    a=0xFF-a;
    var tp:uint = m.getPixel32(refPoint.x+i,refPoint.y+j);
    var tp_trans:uint = (tp >> 24)&0xFF;
    if(tp_trans>a){

        tp=(tp&0x00FFFFFF)|(a<<24);
        m.setPixel32(refPoint.x+i,refPoint.y+j,tp);
    }
}

//for(var k=0;k<10000000;k++){};
}
var k=1;
var md = function(e)
{
    m.lock();
    p(bm.mouseX,bm.mouseY);
    m.unlock();
};

bla.addEventListener(MouseEvent.MOUSE_DOWN,function(e)
{
    bla.addEventListener(Event.EXIT_FRAME,md);
});
bla.addEventListener(MouseEvent.MOUSE_UP,function(e)
{
    bla.removeEventListener(Event.EXIT_FRAME,md);
});

我重新編寫了代碼:

public function draw($x, $y)
        {

            var refPoint = new Point($x - brush.width / 2, $y - brush.height / 2);
            var r:Rectangle = new Rectangle(refPoint.x, refPoint.y, brush.width, brush.height);

             var pv:Vector.<uint> = pattern.getVector(r);
             var bv:Vector.<uint> = brush.getVector(brush.rect);


             for (var i = 0; i < bv.length; i++)
                {
                    var a:uint = (bv[i]>>24) &0xFF;
                    a = 0xFF - a;
                    var tp:uint = pv[i];
                    var tp_trans:uint = (tp >> 24) & 0xFF;

                //  trace(a.toString(16) + " vs " + tp_trans.toString(16));
                    if (tp_trans > a)
                    {

                        tp = (tp & 0x00FFFFFF) | (a << 24);
                        //      trace("??>" + tp);
                        pv[i] = tp;
                    }
                }

               pattern.setVector(r, pv);
        }

現在可以使用,但是在設備上仍然很慢。 在我看到傑夫·沃德的評論之前,我將其更改為CPU上的渲染模式。 它運作迅速。 最大的問題是在CPU模式下,與GPU相比,游戲速度非常慢。 然而,該腳本在CP​​U上運行很快,但在GPU上卻無法使用,運行緩慢。

因此,我再次嘗試了第一個代碼並感到驚訝。 有用。 傑夫·沃德,謝謝你,你真是個天才。 現在的問題仍然是為什么? 有人可以解釋一下嗎?

對於您的原始問題,有時GPU模式不會將更改吸收到基礎位圖數據中。 在您的unlock()之后嘗試以下任何操作以“提示”它應重新上傳位圖數據:

bm.filters = [];
bm.bitmapData = m;
bm.alpha = 0.98+Math.random()*0.02;

但正如您所發現的,上傳位圖數據可能會很慢。 要闡明GPU /直接渲染模式:

在GPU模式下,更改位圖中的任何像素都需要重新上傳完整的位圖,因此,位圖的大小是限制因素。 在直接模式下,它僅使屏幕上已更新的部分變白。 因此,我猜游戲的某些部分會同時改變很多屏幕(在直接模式下緩慢),而這種效果會改變較大的位圖,但一次只能改變一點(在GPU模式下緩慢)。

您必須要有創造力才能最大程度地發揮GPU的性能:

  1. 在GPU模式下,將效果分成許多位圖,並且對於任何給定的幀僅更改盡可能少的內容。 (中等努力)
  2. 使用Starling GPU加速框架和Starling過濾器(GPU着色器)來達到效果(效果取決於您已經在游戲中投入了多少),請參見幾個 示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM