dequeueBuffer: не можна видалити кілька буферів без встановлення кількості буфера


123

Я отримую помилку нижче Android 4.4.2 Moto X 2013в Rhomobile 5.0.2додатку WebView. Додаток складено з SDK 19та minAPI 17.

Після деяких досліджень здається, що це проблема з Snapdragon 800 / Adreno GPU devices:

тут і ось перелік посилань на цю проблему в трекері випуску google

Відключення апаратного прискорення насправді не є варіантом, оскільки це робить WebView дуже млявим.

Оскільки помилка:

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

Як я можу встановити кількість буферів у 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
ви знайшли рішення цієї проблеми?
Массімо

6
Ні, але, на щастя, з Android 5+ версія WebView оновлюється через GooglePlay, і ця проблема потихеньку згасає.
fnllc

Відповіді:


1

Це проблема із пам'яттю, як зазначено тут:

11-08 18: 28: 31,347: W / Adreno-ES20 (4749):: GL_OUT_OF_MEMORY

android.view.Surfaceробить більше оновлень, ніж GPU може працювати. Я не впевнений, що ви навіть можете спробувати зловити цю.
Я також вірю, що на багатьох пристроях, де немає збоїв, користувачі матимуть випадкові ноги інтерфейсу користувача.

Я зіткнувся з подібною проблемою кілька років тому. У моєму випадку це були насамперед ноги, але я вважаю, що проблема однакова.

Для її вирішення я додав лічильник для вимірювання частоти кадрів. Я бачив, що частота кадрів висока, але раптом вона погано падає, тому застосувала логіку балансу, щоб шукати найвищий FPS, який не матиме ноги.

  • Почніть з 60 FPS
  • Якщо його ніжки, розділіть FPS на 2
  • Якщо це не так, то встановіть його середнє значення між останнім значенням і поточним.
  • повторюйте, поки ви щасливі;)

Це в основному двійковий пошук ідеального FPS.

У вашому випадку це трохи складніше, оскільки у вас трапляються збої, тому вам доведеться наполегливо лічити FPS і бути обережнішими з пошуком.

Надсилайте журнали FPS на ваш сервер. Після того, як у вас буде достатньо даних, ви зможете бути розумнішими з точки зору FPS на модуль пристрою.

Що стосується того, щоб покласти руки на WebView SurfaceView, то, мабуть, це теж не банально, але ми говоримо про Android 4.4.2, тому нічого не можна зробити з відображенням :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.