1. 程式人生 > >開啟硬體加速 導致花屏問題 OpenGlRenderer 0x506 解決辦法

開啟硬體加速 導致花屏問題 OpenGlRenderer 0x506 解決辦法

(150114_17:08:32.461)I/dalvikvm-heap(  850): Grow heap (frag case) to 10.342MB for 2457616-byte allocation 
(150114_17:08:32.542)D/dalvikvm(  850): GC_FOR_ALLOC freed 20K, 25% free 10530K/14040K, paused 34ms, total 34ms 
(150114_17:08:32.551)D/dalvikvm(  850): GC_CONCURRENT freed 7K, 26% free 10524K/14040K, paused 1ms+5ms, total 24ms 
(150114_17:08:32.551)D/OpenGLRenderer(  850): GL error from OpenGLRenderer: 0x506

android4.2版定製的Launcher, 有機率出現應用整個繪製成花屏、黑屏或者字型繪製成方塊等問題,出現花屏問題的時候出現以上LOG

解決辦法:

當View 呼叫destroyLayer()的時候判斷如果當前的硬體加速不可用的時候,呼叫mHardwareRenderer的safelyRun來刪除mHardwareLayer的資源

修改View.java destroyLayer(boolean valid)方法

boolean destroyLayer(boolean valid) {
        if (mHardwareLayer != null) {
            AttachInfo info = mAttachInfo;
            if (info != null && info.mHardwareRenderer != null &&
                    info.mHardwareRenderer.isEnabled() &&
                    (valid || info.mHardwareRenderer.validate())) {

                info.mHardwareRenderer.cancelLayerUpdate(mHardwareLayer);
                mHardwareLayer.destroy();
                mHardwareLayer = null;

                invalidate(true);
                invalidateParentCaches();
            }
            else if(info != null && info.mHardwareRenderer != null)
            {
            	info.mHardwareRenderer.safelyRun(new Runnable() {

					@Override
					public void run() {
						// TODO Auto-generated method stub
						mHardwareLayer.destroy();
						mHardwareLayer = null;
						if (mDisplayList != null) 
							 mDisplayList.reset(); 

						 invalidate(true);
			             invalidateParentCaches();
						 }
					});
            }
            return true;
        }
        return false;
    }