dequeueBuffer: tidak dapat melakukan dequeue pada beberapa buffer tanpa menyetel jumlah buffer

123

Saya mendapatkan kesalahan di bawah ini pada Android 4.4.2 Moto X 2013dalam Rhomobile 5.0.2aplikasi WebView. Aplikasi ini dikompilasi dengan SDK 19dan minAPI 17.

Setelah beberapa penelitian, tampaknya ini adalah masalah dengan Snapdragon 800 / Adreno GPU devices:

di sini dan di sini adalah tautan ke masalah ini di pelacak masalah google

Menonaktifkan akselerasi perangkat keras sebenarnya bukan pilihan, karena ini membuat WebView menjadi sangat lamban.

Karena kesalahannya adalah:

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

Bagaimana cara menyetel jumlah buffer di 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.dll
sumber
1
apakah Anda menemukan solusi untuk masalah ini?
Massimo
6
Tidak, tapi untungnya dengan Android 5+ WebView sekarang diperbarui melalui GooglePlay dan masalah ini perlahan-lahan hilang.
fnllc

Jawaban:

1

Ini adalah masalah kehabisan memori seperti yang ditunjukkan di sini:

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

android.view.Surfacemembuat lebih banyak pembaruan daripada yang dapat ditangani oleh GPU. Saya tidak yakin bahwa Anda bahkan dapat mencoba menangkap yang ini.
Saya juga percaya bahwa pada banyak perangkat di mana tidak ada crash, pengguna akan mengalami kaki UI sesekali.

Saya menghadapi masalah serupa beberapa tahun yang lalu. Dalam kasus saya, yang utama adalah kaki, tetapi saya yakin masalahnya sama.

Untuk mengatasinya saya menambahkan penghitung untuk mengukur frekuensi gambar. Saya melihat bahwa frame rate-nya tinggi tetapi kemudian tiba-tiba turun drastis, jadi saya menerapkan logika keseimbangan untuk mencari FPS tertinggi yang tidak akan berjalan.

  • Mulailah dengan 60 FPS
  • Jika kakinya, bagi FPS dengan 2
  • Jika tidak, setel ke rata-rata antara nilai terakhir dan arus.
  • ulangi sampai Anda senang;)

Ini pada dasarnya adalah pencarian biner untuk FPS yang sempurna.

Dalam kasus Anda, ini sedikit lebih rumit, karena Anda mengalami crash, jadi Anda harus mempertahankan penghitung FPS, dan lebih berhati-hati dengan pencarian.

Kirim log FPS ke server Anda. Setelah Anda memiliki cukup data, Anda bisa lebih pintar dengan FPS staring point per modul perangkat.

Sejauh meletakkan tangan Anda di WebView SurfaceView, saya kira ini tidak sepele juga, tetapi kita berbicara tentang Android 4.4.2, jadi tidak ada yang tidak dapat Anda lakukan dengan refleksi :)

Ilya Gazman
sumber