从Activity onStart()调用Google Play服务GoogleApiClient.connect()会导致间歇性的OpenGL崩溃(NvRmChannelSubmit错误等)

时间:2014-06-27 21:40:07

标签: android opengl-es google-play-services android-fragmentactivity

我将我们的应用更新为Google Play Services第17版,这需要将我们应用的3D活动从Activity更改为FragmentActivity。我们现在比以前更早地调用GoogleApiClient.connect(),因为谷歌建议从活动的onStart()调用GoogleApiClient.connect()。

这引起了严重的倒退:现在,在发布Nexus 7时,全新安装大约30%的时间都会崩溃。崩溃记录NvRmChannelSubmit:NvError_IoctlFailed后跟无穷无尽的其他NvRmChannelSubmit错误,我认为这只是一个混乱的opengl驱动程序状态。

这是一个全新的错误,我们的应用程序除了以外没有任何变化:

  • 活动已从Activity更改为android.support.v4.app.FragmentActivity
  • GPS init UI现在更早触发,因为我们从onStart()
  • 调用connect()
  • 更新为GPS rev 17(有很多变化,但希望没有任何东西可以触及opengl!)

我有一个理论是GPS连接UI和/或FragmentActivity的底层更改正在影响窗口,同时应用程序正在启动并干扰opengl驱动程序初始化。但我没有证据证明是原因,如果这是原因,我不知道如何解决它。

是否有其他人看到与GPS连接UI流或FragmentActivity相关的opengl驱动程序问题?

1 个答案:

答案 0 :(得分:4)

问题已解决。

我确认opengl崩溃是由于在opengl初始化时从我们的Activity的onStart()方法调用GoogleApiClient.connect()引起的:如果我将调用推迟到connect()直到第一个OpenGL帧被渲染之后,bug就被修复了

结论:

  • Google建议从Activity onStart()调用connect(),但这对于opengl应用来说是安全。如果connect()调用触发其他GPS UI流程,它会在运行4.3的Nexus 7上崩溃opengl驱动程序。用于用户帐户选择
  • 延迟connect()调用对我们来说是一个直接的解决方法,但要小心,因为如果你仍然像我们一样使用Activity onStop()来调用GoogleApiClient.disconnect(),则不再保证连接()将在disconnect()之前调用。如果发生这种情况,我没有看到GPS内部状态有任何问题,但Google的示例代码维护了一些与错误处理相关的状态,该代码可能需要更改才能工作。

我从未确定过opengl崩溃的确切根本原因。如果我们从onStart调用它(我们之前的实现稍后称之为),那么旧的GPS连接方法也可能导致同样的崩溃。崩溃也可能与GPS没有直接关系,但在opengl初始化期间使用FragmentActivity覆盖UI时,它只是一个普通的opengl驱动程序与窗口管理器问题。