dequeueBuffer: não é possível desenfileirar vários buffers sem definir a contagem de buffers

123

Estou recebendo o erro abaixo Android 4.4.2 Moto X 2013em um Rhomobile 5.0.2aplicativo WebView. O aplicativo é compilado com SDK 19e minAPI 17.

Após algumas pesquisas, parece que este é um problema com Snapdragon 800 / Adreno GPU devices:

aqui e aqui estão os links para esse problema no rastreador de problemas do google

Desativar a aceleração de hardware não é realmente uma opção, pois torna o WebView muito lento.

Como o erro é:

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

Como posso definir a contagem de buffer no 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
fonte
1
Você encontrou uma solução para este problema?
Massimo
6
Não, mas felizmente com o Android 5+, o WebView agora é atualizado pelo GooglePlay e esse problema está desaparecendo lentamente.
precisa saber é

Respostas:

1

Este é um problema de falta de memória, conforme indicado aqui:

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

android.view.Surfaceestá fazendo mais atualizações do que a GPU pode suportar. Não tenho certeza de que você possa tentar pegar esse.
Também acredito que em muitos dispositivos onde não há falhas, os usuários experimentam pernas ocasionais da interface do usuário.

Eu enfrentei um problema semelhante há alguns anos atrás. No meu caso, eram principalmente pernas, mas acredito que o problema é o mesmo.

Para resolvê-lo, adicionei um contador para medir a taxa de quadros. Vi que a taxa de quadros é alta, mas, de repente, cai muito, então apliquei uma lógica de equilíbrio para procurar o FPS mais alto que não diminui.

  • Comece com 60 FPS
  • Se tiver as pernas, divida o FPS por 2
  • Caso contrário, defina-o para a média entre o último valor e o atual.
  • repita até que você esteja feliz;)

É basicamente uma busca binária pelo FPS perfeito.

No seu caso, é um pouco mais complicado, já que você experimenta falhas, então você terá que persistir no contador do FPS e ter mais cuidado com a pesquisa.

Envie logs do FPS para o seu servidor. Depois de ter dados suficientes, você pode ser mais inteligente com o ponto de partida do FPS por módulo de dispositivo.

Quanto a colocar as mãos no WebView SurfaceView, acho que isso também não é trivial, mas estamos falando do Android 4.4.2, então não há nada que você não possa fazer com a reflexão :)

Ilya Gazman
fonte