我最近发现了 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,如果不知道,是否有人知道为什么存在此限制?
使用
canvas = holder.lockHardwareCanvas();
代替 holder.lockCanvas();