GLSurfaceView黑屏问题解决

本文深入探讨了GLSurfaceView在切换应用前后台时出现短暂黑屏的问题,分析了其背后的工作机制,并提供了解决方案。通过重写onWindowVisibilityChanged方法,避免了资源回收导致的黑屏现象。

问题列表

  1. 打开其他页面返回当前页面 GLSurfaceView会有短暂黑屏
  2. 按HOME键回到后台再切换回来 GLSurfaceView会有短暂黑屏

分析

以上问题 总结下就是回到后台后再切换到前台, GLSurfaceView会有短暂黑屏

提出问题

1.GLSurfaceView 回到后台做了什么

2.GLSurfaceView 回到前台做了什么

GLSurfaceView 回到后台以及前台,那么关注onWindowVisibilityChanged 就可以了,我们看下相关源码

@Override
 protected void onWindowVisibilityChanged(int visibility) {
     super.onWindowVisibilityChanged(visibility);
     mWindowVisibility = visibility == VISIBLE;
     mRequestedVisible = mWindowVisibility && mViewVisibility;
     updateWindow(false, false);
 }
 
 protected void updateWindow(boolean force, boolean redrawNeeded) {
     if (!mHaveFrame) {
         return;
     }
     ViewRootImpl viewRoot = getViewRootImpl();
     if (viewRoot != null) {
         mTranslator = viewRoot.mTranslator;
     }

     if (mTranslator != null) {
         mSurface.setCompatibilityTranslator(mTranslator);
     }

     int myWidth = mRequestedWidth;
     if (myWidth <= 0) myWidth = getWidth();
     int myHeight = mRequestedHeight;
     if (myHeight <= 0) myHeight = getHeight();

     getLocationInWindow(mLocation);
     final boolean creating = mWindow == null;
     final boolean formatChanged = mFormat != mRequestedFormat;
     final boolean sizeChanged = mWidth != myWidth || mHeight != myHeight;
     final boolean visibleChanged = mVisible != mRequestedVisible;

     if (force || creating || formatChanged || sizeChanged || visibleChanged
         || mLeft != mLocation[0] || mTop != mLocation[1]
         || mUpdateWindowNeeded || mReportDrawNeeded || redrawNeeded) {

         if (DEBUG) Log.i(TAG, "Changes: creating=" + creating
                 + " format=" + formatChanged + " size=" + sizeChanged
                 + " visible=" + visibleChanged
                 + " left=" + (mLeft != mLocation[0])
                 + " top=" + (mTop != mLocation[1]));

         try {
             final boolean visible = mVisible = mRequestedVisible;
        
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值