dequeueBuffer: no puede eliminar múltiples buffers sin configurar el conteo de buffer


123

Recibo el siguiente error Android 4.4.2 Moto X 2013en una Rhomobile 5.0.2aplicación WebView. La aplicación está compilada con SDK 19y minAPI 17.

Después de algunas investigaciones, parece que este es un problema con Snapdragon 800 / Adreno GPU devices:

Aquí y aquí están los enlaces a este problema en el rastreador de problemas de Google

Deshabilitar la aceleración de hardware no es realmente una opción, porque hace que WebView sea muy lento.

Como el error es:

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

¿Cómo puedo configurar el conteo del búfer en 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)

1
¿Encontraste una solución a este problema?
Massimo

66
No, pero afortunadamente con Android 5+, WebView ahora se actualiza a través de GooglePlay y este problema está desapareciendo lentamente.
fnllc

Respuestas:


1

Este es un problema de falta de memoria como se indica aquí:

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

android.view.Surfaceestá haciendo más actualizaciones que la GPU puede manejar. No estoy seguro de que incluso puedas intentar atraparlo.
También creo que en muchos dispositivos donde no hay bloqueo, los usuarios experimentarán ocasionales patas de interfaz de usuario.

Me enfrenté a un problema similar hace unos años. En mi caso, se trataba principalmente de piernas, pero creo que el problema es el mismo.

Para resolverlo, agregué un contador para medir la velocidad de fotogramas. Vi que la velocidad de fotogramas es alta, pero de repente cae muy mal, así que apliqué una lógica de equilibrio para buscar el FPS más alto que no sea compatible.

  • Comience con 60 FPS
  • Si sus patas, dividen el FPS por 2
  • Si no es así, configúrelo como promedio entre el último valor y el actual.
  • repite hasta que estés feliz;)

Básicamente es una búsqueda binaria para el FPS perfecto.

En su caso, es un poco más complicado, ya que experimenta bloqueos, por lo que tendrá que persistir en el contador de FPS y tener más cuidado con la búsqueda.

Enviar registros FPS a su servidor. Una vez que tenga suficientes datos, puede ser más inteligente con el punto de mira FPS por módulo de dispositivo.

En cuanto a poner tus manos en WebView SurfaceView, supongo que esto no es trivial también, pero estamos hablando de Android 4.4.2, por lo que no hay nada que no puedas hacer con la reflexión :)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.