Otrzymuję poniższy błąd Android 4.4.2 Moto X 2013
w Rhomobile 5.0.2
aplikacji WebView. Aplikacja jest kompilowana za pomocą SDK 19
i minAPI 17
.
Po kilku badaniach wydaje się, że jest to problem z Snapdragon 800 / Adreno GPU devices
:
tutaj i tutaj są linki do tego problemu w Google issue tracker
Wyłączenie akceleracji sprzętowej nie jest tak naprawdę opcją, ponieważ powoduje, że WebView działa bardzo wolno.
Ponieważ błąd to:
dequeueBuffer: can't dequeue multiple buffers without setting the buffer count
Jak ustawić liczbę buforów w 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)
Odpowiedzi:
Jest to problem braku pamięci, jak wskazano tutaj:
android.view.Surface
wprowadza więcej aktualizacji, niż może obsłużyć GPU. Nie jestem pewien, czy możesz nawet spróbować złapać ten.Wierzę również, że na wielu urządzeniach, na których nie ma awarii, użytkownicy będą doświadczać sporadycznych zmian interfejsu użytkownika.
Z podobnym problemem miałem do czynienia kilka lat temu. W moim przypadku były to przede wszystkim nogi, ale uważam, że problem jest ten sam.
Aby go rozwiązać, dodałem licznik do pomiaru liczby klatek na sekundę. Widziałem, że liczba klatek na sekundę jest wysoka, ale nagle nagle spada, więc zastosowałem logikę równowagi, aby wyszukać najwyższy FPS, który nie wytrzyma.
Jest to po prostu binarne wyszukiwanie idealnego FPS-a.
W twoim przypadku jest to nieco trudniejsze, ponieważ występują awarie, więc będziesz musiał utrzymywać licznik FPS i być bardziej ostrożnym podczas wyszukiwania.
Wyślij dzienniki FPS na swój serwer. Gdy będziesz mieć wystarczającą ilość danych, możesz być mądrzejszy dzięki punktowi początkowemu FPS na moduł urządzenia.
Jeśli chodzi o wkładanie rąk do WebView SurfaceView to też chyba nie jest to trywialne, ale mówimy o Androidzie 4.4.2, więc nie ma nic, czego nie można zrobić z odbiciem :)
źródło