dequeueBuffer: impossibile rimuovere dalla coda più buffer senza impostare il conteggio del buffer


123

Ricevo l'errore seguente Android 4.4.2 Moto X 2013in Rhomobile 5.0.2un'app WebView. L'app è compilata con SDK 19e minAPI 17.

Dopo alcune ricerche sembra che questo sia un problema con Snapdragon 800 / Adreno GPU devices:

qui e qui ci sono i link a questo problema su Google Issue Tracker

Disabilitare l'accelerazione hardware non è davvero un'opzione, perché rende il WebView molto lento.

Poiché l'errore è:

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

Come posso impostare il conteggio del buffer in 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
hai trovato una soluzione a questo problema?
Massimo

6
No, ma fortunatamente con Android 5+ il WebView è ora aggiornato tramite GooglePlay e questo problema sta lentamente scomparendo.
fnllc

Risposte:


1

Questo è un problema di memoria insufficiente come indicato qui:

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

android.view.Surfacesta effettuando più aggiornamenti di quelli che la GPU può gestire. Non sono sicuro che tu possa provare a catturarlo.
Credo anche che su molti dispositivi in ​​cui non si verificano arresti anomali gli utenti sperimenteranno occasionali gambe dell'interfaccia utente.

Ho affrontato un problema simile alcuni anni fa. Nel mio caso si trattava principalmente di gambe, ma credo che il problema sia lo stesso.

Per risolverlo ho aggiunto un contatore per misurare il frame rate. Ho visto che il frame rate è alto ma poi all'improvviso cala male, quindi ho applicato una logica di bilanciamento per cercare l'FPS più alto che non andrà bene.

  • Inizia con 60 FPS
  • Se le sue gambe, dividi l'FPS per 2
  • In caso contrario, impostalo sulla media tra l'ultimo valore e la corrente.
  • ripeti finché non sei felice;)

È fondamentalmente una ricerca binaria per l'FPS perfetto.

Nel tuo caso, è un po 'più complicato, poiché si verificano arresti anomali, quindi dovrai persistere il contatore FPS e stare più attento con la ricerca.

Invia registri FPS al tuo server. Una volta che avrai abbastanza dati, puoi essere più intelligente con il punto di partenza FPS per modulo del dispositivo.

Per quanto riguarda il mettere le mani su WebView SurfaceView immagino che anche questo non sia banale, ma stiamo parlando di Android 4.4.2, quindi non c'è niente che non puoi fare con la riflessione :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.