繁体   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