【问题标题】:When should we use LAYER_TYPE_HARDWARE我们什么时候应该使用 LAYER_TYPE_HARDWARE
【发布时间】:2014-11-26 13:21:36
【问题描述】:

阅读http://developer.android.com/guide/topics/graphics/hardware-accel.html后,我对3种不同类型的分层技术的理解是(假设设备有GPU)

  • LAYER_TYPE_SOFTWARE - 绘图由软件在软件的屏幕外位图内存上执行。软件的离屏位图随后将传输到 GPU。 GPU 渲染屏幕上的位图。
  • LAYER_TYPE_NONE - GPU 将在屏幕上直接绘图
  • LAYER_TYPE_HARDWARE - 绘图由 GPU 在 GPU 的屏幕外位图内存上执行。 GPU 的离屏位图随后将由 GPU渲染到屏幕。

何时使用 LAYER_TYPE_SOFTWARE

我理解某些 draw 操作不受 GPU 支持,例如 setShadowLayer。因此,我们需要切换到LAYER_TYPE_SOFTWARE,以便draw由软件执行。

但是,由于有软件的屏幕外位图内存转移到 GPU 操作,事情可能会显得更慢。

何时使用 LAYER_TYPE_NONE

我认为这是大多数设备的默认设置。所以,我认为我们应该在大部分时间使用这种技术。

何时使用 LAYER_TYPE_HARDWARE

我不知道什么时候使用这种技术。非常感谢任何示例,我们应该何时应用LAYER_TYPE_HARDWARE 技术。

p/s 另外,我对 LAYER_TYPE_... 的理解可能看起来是错误的。如果您发现任何错误,请纠正我。谢谢。

【问题讨论】:

  • LAYER_TYPE_HARDWARE:如果应用程序是硬件加速的,则视图在硬件中呈现为硬件纹理。如果应用程序没有硬件加速,则此层类型的行为与 LAYER_TYPE_SOFTWARE 相同。

标签: android opengl-es


【解决方案1】:

何时使用 LAYER_TYPE_HARDWARE

当我想绘制一个剪切父视图的文本(让你看透它)时,我使用:

setLayerType(View.LAYER_TYPE_HARDWARE, null)

例如在我的自定义视图中:

init {
    setLayerType(View.LAYER_TYPE_HARDWARE, null)
}

private val textPaint = TextPaint(ANTI_ALIAS_FLAG).apply {
    textSize = size
    xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)
}

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
    createTextLayout(MeasureSpec.getSize(widthMeasureSpec))
    setMeasuredDimension(widthMeasureSpec, heightMeasureSpec)
}

private fun createTextLayout(textWidth: Int) {
    textLayout = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        StaticLayout.Builder
                .obtain(text, 0, text.length, textPaint, textWidth)
                .setAlignment(Layout.Alignment.ALIGN_CENTER)
                .build()
    } else {
        StaticLayout(text, textPaint, textWidth, Layout.Alignment.ALIGN_CENTER, 1f, 0f, true)
    }
}

...

override fun onDraw(canvas: Canvas?) {
    canvas?.drawCircle(width / 2f, height / 2f, width / 2f, circlePaint)

    canvas?.withTranslation(
            x = width / 2f - textLayout.width / 2f,
            y = height / 2f - textLayout.height / 2f
    ) {
        textLayout.draw(canvas)
    }
}

结果:

并且无需设置 LAYER_TYPE_HARDWARE:

【讨论】:

  • 在这种情况下解释你为什么这样做会很有帮助。
【解决方案2】:

基本上它就像一个绘图缓存。如果您的自定义视图渲染/绘制成本很高,但内容不会经常更改,那么我会使用该标志。否则,您只是无缘无故地强调要缓存的设备。

【讨论】:

    【解决方案3】:

    您应该在大多数情况下使用 LAYER_TYPE_HARDWARE,因为它更有效。 但必须考虑到,并非所有 Canvas 绘图操作都支持特定 API 级别的 LAYER_TYPE_HARDWARE。所以,如果你需要通过硬件加速来做一些不支持的绘图,你可能需要切换到LAYER_TYPE_SOFTWARE

    跨 API 级别的绘制支持操作列表:Link

    下一个链接详细介绍了硬件加速,它会提示您何时使用它:Link

    【讨论】:

      猜你喜欢
      • 2021-09-07
      • 1970-01-01
      • 2011-07-04
      • 2017-09-13
      • 2021-12-29
      • 2011-07-17
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多