OpenGL: O quadro salta parcialmente para frente e para trás [fechado]

8

Estou trabalhando em um projeto com SDL e OpenGL. O jogo funciona muito bem no Windows, Linux, OS X e iOS. No entanto, a versão do Android está mostrando um problema no meu telefone em particular. Eu testei outro dispositivo e lá funciona muito bem também.

O problema que estou enfrentando é uma falha visual. Isso acontece em explosões: por exemplo: 90 quadros estão bem e depois 40 quadros a falha. A falha em si é meio difícil de descrever, mas vou tentar. A tela está sendo atualizada parcialmente correta (da parte superior do meu telefone para aproximadamente a metade do caminho) e parcialmente piscando. O efeito trêmulo é algum tipo de salto para frente e para trás. Eu estou pensando que está relacionado ao buffer duplo. Eu acho que porque o que eu vejo na tela está pulando para frente e para trás em todos os quadros. É como se metade da tela tivesse um quadro no tempo e o quadro seguinte 2 quadros atrasado. Quase como uma procissão de Echternach, acho que você poderia dizer. Se eu o traçar em um gráfico em que o tempo passa ao descer o gráfico, acho que

          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

Portanto, a metade direita é um quadro no tempo, e o quadro seguinte mostra o quadro anterior. Isso é compatível com a minha teoria de que há um problema com o buffer duplo. Parece que de alguma forma não é possível atualizar completamente o backbuffer antes de ele ser colocado na tela, ou algo assim.

Além disso, a divisão entre boa e falha na tela é diferente de quadro para quadro, o que acho que prova que é um problema de sincronização e depende muito do tempo do que está acontecendo. Adicionar glFinish();antes da SDL_GL_SwapWindow();chamada não ajuda.

Informações da versão: SDL reporta vsync para ser ativado. No entanto, acredito que isso não está rasgando. Meu telefone é um Samsung Galaxy S3 mini e está executando o Android 5.1.1 (CM12) e a GPU (Mali-400) suporta o OpenGL ES 2.0. Outros jogos funcionam bem no meu telefone.

Martijn Courteaux
fonte
Qual é o modelo do telefone?
usar o seguinte
Mini Samsung Galaxy S3. Executando o CyanogenMod 12.
Martijn Courteaux 25/10/2015
Descobri que está em todo lugar no meu telefone, mas mais sutil. Mesmo na interface do sistema, navegando pelos menus.
Martijn Courteaux 11/11/2015
2
Isso soa mais como um bug no seu telefone. Meu palpite é que uma atualização de firmware é a maneira mais provável de resolvê-la.
Rol2
@roboobo: Sim, de fato. No entanto, estou muito feliz com tudo o mais e meu telefone é apenas um dispositivo de teste para este projeto e não faz parte do meu processo de desenvolvimento principal.
Martijn Courteaux

Respostas:

0

Uma seção do leia - me fala sobre isso:

Uma observação sobre o uso da técnica de renderização "retângulos sujos"

[...] onde você atualiza apenas uma parte da tela em cada quadro, pode observar uma variedade de falhas visuais no Android, que não estão presentes em outras plataformas. Isso é causado pelo uso do EGL pela SDL como sistema de suporte para lidar com contextos OpenGL ES / ES2, em particular o uso da função eglSwapBuffers. Conforme indicado na documentação da função "O conteúdo dos buffers auxiliares é sempre indefinido após a chamada eglSwapBuffers".

Definir o atributo EGL_SWAP_BEHAVIOR da superfície como EGL_BUFFER_PRESERVED não é possível para SDL, pois requer o EGL 1.4, disponível apenas no nível da API, portanto, a única solução disponível nesta plataforma é redesenhar a tela inteira a cada quadro.

Ibrahim CS
fonte
Inclua um resumo das informações relevantes desse link e uma explicação de como as informações respondem à pergunta.
tyjkenn
... a pergunta original não disse nada sobre a renderização de "retângulos sujos"?
Trevor Powell