dequeueBuffer: Kann nicht mehrere Puffer aus der Warteschlange entfernen, ohne die Pufferanzahl festzulegen

123

Ich erhalte den folgenden Fehler Android 4.4.2 Moto X 2013in einer Rhomobile 5.0.2WebView-App. Die App wird mit SDK 19und kompiliert minAPI 17.

Nach einigen Recherchen scheint dies ein Problem zu sein mit Snapdragon 800 / Adreno GPU devices:

Hier und hier finden Sie die Links zu diesem Problem im Google Issue Tracker

Das Deaktivieren der Hardwarebeschleunigung ist keine Option, da das WebView dadurch sehr träge wird.

Da der Fehler ist:

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

Wie kann ich die Pufferanzahl in der Datei com.rhomobile.rhodes.RhodesActivity festlegen?

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
quelle
1
Haben Sie eine Lösung für dieses Problem gefunden?
Massimo
6
Nein, aber dank Android 5+ wird das WebView jetzt über GooglePlay aktualisiert und dieses Problem verschwindet langsam.
fnllc

Antworten:

1

Dies ist ein Problem mit zu wenig Speicher, wie hier angegeben:

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

android.view.Surfacenimmt mehr Updates vor, als die GPU verarbeiten kann. Ich bin mir nicht sicher, ob Sie diesen überhaupt fangen können.
Ich glaube auch, dass auf vielen Geräten, auf denen es keinen Absturz gibt, gelegentlich Benutzeroberflächen auftreten.

Ich hatte vor einigen Jahren ein ähnliches Problem. In meinem Fall waren es hauptsächlich Beine, aber ich glaube, dass das Problem dasselbe ist.

Um es zu lösen, habe ich einen Zähler hinzugefügt, um die Bildrate zu messen. Ich habe gesehen, dass die Bildrate hoch ist, aber dann fällt sie plötzlich stark ab, also habe ich eine Balance-Logik angewendet, um nach den höchsten FPS zu suchen, die nicht funktionieren.

  • Beginnen Sie mit 60 FPS
  • Wenn seine Beine, teilen Sie die FPS durch 2
  • Wenn dies nicht der Fall ist, stellen Sie den Durchschnitt zwischen dem letzten und dem aktuellen Wert ein.
  • wiederhole bis du glücklich bist;)

Es ist im Grunde eine binäre Suche nach dem perfekten FPS.

In Ihrem Fall ist es etwas kniffliger, da es zu Abstürzen kommt. Sie müssen also den FPS-Zähler beibehalten und bei der Suche vorsichtiger vorgehen.

Senden Sie FPS-Protokolle an Ihren Server. Sobald Sie über genügend Daten verfügen, können Sie mit dem FPS-Startpunkt pro Gerätemodul intelligenter sein.

Was das WebView SurfaceView angeht, denke ich, dass dies auch nicht trivial ist, aber wir sprechen über Android 4.4.2, also gibt es nichts, was Sie nicht mit Reflexion anfangen können :)

Ilya Gazman
quelle