[Reposicionando essa pergunta do stackoverflow, como foi apontado que ele se encaixa melhor aqui.]
Atualmente, estou portando meu mecanismo de jogo 2D para Java. Eu olhei para algumas das bibliotecas de jogos apontadas aqui no stackoverflow. No entanto, as que eu olhei eram bastante simplistas e nem declararam se suportavam coisas como transparência alfa, então decidi portar meu renderizador C ++ para o qual eu já havia escrito a lógica.
Este renderizador é um renderizador de software puro que usa o ladrilho para evitar a renderização desnecessária. Otimizei o desempenho de rolagem criando um "buffer fora da tela" um pouco maior que o meu painel de saída e colocando esse buffer fora da tela na minha saída em todos os quadros. Dessa forma, eu poderia evitar redesenhar os blocos desnecessariamente, apenas porque eu rolei um pixel no mapa.
Eu usei o AWT do Java para implementá-lo, usando um BufferedImage grande para o buffer fora da tela. O uso da CPU é bom (cerca de duas vezes o que eu tinha em C ++), mas há um problema estranho com a rolagem contínua, onde a cada segundo, o renderizador fica atrasado por cerca de 0,2 segundos.
Como não há nada no meu próprio código que ocorra nesses períodos, e como os picos desaparecem se eu não puxar meu buffer para fora da tela na tela principal, só posso concluir que o Java está fazendo uma otimização interna própria. No entanto, não tenho certeza do que faz, nem sei quais das minhas otimizações eu precisaria remover para me livrar dos picos. Além disso, pode ser que o java AWT não tenha sido feito com rolagem contínua e alta de FPS em mente, e isso é totalmente inutilizável para essa finalidade.
Existe alguma maneira de me livrar desses picos?