SurfaceView 中的 Canvas - 硬件加速

13

我正在开发ICS,并试图了解在SurfaceView中使用Canvas时为什么Canvas.isHardwareAccelerated()总是返回FALSE。

我尝试了一个非常基本的示例,如下所示: http://android-coding.blogspot.com/2011/05/drawing-on-surfaceview.html 或者这个:http://jmsliu.com/199/android-canvas-example.html

我甚至修改了它们,使得绘制循环内没有任何canvas调用,以为某些绘制调用会导致不支持的硬件加速操作。 我查看了“不支持的绘制操作”列表 developer.android.com/guide/topics/graphics/hardware-accel.html 但我没有做任何那样的东西。

我正在使用Force GPU渲染标志和 在清单中,我还指定了minSDK/targetSDK >= 14。

View.isHardwareAccelerated将返回TRUE,而Canvas.isHardwareAccelerated将始终返回FALSE。

我看到Canvas.java对isHardwareAccelerated()进行了硬编码,而HardwareCanvas.java则返回true。我想我之所以无法获得HW路径,可能是由于某些原因吗?

SurfaceView中的Canvas可以进行硬件加速吗?

谢谢

3个回答

15

SurfaceView.lockCanvas() 返回的画布目前无法使用硬件加速。


1
在JellyBean(4.2.1)中是否仍然如此? - Yahma
3
@RomainGuy 我发现了隐藏的API public Canvas lockHardwareCanvas(),但没有看到在哪里使用它,是否可能使用此方法来获取SurfaceView硬件加速? - Juude
在Lollipop中是否仍然是这种情况? - Scorb
你是如何得出这个结论的? - Eido95

5

看起来android.view.Surface中有一个新的隐藏API方法unlockHardwareCanvas

这是示例:http://androidxref.com/5.1.0_r1/xref/frameworks/base/tests/HwAccelerationTest/src/com/android/test/hwui/HardwareCanvasSurfaceViewActivity.java

在生产环境中,您可以使用反射。


1

你在 Android Manifest 中声明了你的应用程序要使用硬件加速吗?

这将类似于以下内容: <application android:hardwareAccelerated="true" ...>

根据你想要做什么,只为一个活动或窗口激活加速也可能很有用,请参阅http://developer.android.com/guide/topics/graphics/hardware-accel.html以获取详细信息。

Rudi


是的,我已经在我的清单文件中声明了<application android:hardwareAccelerated="true" ...>,事实上,我可以看到视图进行了硬件加速,但画布没有。 - user1019096
1
@AliAlNoaimi 它可能在其他视图上运行,但不适用于 SurfaceView。正如另一个答案所述,这是不可能的。 - Pijusn

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