[Повторяю этот вопрос из stackoverflow, поскольку было отмечено, что он подходит лучше здесь.]
В настоящее время я портирую свой 2D-движок на Java. Я посмотрел на некоторые из библиотек игр, указанных здесь, на stackoverflow. Однако те, на которые я смотрел, были довольно упрощенными и даже не указывали, поддерживают ли они такие вещи, как альфа-прозрачность, поэтому я решил портировать свой рендерер C ++, для которого я уже выписал логику.
Этот рендерер является чисто программным рендерером, который использует тайлинг, чтобы избежать ненужного повторного рендеринга. Я оптимизировал его производительность прокрутки, создав «внеэкранный буфер», немного больший, чем моя панель вывода, и поместил этот внеэкранный буфер на мой вывод в каждом кадре. Таким образом, я мог бы избежать ненужной перерисовки тайлов только потому, что прокручивал пиксель на карте.
Я использовал AWT Java для его реализации, используя большой BufferedImage для закадрового буфера. Использование процессора в порядке (примерно вдвое больше, чем у меня в C ++), но есть странная проблема с непрерывной прокруткой, когда каждую секунду или около того рендерер задерживается примерно на 0,2 секунды.
Так как в моем собственном коде нет ничего, что могло бы произойти в эти периоды, и, так как пики исчезают, если я не отрисовываю свой внеэкранный буфер на главном экране, я могу только заключить, что Java выполняет некоторую внутреннюю оптимизацию самостоятельно. Однако я не уверен, что он делает, и не знаю, какую из моих собственных оптимизаций мне пришлось бы удалить, чтобы избавиться от пиков. Кроме того, может случиться так, что java AWT не был создан с непрерывной прокруткой с высоким FPS, и это совершенно непригодно для этой цели.
Есть ли какой-то способ избавиться от этих шипов?