Android WallpaperService.Engine 与 RuntimeShader

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

我最近发现了 Android 中的 RuntimeShader ,能够添加着色器而无需任何开销,真是太棒了。我一直在修改 WallpaperService 并认为这将是开始在那里使用着色器的简单方法。但是,我遇到了一个例外

IllegalArgumentException: Software rendering doesn't support RuntimeShader

使用将其着色器设置为 RuntimeShader` 实例的

Paint
对象执行 canvas.drawPaint(Paint) 时,BaseCanvas 会抛出错误。

即使在我的

WallpaperService.Engine
中我所做的只是一个简单的固定颜色着色器,也会引发此错误:


override fun onSurfaceChanged(
            holder: SurfaceHolder?, format: Int,
            w: Int, h: Int
        ) {
            super.onSurfaceChanged(holder, format, w, h)

            val fixedColorShader = RuntimeShader(
            """
                half4 main(float2 fragCoord) {
                            return half4(1,0,0,1);
                }
            """)
            val paintShader = Paint()
            paintShader.shader = fixedColorShader

            val canvas = holder?.lockCanvas()
            canvas?.drawPaint(paintShader)
            holder?.unlockCanvasAndPost(canvas)
        }

我猜这是 RuntimeShader 的一个不幸的限制,但这可能是我正在使用的特定设备的问题吗?

我仍然想问是否有人知道如何在壁纸服务中使用 RuntimeShader,如果不知道,是否有人知道为什么存在此限制?

android shader android-wallpaper
1个回答
0
投票

使用

canvas = holder.lockHardwareCanvas();
代替
holder.lockCanvas();

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