使用 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());

给我输出:真,假 (thisTextureView

有谁知道为什么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 目前从未硬件加速。这意味着您将在软件中在TextureViewCanvas 内进行绘制,但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 深入系统完全讲解(20)

Android图形系统之SurfaceSurfaceViewSurfaceHolder及SurfaceHolder.Callback之间的联系

使用毕加索库获取位图图像

软件绘制源码流程分析

我如何在 Surfaceview 上绘制任何已经渲染相机预览的线?

View的Canvas绘制黑色原因