Dokumentasi Android mengatakan:
Ada situasi di mana konteks render EGL akan hilang. Ini biasanya terjadi ketika perangkat bangun setelah tidur. Ketika konteks EGL hilang, semua sumber daya OpenGL (seperti tekstur) yang terkait dengan konteks itu akan dihapus secara otomatis. Agar tetap melakukan rendering dengan benar, renderer harus membuat ulang sumber daya yang hilang yang masih dibutuhkan. Metode onSurfaceCreated (GL10, EGLConfig) adalah tempat yang nyaman untuk melakukan ini.
Tetapi harus memuat ulang semua tekstur dalam konteks OpenGL adalah pengalaman yang menyakitkan dan menyakitkan bagi pengguna ketika masuk kembali ke aplikasi setelah jeda. Saya tahu bahwa "Angry Birds" entah bagaimana menghindari ini, saya sedang mencari saran tentang cara mencapai hal yang sama?
Saya bekerja dengan Android NDK r5 (versi CrystaX.) Saya memang menemukan kemungkinan peretasan ini untuk masalah tetapi saya mencoba untuk menghindari membangun seluruh versi SDK khusus.
Jawaban:
Pulau Replika memiliki versi GLSurfaceView yang dimodifikasi yang menangani masalah ini (dan bekerja dengan versi Android sebelumnya). Menurut Chris Pruett :
Sunting: Saya baru sadar Anda sudah memposting tautan ke retasan yang serupa. Saya tidak berpikir ada solusi built-in sebelum honeycomb. Pulau Replika adalah gim populer yang bekerja pada banyak perangkat dan Anda mungkin menganggap implementasi dan komentar Chris sangat membantu.
sumber
Saya ingin menambahkan jawaban lain untuk ini yang diteruskan kepada saya satu atau dua tahun yang lalu oleh Chris Pruett (Pulau Replika, Wind-Up Knight, dll). Ini sangat berguna di sini pada tahun 2013 karena setPreserveEglContextOnPause (true) tampaknya tidak berfungsi pada 4.3. (Saya bisa saja salah tentang itu, tetapi itulah yang terlihat bagi saya saat ini ketika saya memperbarui kode permainan yang terakhir disentuh pada 2011).
Pada dasarnya triknya adalah melepaskan GLSurfaceView Anda dari hierarki tampilan dari onPause () Aktivitas Anda. Karena tidak ada dalam hierarki tampilan pada titik onPause () berjalan, konteksnya tidak pernah dihancurkan.
Jadi onPause () Aktivitas Anda akan terlihat seperti ini:
Dan Anda mengembalikan GLSurfaceView Anda ke hierarki bukan dari onResume () tetapi dari onWindowFocusChanged ():
Perhatikan bahwa Anda tidak pernah memanggil onPause () dan onResume () GLSurfaceView dan ini adalah SDK GLSurfaceView resmi, tidak diperlukan versi alternatif yang diretas.
sumber
[Kata-kata kasar] Saya menghabiskan banyak waktu untuk masalah ini, saya mencoba banyak solusi berbeda dan tidak ada yang berhasil sampai hari ini, saya pikir ini adalah salah satu keputusan desain yang paling buruk yang pernah saya lihat, tetapi berasal dari tim Android. sangat terkejut. </ kata-kata kasar>
Jadi, solusinya adalah dengan memindahkan anggota eglContext ke atas dan menjadikannya statis (global) sehingga tidak akan hancur, maka Anda hanya perlu memeriksa apakah itu null atau tidak sebelum membuatnya lagi.
Sejauh ini solusi ini tampaknya bekerja untuk kami, dan kami tidak peduli jika rusak pada perangkat 2005.
sumber
Gunakan API honeycomb. Ada opsi untuk mempertahankan konteks OGL Anda. Jika tidak, Anda perlu memuat ulang konteks Anda. Itu tidak sulit atau menyakitkan.
Anda perlu memahami bahwa ada dua kasus (Android 2.1):
Catatan: GPU Android lama tidak mendukung multi konteks. Jadi konteks terbuka hilang ketika Anda beralih ke aplikasi lain => tidak ada solusi yang tersedia (Anda dapat meretas untuk mempertahankan konteks Anda pada jeda layar).
Catatan 2: Fungsi HoneyComb diaturPreserveEGLContextOnPause
sumber
Beberapa jawaban di sini masuk akal untuk penggunaan awal OpenGL ES di Android. Perangkat GLES pertama hanya mendukung satu konteks, jadi GLSurfaceView dirancang untuk secara agresif membuang status. Meyakinkan GLSurfaceView untuk melakukan sebaliknya tidak mudah.
Untuk versi Android yang lebih baru (mungkin apa saja yang menggunakan GLES 2.x), jawaban terbaik adalah menggunakan SurfaceView dan lakukan EGL dan manajemen utas Anda sendiri. Anda dapat menemukan beberapa contoh GLES yang digunakan dengan SurfaceView polos di Grafika , termasuk perpustakaan kelas sederhana untuk membuat dan menghancurkan konteks EGL.
Ini masih praktik yang baik untuk menurunkan status ketika aplikasi masuk ke latar belakang, tetapi untuk contoh dari Chris Pruett - di mana aplikasi masih berada di latar depan, tetapi Aktivitas yang menjadi tuan rumah GLSurfaceView telah beralih dari - tidak ada nilai dalam merobek bawah konteksnya.
sumber