Android平台不支持在多个Surface上显示吗?

在Android平台上,onSurfaceCreatedNative和onSurfaceDestroyNative都是调用的同一个方法setWindow无标题 ,因此当有多个Surface时,最终只会显示在最后设置的Surface上,而且也会存在调用时序的问题。必须要确保最后init的surface后不能再调用onSurfaceDestroyNative,否则刚执行APP_CMD_INIT_WINDOW就会再执行APP_CMD_TERM_WINDOW,导致没有动画。想问下官方,这是本身就如此设计不支持多个surface呢,还是说这是个bug呢?

什么情况下会有多个 surface 呢?

比如一个activity里有一个surface,当跳转到另一个activity时,也有一个surface的情况。或者说动态壁纸的情况,当应用了cocos做的动态壁纸,然后再进动态壁纸的预览界面时,动态壁纸的进程会在此时同时有两个surface,一个surface是桌面上的,一个surface是预览界面的。

但是 cocos 是使用了了自己的 Surface 类,应该和别的 activity 的 surface 没关系啊。

我测试的过程中是会有影响的,我拿动态壁纸的流程详细说明一下,Android动态壁纸的流程是当用户点击动态壁纸列表中的一个壁纸时,会先出来一个动态壁纸预览的界面,此时动态壁纸是显示在Surface上,这里称为preview surface,当用户点击应用时,动态壁纸会应用到桌面上,这时候桌面会有另一个Surface生成,这里称为launcher surface。Android本身的流程会先创建桌面的Surface,然后再销毁预览界面里的Surface,因此这个过程中Surface相关的流程是preview surface create - launcher surface create - preview surface destroy,而我会在每个surface create时调用onSurfaceCreatedNative,在每个surface destroy时调用onSurfaceDestroyNative,如下图:


而onSurfaceCreatedNative和onSurfaceDestroyNative最终都会调用到setWindow的方法,只是onSurfaceDestroyNative调用时传的参数是nullptr,preview surface和launcher surface是在同一个进程下的。
截图2

因为当调用preview surface create时,cc::cocosApp.window对应的是preview surface,当调用launcher surface create时,cc::cocosApp.window就会被改成launcher surface,而后再调用preview surface destroy时,会执行APP_CMD_TERM_WINDOW的命令,将cc::cocosApp.animating = false,而在glThreadEntry里,当cc::cocosApp.animating = false为false时,game->tick()就执行不到了,因此就不会有动画了。

那确实是没有适配这种情况。目前也没什么好的办法,引擎得确保渲染线程和 Android 线程同步。你试试 Android 的 native activity sample,看看是否也会出现这样的问题。

好的,了解了哈。感谢回复。

你这个问题解决了吗,有什么方法优化吗