Java位图合成如何

Java位图合成如何,java,android,bitmap,Java,Android,Bitmap,我正在将AS3(Flash)应用程序移植到JavaAndroid。我需要一个与这个原型等效的函数: copyPixels(sourceBitmapData:BitmapData,sourceRect:Rectangle,destPoint:Point,alphaBitmapData:BitmapData=null,alphaPoint:Point=null,mergeAlpha:Boolean=false):无效 重要的参数是SourceBitmap、SourceRect、DestPoint和M

我正在将AS3(Flash)应用程序移植到JavaAndroid。我需要一个与这个原型等效的函数: copyPixels(sourceBitmapData:BitmapData,sourceRect:Rectangle,destPoint:Point,alphaBitmapData:BitmapData=null,alphaPoint:Point=null,mergeAlpha:Boolean=false):无效

重要的参数是SourceBitmap、SourceRect、DestPoint和MergeAlpha,我不需要其他参数。现在我在Java中使用位图类,有没有可能在位图类中使用这样一个函数,它可以相当快地克服Android Java性能差的问题

也许我应该使用BuffereImage或其他东西,但我迷路了,因为Java有很多图像/位图类,而AS3只有2个。由于JavaAndroid的性能问题,我还没有发现一些代码不使用某种形式的Canvas类就可以实现我想要的功能。位图类中有CopyPixels函数,但据我所知,它并没有合成alpha值。我确信在某个地方有一些代码可以完成我的工作,希望我不必重新发明轮子


感谢您的回答/评论。

您应该使用android.graphics.Bitmap类。Android画布实际上非常高效。它只是一个包装器,允许您在位图上进行基本绘图。如果您查看一些openGL示例,使用画布绘制通常比Java中的openGL更快。性能问题是什么?也许这样可以帮助解决这些问题


此外,您还可以通过迭代位图中的像素并自己混合颜色来完成。这不是很难,但实际上,那里的性能与Canvas类没有太大区别。

我当然相信Canvas比OpenGl快,但使用Canvas作为占位符合成图形的速度很慢。这是因为您需要将两个位图复制到画布,然后将它们再次复制回位图。如果可能的话,使用alpha合成(使用缓冲区而不是单个像素)将位图复制到位图将是最好的解决方案。性能问题是帧速率慢、Java GC执行任务时出现挂起、屏幕上闪烁等。。。当你推很多像素时,C++中没有的问题。谢谢你的评论,知道画布不是瓶颈是很有用的。实际上你不需要复制很多。使用接受位图的画布构造函数,或调用SetBitmap()。这些不应该复制位图。它应该只是改变位图像素。复制位图是什么意思?为什么GC花费的时间太长?你是在每帧创建和循环使用位图吗?应用程序必须将数百万像素从一个位图复制到另一个位图,它就是这样写的,我需要在不改变任何内容的情况下移植它。我复制位图的意思是根据您的方法:Canvas throwAway=newcanvas(位图1);一次性绘图位图(位图2);之后,我需要将一次性画布中的数据返回到Bitmap1中(我也不知道如何)。这里的问题是,我需要将画布重新复制到位图中。我还必须确保Canvas没有调用GC。我不知道为什么GC很慢,我从来没有使用过快速Java应用程序,听说是因为GC。好吧,我想我现在明白了,如果我在画布上绘制它,修改位图。如果每次需要复制时都必须创建新画布,这对GC是不利的。顺便说一下,90%的代码在应用程序中是静态的,这是高性能的东西。不过我想我现在知道怎么做了。1.创建静态画布2。Canvas.setBitmap(位图1)3。drawBitmap(bitmap2)之后,对于下一个副本,我可以将画布与setBitmap一起重用,而不会产生副作用。唯一需要注意的是,我认为调用setBitmap确实可以通过该函数创建对象。是的,canvas只是就地修改数据。您不必从画布复制回位图1。您不需要重复使用画布。画布对象不应该是导致问题的原因。canvas对象在内存中的大小非常小,因为它只是位图的包装器,可以公开许多有用的函数。相反,您应该重用位图。使用已经看到的copyPixels()方法为每个帧复制新数据。您不应该每帧创建一个新的位图对象。分配大块内存的速度很慢,这会导致OutOfMemoryException。