在快速暂停/恢复应用程序时,在Android NDK中使用SurfaceView崩溃

当我暂停/取消暂停我的应用程序时,我遇到以下问题:
E/BufferQueueProducer(  177): [SurfaceView] connect(P): already connected (cur=1 req=1)
E/libEGL  (25863): eglCreateWindowSurface: native_window_api_connect (win=0xb4984508) Failed (0xffffffea) (already connected to another API?)
E/libEGL  (25863): eglCreateWindowSurface:416 error 3003 (EGL_BAD_ALLOC)

我很确定我正在停止/正确启动我的渲染线程这个问题真的只发生在我非常快地暂停/恢复应用程序时(比如当你混合打开应用程序按钮时).

任何想法可能是eglCreateWindowSurface在这里返回EGL_NO_SURFACE的原因?我猜这将与仍然连接到SurfaceView的东西有关.

解决方法

听起来你正在尝试为已有的表面创建一个EGLSurface.如果速度是一个问题,通常是因为Surface回调处理滞后 – SurfaceView Surface部分由Window Manager处理,这需要进程间通信.

也许你的原生代码仍然有旧的SurfaceHolder的句柄,如果你移动得更慢,句柄将被即将到来的surfaceCreated()取代?如果不确切知道代码的作用,很难说.解决这些问题的一种方法是在所有有趣的状态变化点添加日志记录,并比较“慢”暂停/恢复和“快速”暂停/恢复的日志.

应该可以通过仔细管理SurfaceView状态来避免这些情况. This appendix到图形拱文档讲述了Activity和SurfaceView生命周期之间的区别,以及两种构建应用程序以避免问题的方法.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...