如何在SurfaceView中禁用硬件加速?

5
我遇到了与此问题完全相同的困境: setShadowLayer Android API differences 我有一个玩家和敌人,正在使用14API进行编译。问题是:从14 API开始,默认启用硬件加速,但并不支持所有绘图方法(例如我要使用的setShadowLayer())。所以解决方案很简单,就像上面提到的那个话题一样。问题是:他使用View,而我为了更好的游戏性能使用SurfaceView。我的Surface View声明如下:
public class Screen extends SurfaceView implements Runnable { // Code }

因此,我刚刚添加到构造函数中:

public Screen(Context context) {
    super(context);
    holder = getHolder();
    setLayerType(View.LAYER_TYPE_SOFTWARE, null); // Here.
}

我想禁用在SurfaceView上的硬件加速,以使我的阴影看起来更自然,但结果却是整个SurfaceView停止工作。我无法展示发生了什么,但当我禁用硬件加速时它就不能绘制任何东西。这让我感到很悲观,因为似乎SurfaceView本身依赖于硬件加速,但当将画布绘制到其中时,阴影无法正常工作。


1
如果你使用软件渲染,尤其是在现代设备上,会损失很多性能。无论如何,在SurfaceView的Surface上禁用加速可能是不可能的——请注意http://developer.android.com/guide/topics/graphics/hardware-accel.html中说明您不能禁用窗口的加速。您是否尝试禁用整个活动或应用程序的加速? - fadden
是的,我也尝试了那部分。但是没有用,阴影看起来仍然很丑陋。我决定放弃阴影质量,并等待谷歌修复它。 - Ericson Willians
我的早期评论是不正确的。如@shelll的回答所述,从SurfaceView的Surface with lockCanvas()获取的Canvas未启用硬件加速。 - fadden
1个回答

5
根据这篇文章SurfaceView根本没有进行硬件加速,所以你的问题可能出在其他地方。

很容易判断 - 只需在锁定表面后调用 Canvas#isHardwareAccelerated() 即可。 我刚才在 SurfaceView 上尝试了一下,并确认它没有硬件加速。 - fadden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接