dequeueBuffer: Es können nicht mehrere Puffer aus der Warteschlange entfernt werden, ohne die Pufferanzahl festzulegen

Lesezeit: 4 Minuten

Benutzer-Avatar
fnllc

Ich bekomme den Fehler unten auf Android 4.4.2 Moto X 2013 in einem Rhomobile 5.0.2 WebView-App. Die App wird mit kompiliert SDK 19 und minAPI 17.

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

hier und hier sind die Links zu diesem Problem auf Google-Problemverfolgung

Das Deaktivieren der Hardwarebeschleunigung ist nicht wirklich eine 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 com.rhomobile.rhodes.RhodesActivity einstellen?

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)

  • hast du eine Lösung für dieses Problem gefunden?

    – Massimo

    27. September 2016 um 11:24 Uhr

  • Nein, aber zum Glück wird die WebView mit Android 5+ jetzt über GooglePlay aktualisiert und dieses Problem verschwindet langsam.

    – fnllc

    27. September 2016 um 11:50 Uhr

Benutzer-Avatar
Ilja Gazman

Dies ist ein Speicherproblem, wie es hier angezeigt wird:

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

android.view.Surface macht mehr Updates, als die GPU verarbeiten kann. Ich bin mir nicht sicher, ob Sie diesen überhaupt versuchen können.
Ich glaube auch, dass die Benutzer auf vielen Geräten, auf denen es keinen Absturz gibt, gelegentlich Verzögerungen in der Benutzeroberfläche feststellen werden.

Ich stand vor ein paar Jahren vor einem ähnlichen Problem. In meinem Fall waren es hauptsächlich Lags, aber ich glaube, dass das Problem das gleiche ist.

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

  • Beginnen Sie mit 60 FPS
  • Wenn es verzögert, teilen Sie die FPS durch 2
  • Wenn dies nicht der Fall ist, stellen Sie den Durchschnitt zwischen dem letzten Wert und dem aktuellen Wert ein.
  • Wiederholen, bis Sie zufrieden sind 😉

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, sodass Sie den FPS-Zähler beibehalten und bei der Suche vorsichtiger sein müssen.

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

Was das Handhaben des WebView SurfaceView angeht, denke ich, dass dies auch nicht trivial ist, aber wir sprechen von Android 4.4.2, also gibt es nichts, was Sie mit Reflexion nicht tun können 🙂

1333390cookie-checkdequeueBuffer: Es können nicht mehrere Puffer aus der Warteschlange entfernt werden, ohne die Pufferanzahl festzulegen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy