Pergunta

A extensão WGL_EXT_SWAP_CONTROL permite fazer isso no Windows, mas não consigo encontrar nada remotamente com plataforma cruzada fazendo o mesmo, ou seja, sincronizando meus swaps de buffer com a atualização da tela. Meu aplicativo usa o GLEW, então algo oferecido por isso seria preferível. O suporte entre plataformas para Linux, Mac e Windows é necessário, mas meu aplicativo não será interrompido se a sincronização não puder ser definida (por exemplo, o usuário o forçou a sair em seus drivers de gráficos).

Aceitarei o código do programa para fazê -lo em muitas plataformas, com o GLEW, como uma resposta válida.

Foi útil?

Solução

Isso parece bastante desagradável e deixa você por conta própria para descobrir qual chamada continua no Mac OS X, mas esse cara parece ter algum tipo de solução.

Outras dicas

Há uma razão para não ser fácil encontrar uma solução de plataforma cruzada. A plataforma finalmente possui a tela (e o comportamento de troca). Portanto, necessariamente faz parte da API da plataforma (se exposta). Realmente não pode haver uma solução de plataforma cruzada. Até o GLEW tem alguns bits específicos da plataforma quando se trata de interação com a plataforma.

Agora você pode argumentar que todas as plataformas devem usar a mesma API para esse bit específico da interface, mas duvido que você obtenha alguma tração deles.

Por último, nem todos os framebuffers são exibidos diretamente. Se você estiver usando um sistema de gerenciamento de janelas que realmente combina os pixels do Framebuffer na área de trabalho (como o aero, quando ativo), você não poderá controlar o comportamento da troca de qualquer maneira.

Para referência, as várias APIs para fazer isso nas principais plataformas:

  • wglswapIntervalext
  • GLXSWAPINTALSGI
  • AGLSETINTEGER

A partir de http://www.opengl.org/wiki/swap_interval(e indiretamente http://www.opengl.org/registry/specs/sgi/swap_control.txt):

No Linux, as coisas são muito mais simples. Se GLX_SGI_swap_control está presente na string retornada por glGetString(GL_EXTENSIONS), então você pode usar glXSwapIntervalSGI(0) Para desativar o vsync ou você pode usar glXSwapIntervalSGI(1) Para ativar o VSYNC (também conhecido como sincronização vertical).

Para o OS X, confira http://developer.apple.com/library/mac/#documentation/cocoa/reference/applicationkit/classes/nssopenglContext_class/reference/reference.html

NSOPENGLCPSWAPInterval

Define ou obtém o intervalo de troca. O intervalo de troca é representado como um longo. Se o intervalo de troca for definido como 0 (o padrão), o método FlushBuffer será executado o mais rápido possível, sem considerar a taxa de atualização vertical do monitor. Se o intervalo de troca for definido como 1, os buffers serão trocados apenas durante a reflexão vertical do monitor. Disponível no Mac OS X V10.0 e posterior.

Declarado em Nsopengl.h.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top