[Ripubblicando questa domanda da StackOverflow, come è stato sottolineato che qui si adatta meglio.]
Attualmente sto trasferendo il mio motore di gioco 2D su Java. Ho guardato alcune delle librerie di giochi indicate qui su StackOverflow. Tuttavia, quelli che ho visto erano piuttosto semplicistici e non affermavano nemmeno se supportavano cose come la trasparenza alfa, quindi ho deciso di eseguire il porting del mio renderer C ++ per il quale avevo già scritto la logica.
Questo renderer è un renderer software puro che utilizza la piastrellatura per evitare il rendering non necessario. Ho ottimizzato le sue prestazioni di scorrimento creando un "buffer fuori schermo" un po 'più grande del mio riquadro di output e inserendo questo buffer fuori schermo sul mio output su ogni frame. In questo modo, potrei evitare di ridisegnare le tessere inutilmente solo perché ho fatto scorrere un pixel sulla mappa.
Ho usato l'AWT di Java per implementarlo, usando un grande BufferedImage per il buffer offscreen. L'uso della CPU va bene (circa il doppio di quello che avevo in C ++), ma c'è uno strano problema con lo scorrimento continuo, in cui ogni secondo circa il renderer rimarrà in ritardo per circa 0,2 secondi.
Dal momento che non c'è nulla nel mio codice che si verificherebbe in questi periodi, e poiché i picchi scompaiono se non disegno il mio buffer offscreen nella vista principale, posso solo concludere che Java sta facendo una propria ottimizzazione interna. Tuttavia, non sono sicuro di ciò che fa, né so quale delle mie ottimizzazioni avrei dovuto rimuovere per eliminare i picchi. Inoltre, potrebbe essere che java AWT non sia stato realizzato pensando allo scrolling continuo e elevato degli FPS, ed è del tutto inutilizzabile per questo scopo.
C'è un modo per sbarazzarmi di questi picchi?