dequeueBuffer: nie można usunąć z kolejki wielu buforów bez ustawienia liczby buforów

123

Otrzymuję poniższy błąd Android 4.4.2 Moto X 2013w Rhomobile 5.0.2aplikacji WebView. Aplikacja jest kompilowana za pomocą SDK 19i minAPI 17.

Po kilku badaniach wydaje się, że jest to problem z Snapdragon 800 / Adreno GPU devices:

tutaj i tutaj są linki do tego problemu w Google issue tracker

Wyłączenie akceleracji sprzętowej nie jest tak naprawdę opcją, ponieważ powoduje, że WebView działa bardzo wolno.

Ponieważ błąd to:

dequeueBuffer: can't dequeue multiple buffers without setting the buffer count

Jak ustawić liczbę buforów w com.rhomobile.rhodes.RhodesActivity?

11-08 18:28:31.227: I/SFPerfTracer(238):      triggers: (rate: 0:0) (423387 sw vsyncs) (0 skipped) (0:361861 vsyncs) (2:863582)
11-08 18:28:31.328: W/Adreno-EGLSUB(4749): <DequeueBuffer:593>: dequeue native buffer fail: Unknown error 2147483646, buffer=0x61213afc, handle=0x0
11-08 18:28:31.331: W/Adreno-EGLSUB(4749): <SwapBuffers:1343>: Invalid native buffer. Failed to queueBuffer
11-08 18:28:31.331: W/Adreno-EGLSUB(4749): <updater_thread:456>: native buffer is NULL
11-08 18:28:31.346: E/BufferQueue(238): [com.myapp.myapp/com.rhomobile.rhodes.RhodesActivity] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count
11-08 18:28:31.346: W/Adreno-EGLSUB(4749): <DequeueBuffer:593>: dequeue native buffer fail: Invalid argument, buffer=0x61213afc, handle=0x0
11-08 18:28:31.347: W/Adreno-ES20(4749): <gl2_surface_swap:43>: GL_OUT_OF_MEMORY
11-08 18:28:31.347: W/Adreno-EGL(4749): <qeglDrvAPI_eglSwapBuffers:3596>: EGL_BAD_SURFACE
11-08 18:28:31.347: W/HardwareRenderer(4749): EGL error: EGL_BAD_SURFACE
11-08 18:28:31.352: W/HardwareRenderer(4749): Mountain View, we've had a problem here. Switching back to software rendering.
11-08 18:28:31.478: D/qdgralloc(4749): Invalid gralloc handle (at 0x0): ver(-1/12) ints(-1/12) fds(-1/2) magic(????/gmsm)
11-08 18:28:31.478: W/GraphicBufferMapper(4749): lock(...) failed -22 (Invalid argument)
11-08 18:28:31.478: W/Surface(4749): failed locking buffer (handle = 0x0)
11-08 18:28:31.531: E/ViewRootImpl(4749): Could not lock surface
11-08 18:28:31.531: E/ViewRootImpl(4749): java.lang.IllegalArgumentException
11-08 18:28:31.531: E/ViewRootImpl(4749):      at android.view.Surface.nativeLockCanvas(Native Method)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at android.view.Surface.lockCanvas(Surface.java:243)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at android.view.ViewRootImpl.drawSoftware(ViewRootImpl.java:2466)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at android.view.ViewRootImpl.draw(ViewRootImpl.java:2440)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2284)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1914)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1024)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5796)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at android.view.Choreographer.doCallbacks(Choreographer.java:574)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at android.view.Choreographer.doFrame(Choreographer.java:544)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at android.os.Handler.handleCallback(Handler.java:733)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at android.os.Handler.dispatchMessage(Handler.java:95)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at android.os.Looper.loop(Looper.java:136)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at android.app.ActivityThread.main(ActivityThread.java:5102)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at java.lang.reflect.Method.invokeNative(Native Method)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at java.lang.reflect.Method.invoke(Method.java:515)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
11-08 18:28:31.531: E/ViewRootImpl(4749):      at dalvik.system.NativeStart.main(Native Method)
fnllc
źródło
1
czy znalazłeś rozwiązanie tego problemu?
Massimo
6
Nie, ale na szczęście w systemie Android 5+ WebView jest teraz aktualizowany przez GooglePlay i ten problem powoli znika.
fnllc

Odpowiedzi:

1

Jest to problem braku pamięci, jak wskazano tutaj:

11-08 18: 28: 31.347: W / Adreno-ES20 (4749):: GL_OUT_OF_MEMORY

android.view.Surfacewprowadza więcej aktualizacji, niż może obsłużyć GPU. Nie jestem pewien, czy możesz nawet spróbować złapać ten.
Wierzę również, że na wielu urządzeniach, na których nie ma awarii, użytkownicy będą doświadczać sporadycznych zmian interfejsu użytkownika.

Z podobnym problemem miałem do czynienia kilka lat temu. W moim przypadku były to przede wszystkim nogi, ale uważam, że problem jest ten sam.

Aby go rozwiązać, dodałem licznik do pomiaru liczby klatek na sekundę. Widziałem, że liczba klatek na sekundę jest wysoka, ale nagle nagle spada, więc zastosowałem logikę równowagi, aby wyszukać najwyższy FPS, który nie wytrzyma.

  • Zacznij od 60 FPS
  • Jeśli ma nogi, podziel FPS przez 2
  • Jeśli tak nie jest, ustaw go na średnią między ostatnią wartością a bieżącą.
  • powtarzaj, aż będziesz szczęśliwy;)

Jest to po prostu binarne wyszukiwanie idealnego FPS-a.

W twoim przypadku jest to nieco trudniejsze, ponieważ występują awarie, więc będziesz musiał utrzymywać licznik FPS i być bardziej ostrożnym podczas wyszukiwania.

Wyślij dzienniki FPS na swój serwer. Gdy będziesz mieć wystarczającą ilość danych, możesz być mądrzejszy dzięki punktowi początkowemu FPS na moduł urządzenia.

Jeśli chodzi o wkładanie rąk do WebView SurfaceView to też chyba nie jest to trywialne, ale mówimy o Androidzie 4.4.2, więc nie ma nic, czego nie można zrobić z odbiciem :)

Ilya Gazman
źródło