iOS Swift 4.0 Crash в фоновом режиме из-за OpenGL ES

Похоже, у меня все еще есть команда openGL ES, которая еще не завершена, и она отрисовывается в фоновом режиме, но Apple не позволяет, поэтому приложение вылетало.

Есть ли способ остановить команду openGL ES от рендеринга?

Я попытался glFinish(), но все еще крашлитс продолжает показывать этот сбой.

Заранее спасибо!

Вот информация о стеке:

0 libGPUSupportMercury.dylib    _gpus_ReturnNotPermittedKillClient + 12
1 AGXGLDriver   gldUpdateDispatch + 7296
2 libGPUSupportMercury.dylib    gpusSubmitDataBuffers + 176
3 AGXGLDriver   gldUpdateDispatch + 12668
4 IOAccelerator IOAccelContextFinishResourceSysMem + 64
5 libGPUSupportMercury.dylib    gldFinishObject + 128
6 GLEngine  _glBufferSubData_Exec + 652
7 WebCore   _ZN3WTF15__visitor_tableIZN7WebCore25WebGLRenderingContextBase13bufferSubDataEjxOSt8optionalINS_7VariantIJNS_6RefPtrIN3JSC11ArrayBufferEEENS5_INS6_15ArrayBufferViewEEEEEEEE3$_1JS8_SA_EE17__trampoline_funcIS8_EEvRSE_RSB_ + 104
8 WebCore   WebCore::WebGLRenderingContextBase::bufferSubData(unsigned int, long long, std::optional<WTF::Variant<WTF::RefPtr<JSC::ArrayBuffer>, WTF::RefPtr<JSC::ArrayBufferView> > >&&) + 296
9 WebCore   WebCore::jsWebGLRenderingContextPrototypeFunctionBufferSubData(JSC::ExecState*) + 492
10 JavaScriptCore   _llint_entry + 29668
11 JavaScriptCore   _llint_entry + 26912
12 JavaScriptCore   _llint_entry + 26912
13 JavaScriptCore   _llint_entry + 26912
14 JavaScriptCore   _llint_entry + 26912
15 JavaScriptCore   _llint_entry + 27012
16 JavaScriptCore   _llint_entry + 26912
17 JavaScriptCore   _llint_entry + 26912
18 JavaScriptCore   _vmEntryToJavaScript + 272
19 JavaScriptCore   JSC::JITCode::execute(JSC::VM*, JSC::ProtoCallFrame*) + 184
20 JavaScriptCore   JSC::Interpreter::executeCall(JSC::ExecState*, JSC::JSObject*, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 400
21 JavaScriptCore   JSC::profiledCall(JSC::ExecState*, JSC::ProfilingReason, JSC::JSValue, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&, WTF::NakedPtr<JSC::Exception>&) + 180
22 WebCore  WebCore::JSCallbackData::invokeCallback(WebCore::JSDOMGlobalObject&, JSC::JSObject*, JSC::MarkedArgumentBuffer&, WebCore::JSCallbackData::CallbackType, JSC::PropertyName, WTF::NakedPtr<JSC::Exception>&) + 536
23 WebCore  WebCore::JSRequestAnimationFrameCallback::handleEvent(double) + 648
24 WebCore  WebCore::ScriptedAnimationController::serviceScriptedAnimations(double) + 468
25 WebCore  WebCore::ThreadTimers::sharedTimerFiredInternal() + 172
26 WebCore  WebCore::timerFired(__CFRunLoopTimer*, void*) + 28
27 CoreFoundation   ___CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 28
28 CoreFoundation   ___CFRunLoopDoTimer + 864
29 CoreFoundation   ___CFRunLoopDoTimers + 248
30 CoreFoundation   ___CFRunLoopRun + 1928
31 CoreFoundation   CFRunLoopRunSpecific + 436
32 WebCore  RunWebThread(void*) + 560
33 libsystem_pthread.dylib  __pthread_body + 308
34 libsystem_pthread.dylib  __pthread_body

1 ответ

Поскольку все вызовы openGL являются "статическими", вы можете связать их все через некоторый экземпляр, чтобы вместо glDoSomething вызов Context.GL?.doSomething, Вы могли бы тогда установить GL собственность на nil и никакой метод на самом деле не будет вызван. Это может показаться глупым, на самом деле нагрузки систем делают именно это, чтобы уменьшить избыточный вызов и лучше отслеживать текущее состояние графического процессора.

Тем не мение. Мне трудно поверить, что это твоя проблема. Существует очень много приложений, использующих openGL, где некоторые из них мои. Ни у кого из них нет этой проблемы, и ни у кого нет такой защиты.

Был один случай, который привел к "похожим" результатам: соединение Bluetooth инициировало запуск приложения, которое было чисто фоновым. С его помощью был загружен пользовательский интерфейс, который вовремя попытался инициализировать контекст openGL, в котором произошел сбой при сбое. Возможно ли, что вы испытываете нечто подобное?

Но в общем случае переход в фоновый режим обычно приостанавливает все потоки и таймеры, которые приостанавливают все вызовы openGL, и такая ошибка не возникает. Я бы искал ситуации, когда вы выделяете какую-то фоновую работу, какую-то отдельную ветку. Эти потоки не должны вызывать ваш контекст openGL в целом, поэтому вы, вероятно, просто пытаетесь найти свою собственную ошибку.

Другие вопросы по тегам