使用 lockCanvas() 的 Android TextureView 硬件加速
Posted
技术标签:
【中文标题】使用 lockCanvas() 的 Android TextureView 硬件加速【英文标题】:Android TextureView hardware acceleration with lockCanvas() 【发布时间】:2012-04-15 12:16:11 【问题描述】:我正在尝试在我的画布上使用适用于 android 的硬件加速。我曾经有一个SurfaceView
,我在上面做了lockCanvas()
以获得后来绘制的画布,但我更改为TextureView
,因为我无法让SurfaceView
使用硬件加速。我目前正试图让这个画布使用硬件加速。
Canvas canvas = this.lockCanvas();
System.out.println(this.isHardwareAccelerated() + ", " + canvas.isHardwareAccelerated());
给我输出:真,假
(this
是 TextureView
)
有谁知道为什么canvas
没有硬件加速,以及如何做到这一点?
编辑:据我所知,似乎我必须使用 OpenGL。但是,我仍然想知道是否有任何已宣布的计划让这种画布的硬件加速成为可能。
【问题讨论】:
您应该为您的活动启用硬件加速:developer.android.com/guide/topics/manifest/…。 您可以在developer.android.com/guide/topics/graphics/hardware-accel.html 中查看。我不知道这是否是答案。因为它说检查 Canvas.isHardwareAccelerated 可以在 Canvas.onDraw 中使用。 【参考方案1】:TextureView
仅在应用程序硬件加速时工作,但它从lockCanvas()
返回的Canvas
目前从未硬件加速。这意味着您将在软件中在TextureView
的Canvas
内进行绘制,但TextureView
本身将使用GPU 进行绘制。目前,获得硬件加速 Canvas 的唯一方法是使用 View 的 onDraw(Canvas)
方法。
【讨论】:
【参考方案2】:查看Hardware Acceleration 文章。
基本上,如果您希望 TextureView
进行硬件加速,您必须确保在 TextureView 的上下文中启用了硬件加速,即以下之一:
<application android:hardwareAccelerated="true" ...>
在活动级别:
<activity android:hardwareAccelerated="true" />
在窗口高度:
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
请注意,硬件加速实际上是强制使用TextureView:
TextureView 只能在硬件加速窗口中使用。在软件中渲染时,TextureView 不会绘制任何内容。
【讨论】:
以上是关于使用 lockCanvas() 的 Android TextureView 硬件加速的主要内容,如果未能解决你的问题,请参考以下文章
Android图形系统之SurfaceSurfaceViewSurfaceHolder及SurfaceHolder.Callback之间的联系