在Android中优化组合渲染和画布绘制

在Android中优化组合渲染和画布绘制,android,optimization,canvas,rendering,hardware-acceleration,Android,Optimization,Canvas,Rendering,Hardware Acceleration,我有一套高度优化的实时效果图形例程(用于相机应用程序) 使用它们的例程以以下方式在分层模式下工作: Each time the process is executed (on each preview frame) > We have a bitmap (after YUV2RGB conversion) to start working with. Will call it B(0) > We have N independent sets of "layered len

我有一套高度优化的实时效果图形例程(用于相机应用程序)

使用它们的例程以以下方式在分层模式下工作:

Each time the process is executed (on each preview frame)

  > We have a bitmap (after YUV2RGB conversion) to start working with. Will call it B(0)
  > We have N independent sets of "layered lenses" with its properties: window (subset
   of the bitmap to be processed), color conversion, lighting, distortion, transparency...

For each lens (L=1...N), and sequentially, do the following:
  1) Take B(L-1) and, according to layer properties: process a subset of it.
  2) Draw the results onto the same bitmap. It will be called bitmap(L)
这幅画是用帆布画的,如果我需要缩放它,需要相当长的时间。我想加快这部分的速度

我听说过硬件加速画布,它们速度更快,但我对它的用法有点困惑。我需要的东西画得更快,但仍然让我能够访问的结果进行进一步的处理

所以,我的问题是:

  • 硬件加速画布是否仅适用于视图,还是也适用于视图 位图?也就是说,如果我这样做了,我们假设N个循环,但是对于我需要的每一个循环 上一次的结果,会有用吗

  • 如果没有,有什么方法可以加速画布绘制


非常感谢。

因为我们不是在讨论屏幕上的透支和多视图渲染,所以画布绘制性能没有太大关系(是的,假设视图是硬件加速的)。 无论如何,在图形中绘制位图数据应该是在屏幕上“写入”图像数据的更快方式(如文档所建议的)

你能告诉我们更多关于实施的情况吗?看看您的合成任务,我想您可以尝试从图像处理步骤中获得更高的性能。它们是如何实施的?通常在本机层(JNI/C++)进行快速图像细化,并尽可能使用Renderscript。
一个好的解决方案是在JNI级别移动所有的细化,将图像处理为Opengl ES纹理,该纹理可以在SurfacetTexture中非常快速地绘制。

图像处理步骤使用NEON进行了相当优化。假设您的图像上有不同的镜头,其中一些镜头可以相交,并结合它们的效果。由于它们可能包括扭曲和透明度,如果下一层窗口与上一层窗口相交,我必须使用上一层结果,因此必须对其进行排序。只有当目标窗口(将绘制它的位置)与源窗口相同时,我才能在处理步骤中直接绘制它,但如果窗口不同,因为我的例程不包括缩放,我必须用画布来合成它。抱歉,有点困惑,明白了。但是你使用的是标准的android位图吗?你也可以在Opengl纹理上进行这种混合/乘法操作。是的,它们有时是数组,有时是android可变位图。我从未使用过OpenGL(甚至不知道学习曲线有多难),但如果我能将每一层的混合结果作为下一层渲染的源,这肯定是答案。完成后,再次将其交给OpenGL纹理,以便它再次进行混合,并再次获取下一层的结果。你认为有可能吗?学习曲线才是真正的问题,opengl不是微不足道的;)不管怎样,您可以使用画布完成的所有事情都是您可以在opengl中完成的子集。我的建议是打开一个特定的线程,其中包含关于Android上opengl的特定问题,并结合您场景中的信息。。。等待opengl大师的回答;)