[英]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相比,游戲速度非常慢。 然而,該腳本在CPU上運行很快,但在GPU上卻無法使用,運行緩慢。
因此,我再次嘗試了第一個代碼並感到驚訝。 有用。 傑夫·沃德,謝謝你,你真是個天才。 現在的問題仍然是為什么? 有人可以解釋一下嗎?
對於您的原始問題,有時GPU模式不會將更改吸收到基礎位圖數據中。 在您的unlock()
之后嘗試以下任何操作以“提示”它應重新上傳位圖數據:
bm.filters = [];
bm.bitmapData = m;
bm.alpha = 0.98+Math.random()*0.02;
但正如您所發現的,上傳位圖數據可能會很慢。 要闡明GPU /直接渲染模式:
在GPU模式下,更改位圖中的任何像素都需要重新上傳完整的位圖,因此,位圖的大小是限制因素。 在直接模式下,它僅使屏幕上已更新的部分變白。 因此,我猜游戲的某些部分會同時改變很多屏幕(在直接模式下緩慢),而這種效果會改變較大的位圖,但一次只能改變一點(在GPU模式下緩慢)。
您必須要有創造力才能最大程度地發揮GPU的性能:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.