[Reposting dieser Frage aus dem Stackoverflow, da darauf hingewiesen wurde, dass sie hier besser passt.]
Ich portiere derzeit meine 2D-Game-Engine nach Java. Ich habe mir einige der Spielbibliotheken angesehen, auf die hier im Stackoverflow verwiesen wird. Diejenigen, die ich mir ansah, waren jedoch ziemlich simpel und gaben nicht einmal an, ob sie Dinge wie Alpha-Transparenz unterstützten. Deshalb entschied ich mich, meinen C ++ - Renderer zu portieren, für den ich die Logik bereits geschrieben hatte.
Dieser Renderer ist ein reiner Software-Renderer, der Kacheln verwendet, um unnötiges erneutes Rendern zu vermeiden. Ich habe die Bildlaufleistung optimiert, indem ich einen "Offscreen-Puffer" erstellt habe, der etwas größer als mein Ausgabebereich ist, und diesen Offscreen-Puffer in jedem Frame auf meine Ausgabe aufgeteilt habe. Auf diese Weise konnte ich vermeiden, dass Kacheln unnötig neu gezeichnet wurden, nur weil ich ein Pixel auf der Karte gescrollt habe.
Ich habe Javas AWT verwendet, um es zu implementieren, wobei ich ein großes BufferedImage für den Offscreen-Puffer verwendet habe. Die CPU-Auslastung ist in Ordnung (ungefähr doppelt so hoch wie in C ++), aber es gibt ein merkwürdiges Problem beim kontinuierlichen Scrollen, bei dem der Renderer etwa jede Sekunde etwa 0,2 Sekunden hinterherhinkt.
Da mein eigener Code in diesen Zeiträumen nichts enthält und die Spitzen verschwinden, wenn ich meinen Offscreen-Puffer nicht in die Hauptansicht ziehe, kann ich nur den Schluss ziehen, dass Java selbst eine interne Optimierung durchführt. Ich bin mir jedoch nicht sicher, was es bewirkt, und ich weiß auch nicht, welche meiner eigenen Optimierungen ich entfernen müsste, um die Spitzen zu entfernen. Es kann auch sein, dass Java AWT nicht für kontinuierliches Scrollen mit hohen FPS erstellt wurde und dies für diesen Zweck völlig unbrauchbar ist.
Gibt es eine Möglichkeit für mich, diese Spitzen loszuwerden?