VSync / real a 30FPS no Android

8

Estou trabalhando em um jogo que não pode ser executado em velocidade máxima em alguns dispositivos. No Tegra2, com muitas otimizações, o desempenho é próximo de 40 fps. O framerate é estável, mas as animações não são suaves o suficiente, então eu preciso de um vsync.
Com o Android SDK 2.3, podemos usar a biblioteca EGL nativamente. Então, eu tento usar eglSwapInterval, mas sem sucesso. No presente Livro GDC , parece que Tegra2 pode fazê-lo.

Ps: Thread.sleep () para forçar um FPS constante não é uma solução aceitável

Ellis
fonte
Como não desenvolvi nada para o Android, não posso dizer com certeza se é possível ou não afetar o intervalo de troca, embora pareça duvidoso. Portanto, se a gagueira da animação vier de uma grande diferença em seus timestaps lógicos, talvez valha a pena tentar calcular um timestap médio para um lote de quadros? Assim , talvez usando um período de 5-6 quadros. Não é uma resposta para sua pergunta vsync, mas talvez ajude suas animações sem introduzir um tempo fixo de renderização.
EnoughTea
11
Como o Tegra2 é um renderizador imediato (não um bloco), posso verificar se o tempo decorrido antes do eglSwapBuffer é <1 / 60s. Caso contrário, espero 1ms a mais que os 16ms e faço o eglSwapBuffer. Isso é horrível !!! É muito estranho que eles falem sobre essa função no Google IO 2011, se não for implementada.
Ellis em Ellis

Respostas:

2

De acordo com esta discussão em alguns benchmarks do opengl es, a maioria dos drivers de dispositivos simplesmente ignora o eglSwapInterval, mas o tegra2 deve ter o vsync ativado por padrão (e o eglSwapInterval pode ser usado para desativá-lo).

Talvez a taxa de vsync no seu dispositivo seja tal que sua gagueira ocorra às vezes atingindo, às vezes perdendo o tempo do quadro? Você já tentou se a desativação do vsync realmente melhoraria?

Jari Komppa
fonte
Não tentei desativar o vsync. Eu tentei eglSwapInterval (..., 2) sem sucesso. Vou tentar o mais rápido possível.
Ellis
O parâmetro swapinterval define a quantidade mínima de quadros que deve passar, por isso é possível que você gagueje como 2,2,3,2,2,3,2,2,2,3 .. assumindo que tudo funcione, o que não parece ser garantida =)
Jari Komppa
Aqui está outra pequena pepita: "o intervalo é fixado silenciosamente aos valores mínimos e máximos dependentes da implementação antes de serem armazenados; esses valores são definidos pelos atributos EGL_MIN_SWAP_INTERVAL e EGL_MAX_SWAP_INTERVAL, respectivamente."
Jari Komppa
eglSwapInterval (, 2) não muda o meu framerate de 42fps e EGL_MIN_SWAP_INTERVAL é 0 e MAX 10.
Ellis
Apenas outra coisa que posso pensar em tentar é passar pelos valores de 0 a 10 e ver se há alguma alteração. Se não houver, bem, a função está quebrada. (Ou bem, os valores 0,1,9 e 10)
Jari Komppa
0

Publicou uma amostra fazendo 30FPS usando a API do coreógrafo. https://github.com/googlesamples/android-ndk/tree/master/choreographer-30fps Isso funciona para você?

hak
fonte
11
Embora seu link possa ser útil (eu não olhei para ele), é preferível neste site que os links sejam resumidos na resposta, caso o link morra, e para que outras pessoas saibam o que esperar dele. Você é capaz de incluir uma parte útil ou descrição da amostra em sua resposta?
Jibb Smart
E a ligação é na verdade :) mortos
Karu