Android TextureView 使用 lockCanvas() 进行硬件加速

问题描述 投票:0回答:3

我正在尝试在画布上使用 Android 的硬件加速。我曾经有一个

SurfaceView
,我在上面做了
lockCanvas()
以获得稍后在其上绘制的画布,但我更改为
TextureView
,因为我无法让
SurfaceView
使用硬件加速。我目前正在尝试让这个画布使用硬件加速。

Canvas canvas = this.lockCanvas();
System.out.println(this.isHardwareAccelerated() + ", " + canvas.isHardwareAccelerated());

给我输出:true、false (

this
TextureView

有谁知道为什么

canvas
没有硬件加速,以及如何做到这一点?

编辑:据我所知,似乎我必须使用OpenGL。但是,我仍然想知道是否有任何已宣布的计划使此类画布成为可能的硬件加速。

java android android-canvas hardware-acceleration
3个回答
11
投票

TextureView
仅当应用程序进行硬件加速时才有效,但从
Canvas
返回的
lockCanvas()
目前从未进行硬件加速。这意味着您将在软件中在
TextureView
Canvas
内部进行绘制,但
TextureView
本身将使用 GPU 进行绘制。目前,获得硬件加速 Canvas 的唯一方法是使用 View 的
onDraw(Canvas)
方法。


6
投票

查看硬件加速文章。

基本上,如果您希望

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 将不会绘制任何内容。


0
投票

更新:

从 API 级别 23 (Android 6.0) 开始,您可以通过调用 surface.lockHardwareCanvas() 获得硬件加速画布。

© www.soinside.com 2019 - 2024. All rights reserved.