美文网首页
ios openGL在进入后台的时候crash

ios openGL在进入后台的时候crash

作者: frola_ | 来源:发表于2018-11-26 14:32 被阅读0次

    崩溃日志

    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;
    }
    

    相关文章

      网友评论

          本文标题:ios openGL在进入后台的时候crash

          本文链接:https://www.haomeiwen.com/subject/ktdbqqtx.html