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 в целом, поэтому вы, вероятно, просто пытаетесь найти свою собственную ошибку.