ios openGL在进入后台的时候crash

2018-11-26  本文已影响0人  frola_

崩溃日志

0 libGPUSupportMercury.dylib    _gpus_ReturnNotPermittedKillClient + 12
1 AGXGLDriver   gldUpdateDispatch + 7016
2 libGPUSupportMercury.dylib    gpusSubmitDataBuffers + 176
3 AGXGLDriver   gldUpdateDispatch + 12476
4 GLEngine  gliBindViewES + 108
5 OpenGLES  -[EAGLContext renderbufferStorage:fromDrawable:] + 504
6 WebCore   WebCore::GraphicsContext3D::~GraphicsContext3D() + 240
7 WebCore   WebCore::WebGLRenderingContextBase::destroyGraphicsContext3D() + 220
8 WebCore   WebCore::WebGLRenderingContextBase::~WebGLRenderingContextBase() + 860
9 WebCore   WebCore::WebGLRenderingContext::~WebGLRenderingContext() + 12
10 WebCore  WebCore::HTMLCanvasElement::~HTMLCanvasElement() + 84
11 WebCore  WebCore::HTMLCanvasElement::~HTMLCanvasElement() + 12
12 JavaScriptCore   void JSC::MarkedBlock::Handle::specializedSweep<true, (JSC::MarkedBlock::Handle::EmptyMode)1, (JSC::MarkedBlock::Handle::SweepMode)1, (JSC::MarkedBlock::Handle::SweepDestructionMode)1, (JSC::MarkedBlock::Handle::ScribbleMode)0, (JSC::MarkedBlock::Handle::NewlyAllocatedMode)1, (JSC::MarkedBlock::Handle::MarksMode)1, JSC::JSDestructibleObjectDestroyFunc>(JSC::FreeList*, JSC::MarkedBlock::Handle::EmptyMode, JSC::MarkedBlock::Handle::SweepMode, JSC::MarkedBlock::Handle::SweepDestructionMode, JSC::MarkedBlock::Handle::ScribbleMode, JSC::MarkedBlock::Handle::NewlyAllocatedMode, JSC::MarkedBlock::Handle::MarksMode, JSC::JSDestructibleObjectDestroyFunc const&) + 212
13 JavaScriptCore   void JSC::MarkedBlock::Handle::finishSweepKnowingHeapCellType<JSC::JSDestructibleObjectDestroyFunc>(JSC::FreeList*, JSC::JSDestructibleObjectDestroyFunc const&)::'lambda'()::operator()() const + 408
14 JavaScriptCore   void JSC::MarkedBlock::Handle::finishSweepKnowingHeapCellType<JSC::JSDestructibleObjectDestroyFunc>(JSC::FreeList*, JSC::JSDestructibleObjectDestroyFunc const&) + 320
15 JavaScriptCore   JSC::JSDestructibleObjectHeapCellType::finishSweep(JSC::MarkedBlock::Handle&, JSC::FreeList*) + 32
16 JavaScriptCore   JSC::MarkedBlock::Handle::sweep(JSC::FreeList*) + 372
17 JavaScriptCore   JSC::LocalAllocator::tryAllocateIn(JSC::MarkedBlock::Handle*) + 40
18 JavaScriptCore   JSC::LocalAllocator::tryAllocateWithoutCollecting() + 48
19 JavaScriptCore   JSC::LocalAllocator::allocateSlowCase(JSC::GCDeferralContext*, JSC::AllocationFailureMode) + 292
20 JavaScriptCore   JSC::CompleteSubspace::allocateNonVirtual(JSC::VM&, unsigned long, JSC::GCDeferralContext*, JSC::AllocationFailureMode) + 216
21 WebCore  std::__1::enable_if<std::is_same<WebCore::DOMRect, WebCore::DOMRect>::value, WebCore::JSDOMWrapperConverterTraits<WebCore::DOMRect>::WrapperClass*>::type WebCore::createWrapper<WebCore::DOMRect, WebCore::DOMRect>(WebCore::JSDOMGlobalObject*, WTF::Ref<WebCore::DOMRect, WTF::DumbPtrTraits<WebCore::DOMRect> >&&) + 216
22 WebCore  WebCore::jsElementPrototypeFunctionGetBoundingClientRect(JSC::ExecState*) + 148

解决方案:

进入后台的时候 enableGL NO,进入前台 enableGL YES
typedef void (*CallFuc)(id, SEL, BOOL);
typedef BOOL (*GetFuc)(id, SEL);

- (BOOL)webView:(UIWebView *)view enableGL:(BOOL)bEnable {
    BOOL bRet = NO;
    do {
        Ivar internalVar = class_getInstanceVariable([view class], "_internal");
        if (!internalVar) {
            break;
        }
        
        UIWebViewInternal *internalObj = object_getIvar(view, internalVar);
        Ivar browserVar = class_getInstanceVariable(object_getClass(internalObj), "browserView");
        if (!browserVar) {
            break;
        }
        
        id webbrowser = object_getIvar(internalObj, browserVar);
        Ivar webViewVar = class_getInstanceVariable(object_getClass(webbrowser), "_webView");
        if (!webViewVar) {
            break;
        }
        
        id webView = (id)object_getIvar(webbrowser, webViewVar);
        if (!webView) {
        }
        
        if (object_getClass(webView) != NSClassFromString(@"WebView")) {
            break;
        }
        
        SEL selector = NSSelectorFromString(@"_setWebGLEnabled:");
        IMP impSet = [webView methodForSelector:selector];
        CallFuc func = (CallFuc)impSet;
        func(webView, selector, bEnable);
        
        SEL selectorGet = NSSelectorFromString(@"_webGLEnabled");
        IMP impGet = [webView methodForSelector:selectorGet];
        GetFuc funcGet = (GetFuc)impGet;
        BOOL val = funcGet(webView, selector);
        
        bRet = (val == bEnable);
    } while(NO);
    
    return bRet;
}
上一篇下一篇

猜你喜欢

热点阅读