VSync / 30FPS nyata di Android

8

Saya mengerjakan game yang tidak bisa berjalan dengan kecepatan penuh pada beberapa perangkat. Pada Tegra2, dengan banyak optimasi, kinerjanya mendekati 40 fps. Framerate stabil tetapi animasi tidak cukup mulus, jadi saya butuh vsync.
Dengan 2.3 Android SDK, kita dapat menggunakan pustaka EGL secara asli. Jadi saya mencoba menggunakan eglSwapInterval tetapi tidak berhasil. Dalam makalah GDC ini , tampaknya Tegra2 dapat melakukannya.

Ps: Thread.sleep () untuk memaksa FPS konstan bukanlah solusi yang dapat diterima

Ellis
sumber
Saya belum mengembangkan apa pun untuk Android, jadi saya tidak bisa mengatakan dengan pasti apakah itu mungkin atau tidak mempengaruhi interval swapnya, meskipun tampaknya diragukan. Jadi jika kegagapan animasi berasal dari perbedaan besar dalam timesteps logikanya, mungkin ada baiknya mencoba menghitung timestep rata-rata untuk sekumpulan frame? Seperti ini , mungkin menggunakan periode 5-6 frame. Ini bukan jawaban untuk pertanyaan vsync Anda, tetapi mungkin itu akan membantu animasi Anda tanpa memperkenalkan catatan waktu render yang tetap.
EnoughTea
1
Karena Tegra2 adalah renderer langsung (bukan ubin), saya dapat memeriksa apakah waktu telah berlalu sebelum eglSwapBuffer adalah <1/60s. Jika tidak, saya menunggu 1 ms lebih dari 16 ms dan melakukan eglSwapBuffer. Itu mengerikan !!! Sangat aneh bahwa mereka berbicara tentang fungsi ini di Google IO 2011 jika tidak diterapkan.
Ellis

Jawaban:

2

Menurut utas ini pada beberapa benchmark operasi, sebagian besar driver perangkat mengabaikan eglSwapInterval, tetapi tegra2 harus mengaktifkan vsync secara default (dan eglSwapInterval dapat digunakan untuk menonaktifkannya).

Mungkin tingkat vsync pada perangkat Anda sedemikian rupa sehingga gagap Anda berasal dari kadang-kadang memukul, kadang-kadang melewatkan waktu bingkai? Sudahkah Anda mencoba jika menonaktifkan vsync akan benar-benar memperbaiki masalah?

Jari Komppa
sumber
Saya belum mencoba menonaktifkan vsync. Saya mencoba eglSwapInterval (..., 2) tanpa hasil. Saya akan mencoba sesegera mungkin.
Ellis
Parameter swapinterval mendefinisikan jumlah minimum frame yang harus dilalui, jadi mungkin Anda melihat gagap seperti 2,2,3,2,2,3,2,2,2,3 .. dengan asumsi semuanya berfungsi, yang tampaknya tidak dijamin =)
Jari Komppa
Berikut nugget kecil lainnya: "interval diam-diam dijepit ke nilai tergantung implementasi minimum dan maksimum sebelum disimpan; nilai-nilai ini ditentukan oleh atribut EGLConfig EGL_MIN_SWAP_INTERVAL dan EGL_MAX_SWAP_INTERVAL."
Jari Komppa
eglSwapInterval (, 2) tidak mengubah framerate saya dari 42fps dan EGL_MIN_SWAP_INTERVAL adalah 0 dan MAX 10.
Ellis
Hanya hal lain yang dapat saya pikirkan untuk dicoba adalah melalui nilai 0 hingga 10 dan melihat apakah ada perubahan. Jika tidak ada, yah, fungsinya rusak. (Atau baik, nilai 0,1,9 dan 10)
Jari Komppa
0

Menerbitkan sampel yang melakukan 30FPS menggunakan koreografer API. https://github.com/googlesamples/android-ndk/tree/master/choreographer-30fps Apakah itu cocok untuk Anda?

hak
sumber
1
Meskipun tautan Anda mungkin membantu (saya belum melihatnya), lebih disukai di situs ini bahwa tautan dirangkum dalam jawaban seandainya tautan itu mati, dan agar orang lain tahu apa yang diharapkan darinya. Apakah Anda dapat memasukkan sebagian atau deskripsi sampel yang bermanfaat dalam jawaban Anda?
Jibb Smart
Dan tautannya sebenarnya sudah mati :)
Karu