Torne a taxa de quadros do pygame mais rápida

10

Ao traçar um perfil do meu jogo, percebo que a grande maioria do tempo de execução do meu jogo de hobby é entre as blit e as chamadas de flip. Atualmente, ele está rodando apenas em torno de 13fps. Minha placa de vídeo é decente, então acho que o pygame não a está usando.

Alguém conhece alguma opção gráfica / de exibição que eu precise definir no pygame para tornar isso mais rápido? Ou isso é apenas algo que eu tenho que viver desde que escolhi o pygame?

Smashery
fonte

Respostas:

12

Se você estiver executando no modo de tela cheia, poderá usar o pygame.HWSURFACEsinalizador ao inicializar a exibição para dizer ao pygame para tentar usar uma superfície de hardware. Acredito que se uma superfície de hardware não puder ser usada, o pygame silenciosamente usará uma superfície de software.

Se você não estiver usando uma superfície de hardware, considere usar em pygame.display.update(rectangle)vez de pygame.display.flip(). Isso atualizará apenas o retângulo fornecido, e não a tela inteira, o que pode aumentar seu desempenho um pouco, a menos que seu jogo realmente precise atualizar a tela inteira.

Se você estiver usando uma superfície de hardware ou OpenGL, também existe o pygame.DOUBLEBUFque usa buffer duplo de hardware, o que significa que suas funções de desenho serão atraídas para um dos dois buffers e flip()trocarão o buffer visível.

talljosh
fonte
5

Um gargalo no pygame é na verdade a renderização da fonte. Você não deve renderizar o mesmo texto (com a mesma fonte / cor) mais de uma vez, mas armazenar em cache as superfícies renderizadas e reutilizá-las. Leve isso em consideração se você estiver usando muito o Font.render ().

bicho-preguiça
fonte
4

Além da resposta de talljosh, gostaria de apresentar mais algumas sugestões:

Evite rotações e redimensionamento sempre que possível. Tais operações são feitas exclusivamente na CPU e tendem a ser muito, muito lentas.

Se você estiver fazendo leituras / modificações diretas de pixels, use o Surface.get_buffer()método e trabalhe com ele, em vez de usar os Surface.set_at()/get_at()métodos.

Cody Brocious
fonte
2

Comente qualquer saída do console de teste que você possui. Isso pode reduzir drasticamente a taxa de quadros, especialmente se você estiver produzindo entre rotação e escala, como Cody disse acima.

kymully
fonte
2

É correto que o Pygame não use os recursos de aceleração 3D da sua placa de vídeo. Isso ocorre porque é baseado no SDL, que tem a mesma limitação. Uma alternativa é reescrever seu jogo em um sistema como o pyglet que suporta nativamente sprites acelerados OpenGL, encontrar uma biblioteca semelhante apenas para gráficos ou escrever o código OpenGL para isso.

Kylotan
fonte
Pyglet é ótimo.
The Duck comunista
1

Uma coisa incrivelmente simples de fazer é usar o psyco . Não sei quanto isso vai ajudar, mas como tudo o que requer é

 import psyco
 psyco.full()

para começar a correr, você também pode tentar.

Nikwin
fonte
A Psyco realmente não vai ajudar muito com o código Python idiomático moderno. Use PyPy se você quiser um JIT (embora não tenha certeza se o PyGame está trabalhando lá).
coderanger
O Pygame não funciona no PyPy, mas o Pyglet faz isso lá.
precisa saber é o seguinte