OpenGL: Bingkai sebagian melompat bolak-balik [ditutup]

8

Saya sedang mengerjakan proyek dengan SDL dan OpenGL. Gim ini bekerja sangat baik di Windows, Linux, OS X dan iOS. Namun, versi Android menunjukkan masalah pada ponsel saya pada khususnya. Saya telah menguji perangkat lain dan itu berfungsi dengan baik juga.

Masalah yang saya hadapi adalah kesalahan visual. Ini terjadi dalam semburan: misalnya: 90 frame oke dan kemudian 40 frame kesalahan. Kesalahan itu sendiri agak sulit untuk dijelaskan tetapi saya akan coba. Layar sedang diperbarui sebagian dengan benar (dari bagian atas ponsel saya menjadi sekitar setengah jalan) dan sebagian berkedip-kedip. Efek kedipan adalah semacam bolak-balik melompat. Saya berpikir bahwa ini terkait dengan buffering ganda. Saya pikir itu karena apa yang bisa saya lihat di layar adalah bolak-balik setiap frame. Sepertinya setengah dari layar adalah satu frame dalam waktu dan frame berikutnya 2 frame terlambat. Cukup mirip prosesi Echternach, saya kira Anda bisa mengatakannya. Jika saya memplotnya dalam bagan di mana waktu terus berjalan ketika bergerak ke bawah grafik, saya pikir saya

          left half | right half  (phone is in landscape)
         ------------------------
time  1 |      1           1
time  2 |      2           2
time  3 |      3           1
time  4 |      4           4
time  5 |      5           3
time  6 |      6           6
time  7 |      7           5
time  8 |      8           8
time  9 |      9           7

Jadi setengah yang tepat adalah satu frame dalam waktu, dan frame berikutnya, itu menunjukkan frame sebelumnya. Ini mendukung teori saya bahwa ada masalah dengan buffering ganda. Sepertinya entah bagaimana tidak bisa sepenuhnya memperbarui backbuffer sebelum diletakkan di layar, atau apalah.

Juga, pemisahan antara baik dan kesalahan pada layar berbeda dari bingkai ke bingkai, yang menurut saya membuktikan itu adalah masalah sinkronisasi dan sangat tergantung pada waktu dari apa yang terjadi. Menambahkan glFinish();sebelum SDL_GL_SwapWindow();panggilan tidak membantu.

Info versi: SDL melaporkan vsync untuk dihidupkan. Namun, saya percaya ini tidak sobek. Ponsel saya Samsung Galaxy S3 mini dan menjalankan Android 5.1.1 (CM12) dan GPU (Mali-400) mendukung OpenGL ES 2.0. Game lain berjalan baik di ponsel saya.

Martijn Courteaux
sumber
Apa model ponselnya?
concept3d
Samsung Galaxy s3 Mini. Menjalankan CyanogenMod 12.
Martijn Courteaux
Saya menemukan ada di mana-mana di telepon saya, tetapi lebih halus. Bahkan di sistem UI menggulir menu.
Martijn Courteaux
2
Ini terdengar seperti bug di ponsel Anda. Dugaan saya adalah pembaruan firmware adalah cara yang paling mungkin untuk menyelesaikannya.
rolobo
@rolobo: Ya, tentu saja. Namun saya sangat senang dengan yang lainnya dan telepon saya hanyalah alat uji untuk proyek ini dan bukan bagian dari proses pengembangan utama saya.
Martijn Courteaux

Jawaban:

0

Bagian dari readme berbicara tentang hal itu:

Catatan tentang penggunaan teknik render "persegi panjang kotor"

[...] di mana Anda hanya memperbarui sebagian layar pada setiap bingkai, Anda mungkin melihat berbagai gangguan visual pada Android, yang tidak ada pada platform lain. Ini disebabkan oleh penggunaan SDL EGL sebagai sistem pendukung untuk menangani konteks OpenGL ES / ES2, khususnya penggunaan fungsi eglSwapBuffers. Sebagaimana dinyatakan dalam dokumentasi untuk fungsi "Isi buffer tambahan selalu tidak ditentukan setelah memanggil eglSwapBuffers".

Mengatur atribut EGL_SWAP_BEHAVIOR dari permukaan ke EGL_BUFFER_PRESERVED tidak mungkin untuk SDL karena membutuhkan EGL 1.4, hanya tersedia pada level API, sehingga satu-satunya solusi yang tersedia pada platform ini adalah untuk menggambar ulang seluruh layar setiap frame.

Ibrahim CS
sumber
Harap sertakan ringkasan informasi yang relevan dari tautan itu dan penjelasan tentang bagaimana informasi menjawab pertanyaan.
tyjkenn
... pertanyaan awal tidak mengatakan apa-apa tentang melakukan rendering "kotor persegi panjang"?
Trevor Powell